

# EC2 インスタンスのインスタンスメタデータにアクセスする
<a name="instancedata-data-retrieval"></a>

EC2 インスタンスメタデータにはインスタンス自体の内部から、または EC2 コンソール、API、SDK、または AWS CLI からアクセスできます。コンソールまたはコマンドラインからインスタンスの現在のインスタンスメタデータ設定を取得するには「[既存インスタンスのインスタンスメタデータオプションのクエリ](#query-IMDS-existing-instances)」を参照してください。

また、EBS ルートボリュームを持つインスタンスのユーザーデータを変更できます。インスタンスは停止状態である必要があります。コンソールの使用説明については「[インスタンスのユーザーデータを更新する](user-data.md#user-data-modify)」を参照してください。AWS CLI を使用する Linux の例については「[modify-instance-attribute](https://docs.aws.amazon.com/cli/latest/reference/ec2/modify-instance-attribute.html)」を参照してください。Tools for Windows PowerShell を使用する Windows の例については「[ユーザーデータと Windows PowerShell用ツール](user-data.md#user-data-powershell)」を参照してください。

**注記**  
インスタンスメタデータおよびユーザーデータの取得に使用する HTTP リクエストに対しては課金されません。

## インスタンスメタデータアクセス考慮事項
<a name="imds-considerations"></a>

インスタンスメタデータの問題を回避するには、次の点を考慮してください。

**IMDSv2 の強制適用によるインスタンス起動の失敗 (`HttpTokensEnforced=enabled`)**  
IMDSv2 の強制適用を有効にする前に、インスタンス上のすべてのソフトウェアが IMDSv2 をサポートするようにする必要があります。その後、デフォルトを変更して IMDSv1 を無効 (`httpTokens=required`) にし、強制適用を有効にすることができます。詳細については、[インスタンスメタデータサービスバージョン 2 の使用への移行](instance-metadata-transition-to-version-2.md) を参照してください。

**コマンド形式**  
コマンド形式はインスタンスメタデータサービスバージョン 1 (IMDSv1) とインスタンスメタデータサービスバージョン 2 (IMDSv2) のどちらを使用するかによって異なります。デフォルトでは両方のバージョンのインスタンスメタデータサービスを使用できます。IMDSv2の使用を義務付けるには[インスタンスメタデータサービスを使用してインスタンスメタデータにアクセスする](configuring-instance-metadata-service.md)を参照してください。

**IMDSv2 が必要な場合はIMDSv1 は動作しません。**  
IMDSv1 を使用していて、応答がない場合はIMDSv2 が必要になる可能性があります。IMDSv2 が必要かどうかを確認するにはインスタンスを選択して詳細を表示します。**[IMDSv2]** の値は**[必須]** (IMDSv2 を使用する必要がある) または **[オプション]** (IMDSv2 または IMDSv1 を使用可能) のいずれかです。

**(IMDSv2) /latest/api/token を使用してトークンを取得する**  
バージョン固有の任意のパス (例: `/2021-03-23/api/token`) に `PUT` リクエストを発行した場合は、メタデータサービスから 403 Forbidden エラーが返されます。この応答は意図されたものです。

**メタデータのバージョン**  
Amazon EC2 が新しいインスタンスメタデータビルドをリリースするたびにコードを更新する必要をなくすために、バージョン番号ではなく、パス内の `latest` を使用することが推奨されます。

**IPv6 サポート**  
IPv6 アドレスを使用してインスタンス メタデータを取得するには、IMDS `[fd00:ec2::254]` の IPv4 アドレスではなく`169.254.169.254`IPv6 アドレスを有効にして使用するようにしてください。インスタンスはIPv6 対応[サブネットで起動された](instance-types.md#instance-hypervisor-type) Nitro ベースの[インスタンスである必要があります](https://docs.aws.amazon.com/vpc/latest/userguide/configure-subnets.html#subnet-ip-address-range)。

**(Windows) Windows Sysprep を使用してカスタム AMI を作成する**  
カスタム Windows AMI からインスタンスを起動したときに IMDS が動作するようにするにはAMI は Sysprep を使用して作成された標準化されたイメージである必要があります。そうでない場合、IMDS は機能しません。詳細については「[Windows Sysprep を使用して Amazon EC2 AMI を作成する](ami-create-win-sysprep.md)」を参照してください。

**コンテナ環境では、再設定またはホップ制限を 2 に引き上げることを検討してください。**  
AWS SDK はデフォルトで IMDSv2 コールを使用します。IMDSv2 呼び出しに応答がない場合、一部の AWS SDK は呼び出しを再試行し、それでも失敗する場合はIMDSv1 を使用します。これにより、特にコンテナ環境では遅延が発生することがあります。IMDSv2 を *必要とする* AWS SDK の場合、コンテナ環境でホップ制限が 1 の場合、コンテナへの移動は追加のネットワーク ホップとみなされ、呼び出しは応答をまったく受け取らない可能性があります。  
コンテナ環境でこれらの問題を軽減するには、設定 (AWS リージョン など) をコンテナに直接渡すように設定を変更するか、ホップ制限を 2 に引き上げることを検討してください。ホップ制限の影響については、「[EC2 Instance Metadata Service の拡張により、オープンファイアウォール、リバースプロキシ、および SSRF の脆弱性に対して多層防御を追加](https://aws.amazon.com/blogs/security/defense-in-depth-open-firewalls-reverse-proxies-ssrf-vulnerabilities-ec2-instance-metadata-service/)」を参照してください。ホップ制限の変更については、「[PUT レスポンスホップリミットを変更する](configuring-IMDS-existing-instances.md#modify-PUT-response-hop-limit)」を参照してください。

**パケット/秒 (PPS) 制限**  
[リンクローカル](using-instance-addressing.md#link-local-addresses)アドレスを使用するサービスには 1,024 パケット/秒 (PPS) の制限があります。この制限には[Route 53 Resolver DNS クエリ](https://docs.aws.amazon.com/vpc/latest/userguide/AmazonDNS-concepts.html#vpc-dns-limits)、インスタンスメタデータサービス (IMDS) リクエスト、[Amazon Time Service Network Time Protocol (NTP)](set-time.md) リクエスト、および [Windows Licensing Service (Microsoft Windows ベースのインスタンス向け)](https://aws.amazon.com/windows/resources/licensing/) リクエストの総計が含まれます。

**ユーザーデータアクセスに関するその他の考慮事項**
+ ユーザーデータは非透過的なデータとして取り扱われ、取得時には指定したものが返されます。ユーザーデータの解釈およびそれに基づくアクションはインスタンス次第です。
+ ユーザーデータはbase64 でエンコードされている必要があります。使用しているツールまたは SDK によっては、base64 エンコードが実行される場合があります。次に例を示します。
  + Amazon EC2コンソールはbase64 エンコードを実行したり、base64 エンコード入力を受け入れたりできます。
  + [AWS CLI バージョン 2](https://docs.aws.amazon.com/cli/latest/userguide/cliv2-migration-changes.html#cliv2-migration-binaryparam) は、ユーザーに対しデフォルトでバイナリパラメータの base64 エンコードを実行します。AWS CLI バージョン 1 は、ユーザーに対し `--user-data` パラメータの base64 エンコードを実行します。
  + AWS SDK for Python (Boto3) は、ユーザーに対し `UserData` パラメータの base64 エンコードを実行します。
+ ユーザーデータは raw 形式の 16 KB に制限されます (以前は base64 エンコード)。base64 エンコード後の 文字列の長さサイズ *n* はceil(*n*/3)\$14 です。
+ ユーザーデータを取得するときにユーザーデータを base64 デコードする必要があります。インスタンスのメタデータあるいはコンソールを使用してデータを取得する場合、自動的にデコードされます。
+ インスタンスを停止してユーザーデータを変更した後に、インスタンスを起動した場合でも、更新されたユーザーデータは自動的には実行されません。Windows インスタンスではインスタンスを起動したとき、またはインスタンスを再起動もしくは起動するたびに、更新されたユーザーデータスクリプトが 1 回実行されるように設定を構成することができます。
+ ユーザーデータはインスタンス属性です。インスタンスから AMI を作成する場合、インスタンスのユーザーデータは AMI に含まれません。

## EC2 インスタンス内からインスタンスメタデータにアクセスする
<a name="instancedata-inside-access"></a>

インスタンスメタデータは実行中のインスタンスから取得できるため、Amazon EC2 コンソールまたは AWS CLI を使用する必要はありません。これはインスタンスから実行するスクリプトを記述しているときに便利です。例えば、インスタンスメタデータからインスタンスのローカル IP アドレスにアクセスして、外部アプリケーションへの接続を管理できます。

以下はすべてインスタンスメタデータと見なされますが、さまざまな方法でアクセスされます。詳細を表示するためにアクセスするインスタンスメタデータのタイプを表すタブを選択してください。

------
#### [ Metadata ]

インスタンスメタデータプロパティはいくつかのカテゴリに分けられます。各インスタンスメタデータカテゴリの説明については[インスタンスメタデータのカテゴリ](ec2-instance-metadata.md#instancedata-data-categories)を参照してください。

実行中のインスタンス内からインスタンスメタデータプロパティにアクセスするには次の IPv4 または IPv6 URI からデータを取得します。これらの IP アドレスはリンクローカルアドレスであり、このインスタンスからのみ有効です。詳細については「[リンクローカルアドレス](using-instance-addressing.md#link-local-addresses)」を参照してください。

**IPv4**

```
http://169.254.169.254/latest/meta-data/
```

**IPv6**

```
http://[fd00:ec2::254]/latest/meta-data/
```

------
#### [ Dynamic data ]

実行中のインスタンス内から動的データを取得するには次の URI のいずれかを使用します。

**IPv4**

```
http://169.254.169.254/latest/dynamic/
```

**IPv6**

```
http://[fd00:ec2::254]/latest/dynamic/
```

**例: cURL を使用したアクセス**  
次の例では`cURL` を使用して高レベルのインスタンスアイデンティティカテゴリを取得します。

*IMDSv2*

```
[ec2-user ~]$ TOKEN=`curl -X PUT "http://169.254.169.254/latest/api/token" -H "X-aws-ec2-metadata-token-ttl-seconds: 21600"` \
&& curl -H "X-aws-ec2-metadata-token: $TOKEN" http://169.254.169.254/latest/dynamic/instance-identity/
rsa2048
pkcs7
document
signature
dsa2048
```

*IMDSv1*

```
[ec2-user ~]$ curl http://169.254.169.254/latest/dynamic/instance-identity/
rsa2048
pkcs7
document
signature
dsa2048
```

**例: PowerShell を使用したアクセス**  
次の例ではPowerShell を使用して高レベルのインスタンスアイデンティティカテゴリを取得します。

*IMDSv2*

```
PS C:\> [string]$token = Invoke-RestMethod -Headers @{"X-aws-ec2-metadata-token-ttl-seconds" = "21600"} -Method PUT -Uri http://169.254.169.254/latest/api/token
```

```
PS C:\> Invoke-RestMethod -Headers @{"X-aws-ec2-metadata-token" = $token} -Method GET -Uri http://169.254.169.254/latest/dynamic/instance-identity/
document
rsa2048
pkcs7
signature
```

*IMDSv1*

```
PS C:\> Invoke-RestMethod -uri http://169.254.169.254/latest/dynamic/instance-identity/
document
rsa2048
pkcs7
signature
```

動的データの詳細およびその取得方法の例については[Amazon EC2 インスタンスのインスタンスアイデンティティドキュメント](instance-identity-documents.md)を参照してください。

------
#### [ User data ]

インスタンスからユーザーデータを取得するには次の URI のいずれかを使用します。IPv6 アドレスを使用してユーザーデータを取得するにはIPv6 アドレスが有効で、インスタンスが IPv6 対応サブネット内の [Nitro ベースのインスタンス](instance-types.md#instance-hypervisor-type)である必要があります。

**IPv4**

```
http://169.254.169.254/latest/user-data
```

**IPv6**

```
http://[fd00:ec2::254]/latest/user-data
```

ユーザーデータのリクエストはデータをそのままの状態で返します (コンテンツタイプ `application/octet-stream`)。インスタンスにユーザーデータがない場合、リクエストは `404 - Not Found` を返します。

**例: cURL を使用してカンマ区切りテキストを取得するアクセス**  
次の例では`cURL` を使用して、カンマ区切りテキストとして指定されたユーザーデータを取得します。

*IMDSv2*

```
TOKEN=`curl -X PUT "http://169.254.169.254/latest/api/token" -H "X-aws-ec2-metadata-token-ttl-seconds: 21600"` \
&& curl -H "X-aws-ec2-metadata-token: $TOKEN" http://169.254.169.254/latest/user-data
1234,john,reboot,true | 4512,richard, | 173,,,
```

*IMDSv1*

```
curl http://169.254.169.254/latest/user-data
1234,john,reboot,true | 4512,richard, | 173,,,
```

**例: PowerShell を使用してカンマ区切りテキストを取得する**  
次の例ではPowerShell を使用して、カンマ区切りテキストとして指定されたユーザーデータを取得します。

*IMDSv2*

```
[string]$token = Invoke-RestMethod -Headers @{"X-aws-ec2-metadata-token-ttl-seconds" = "21600"} -Method PUT -Uri http://169.254.169.254/latest/api/token
```

```
Invoke-RestMethod -Headers @{"X-aws-ec2-metadata-token" = $token} -Method GET -Uri http://169.254.169.254/latest/user-data
1234,john,reboot,true | 4512,richard, | 173,,,
```

*IMDSv1*

```
Invoke-RestMethod -Headers @{"X-aws-ec2-metadata-token" = Invoke-RestMethod -Headers @{"X-aws-ec2-metadata-token-ttl-seconds" = "21600"} `
-Method PUT -Uri http://169.254.169.254/latest/api/token} -Method GET -uri http://169.254.169.254/latest/user-data
1234,john,reboot,true | 4512,richard, | 173,,,
```

**例: スクリプトを取得するための cURL を使用したアクセス**  
次の例では`cURL` を使用して、スクリプトとして指定されたユーザーデータを取得します。

*IMDSv2*

```
TOKEN=`curl -X PUT "http://169.254.169.254/latest/api/token" -H "X-aws-ec2-metadata-token-ttl-seconds: 21600"` \
&& curl -H "X-aws-ec2-metadata-token: $TOKEN" http://169.254.169.254/latest/user-data
#!/bin/bash
yum update -y
service httpd start
chkconfig httpd on
```

*IMDSv1*

```
curl http://169.254.169.254/latest/user-data
#!/bin/bash
yum update -y
service httpd start
chkconfig httpd on
```

**例: スクリプトを取得するための PowerShell を使用したアクセス**  
次の例ではPowerShell を使用して、スクリプトとして指定されたユーザーデータを取得します。

*IMDSv2*

```
[string]$token = Invoke-RestMethod -Headers @{"X-aws-ec2-metadata-token-ttl-seconds" = "21600"} -Method PUT -Uri http://169.254.169.254/latest/api/token
```

```
Invoke-RestMethod -Headers @{"X-aws-ec2-metadata-token" = $token} -Method GET -Uri http://169.254.169.254/latest/user-data
<powershell>
$file = $env:SystemRoot + "\Temp\" + (Get-Date).ToString("MM-dd-yy-hh-mm")
New-Item $file -ItemType file
</powershell>
<persist>true</persist>
```

*IMDSv1*

```
Invoke-RestMethod -uri http://169.254.169.254/latest/user-data
<powershell>
$file = $env:SystemRoot + "\Temp\" + (Get-Date).ToString("MM-dd-yy-hh-mm")
New-Item $file -ItemType file
</powershell>
<persist>true</persist>
```

------

## 既存インスタンスのインスタンスメタデータオプションのクエリ
<a name="query-IMDS-existing-instances"></a>

既存のインスタンスのインスタンスメタデータオプションをクエリできます。

------
#### [ Console ]

**既存のインスタンスのインスタンスメタデータオプションをクエリするには**

1. Amazon EC2 コンソールの [https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/) を開いてください。

1. ナビゲーションペインで、**[Instances]** (インスタンス) を選択してください。

1. インスタンスを選択して次のフィールドを確認します。
   + **[IMDSv2]** – 値は **[必須]** または **[オプション]** のいずれかです。
   + **[インスタンスメタデータのタグを許可]** – 値は **[有効]** または **[無効]** のいずれかです。

1. 選択したインスタンスで、**[アクション]**、**[インスタンスの設定]**、**[インスタンスメタデータのオプションを変更]** の順に選択してください。

   ダイアログボックスには、選択したインスタンスでインスタンスメタデータサービスが有効か無効かが表示されます。

------
#### [ AWS CLI ]

**既存のインスタンスのインスタンスメタデータオプションをクエリするには**  
[describe-instances](https://docs.aws.amazon.com/cli/latest/reference/ec2/describe-instances.html) コマンドを使用します。

```
aws ec2 describe-instances \
    --instance-id i-1234567898abcdef0 \
    --query 'Reservations[].Instances[].MetadataOptions'
```

------
#### [ PowerShell ]

**Tools for PowerShell を使用して既存のインスタンスのインスタンスメタデータオプションをクエリするには**  
[Get-EC2Instance](https://docs.aws.amazon.com/powershell/latest/reference/items/Get-EC2Instance.html) コマンドレットを使用します。

```
(Get-EC2Instance `
    -InstanceId i-1234567898abcdef0).Instances.MetadataOptions
```

------

## リスポンスおよびエラーメッセージ
<a name="instance-metadata-returns"></a>

すべてのインスタンスメタデータがテキスト (HTTP コンテンツタイプ `text/plain`) として返されます。

特定のメタデータリソースに対するリクエストは適切な値または `404 - Not Found` HTTP エラーコード (リソースを使用できない場合) を返します。

一般的なメタデータリソースに対するリクエスト (/ で終わる URI) は使用可能なリソースのリストまたは `404 - Not Found` HTTP エラーコード (使用可能なリソースがない場合) を返します。リスト項目は個別の行に表示され、各行の末尾には改行記号 (ASCII 10) が付いています。

IMDSv1 リクエストが応答を受信しない場合は、IMDSv2 が必要になる可能性があります。

IMDSv2 を使って行われたリクエストでは、次の HTTP エラーコードが返されます。
+ `400 - Missing or Invalid Parameters`–`PUT`リクエストが無効である。
+ `401 - Unauthorized`–`GET`リクエストが無効なトークンを使用している。推奨されるアクションは新しいトークンを生成することです。
+ `403 - Forbidden` - リクエストが許可されていないか、あるいは IMDS がオフです。
+ `404 - Not Found` – リソースが利用できないか、そのようなリソースがありません。
+ `503` - リクエストを完了できませんでした。リクエストを再試行します。

IMDS がエラーを返した場合、 はエラーメッセージを出力に**curl**出力し、成功ステータスコードを返します。エラーメッセージは `TOKEN`変数に保存され、トークンを使用する**curl**コマンドは失敗します。**-f** オプション**curl**を指定して を呼び出すと、HTTP サーバーエラーが発生した場合にエラーステータスコードが返されます。エラー処理を有効にすると、シェルはエラーを検出してスクリプトを停止できます。

## クエリスロットル
<a name="instancedata-throttling"></a>

クエリは IMDS でインスタンスごとにスロットリングし、インスタンスから IMDS への同時接続数を制限します。

AWS セキュリティ認証情報を取得するために IMDS を使用している場合、毎回のトランザクションで、または高頻度のスレッドやプロセスから同時に認証情報をクエリしないようにします。スロットリングの原因となる可能性があります。代わりに、認証情報をキャッシュに格納して有効期限が近づくまで待つことをお勧めします。IAM ロールとロールに関連付けられたセキュリティ認証情報の詳細については「[インスタンスメタデータからのセキュリティ認証情報の取得](instance-metadata-security-credentials.md)」を参照してください。

IMDS にアクセスする際にスロットリングした場合、エクスポネンシャルバックオフ戦略でクエリを再試行します。

# インスタンスメタデータサービスを使用してインスタンスメタデータにアクセスする
<a name="configuring-instance-metadata-service"></a>

次のいずれかのメソッドを使って、実行中のインスタンスからインスタンスメタデータにアクセスできます。
+ インスタンスメタデータサービスバージョン 2 (IMDSv2) – セッション指向メソッド

  例については「[IMDSv2 の例](#instance-metadata-retrieval-examples)」を参照してください。
+ インスタンスメタデータサービスバージョン 1 (IMDSv1) – リクエスト/レスポンスメソッド

  例については「[IMDSv1 の例](#instance-metadata-retrieval-examples-imdsv1)」を参照してください。

デフォルトではIMDSv1またはIMDSv2のいずれか、あるいは両方を使用できます。

IMDSv2 呼び出しのみを受け入れるように各インスタンスでインスタンスメタデータサービス (IMDS) を設定できます。これにより、IMDSv1 呼び出しが失敗します。ユーザーに IMDSv2 を使用させるようにインスタンスを設定する方法については「[インスタンスメタデータサービスのオプションを設定する](configuring-instance-metadata-options.md)」を参照してください。

`PUT` または `GET` ヘッダーは IMDSv2 に固有のものです。これらのヘッダーがリクエストに含まれている場合、そのリクエストは IMDSv2 を対象としています。ヘッダーが存在しない場合、そのリクエストは IMDSv1 を対象としているものとみなされます。

IMDSv2 の拡張のレビューの詳細については「[EC2 Instance Metadata Service の拡張により、オープンファイアウォール、リバースプロキシ、および SSRF の脆弱性に対して多層防御を追加](https://aws.amazon.com/blogs/security/defense-in-depth-open-firewalls-reverse-proxies-ssrf-vulnerabilities-ec2-instance-metadata-service/)」を参照してください。

**Topics**
+ [インスタンスメタデータサービスバージョン 2 の仕組み](#instance-metadata-v2-how-it-works)
+ [サポートされる AWS SDK を使用する](#use-a-supported-sdk-version-for-imdsv2)
+ [IMDSv2 の例](#instance-metadata-retrieval-examples)
+ [IMDSv1 の例](#instance-metadata-retrieval-examples-imdsv1)

## インスタンスメタデータサービスバージョン 2 の仕組み
<a name="instance-metadata-v2-how-it-works"></a>

IMDSv2 はセッション指向リクエストを使用します。セッション指向リクエストを使用して、セッション期間 (1 秒～6 時間) を定義するセッショントークンを作成します。指定した期間中、それ以降のリクエストに同じセッショントークンを使用できます。指定した期間が期限切れになった後、将来のリクエストに使用する新しいセッショントークンを作成する必要があります。

**注記**  
このセクションの例ではインスタンスメタデータサービス (IMDS) の IPv4 アドレス `169.254.169.254` を使用します。IPv6 アドレスを使用して EC2 インスタンスのインスタンスメタデータを取得する場合はIPv6 アドレスを有効にして使用してください。`[fd00:ec2::254]`。IMDS の IPv6 アドレスはIMDSv2 コマンドと互換性があります。IPv6 アドレスには[Nitro ベースのインスタンス](instance-types.md#instance-hypervisor-type)と [IPv6 対応サブネット](https://docs.aws.amazon.com/vpc/latest/userguide/configure-subnets.html#subnet-ip-address-range) (デュアルスタックまたは IPv6 のみ) でのみアクセスできます。

次の例ではシェルスクリプトと IMDSv2 を使用して、最上位インスタンスメタデータ項目を取得します。各例の操作は次のとおりです。
+ `PUT`リクエストを使って、6 時間 (21,600 秒) のセッショントークンを作成する
+ セッショントークンヘッダーを `TOKEN` (Linux インスタンス) または `token` (Windows インスタンス) という名前の変数に保管する
+ トークンを使って最上位メタデータアイテムをリクエストする

### Linux の例
<a name="how-imdsv2-works-example-linux"></a>

2 つの個別のコマンドを実行することも、それらを組み合わせることもできます。

**個別のコマンド**

最初に、次のコマンドを使用してトークンを生成します。

```
[ec2-user ~]$ TOKEN=`curl -X PUT "http://169.254.169.254/latest/api/token" -H "X-aws-ec2-metadata-token-ttl-seconds: 21600"`
```

その後、次のコマンドを使用して、トークンを使用して上位レベルのメタデータアイテムを生成します。

```
[ec2-user ~]$ curl -H "X-aws-ec2-metadata-token: $TOKEN" http://169.254.169.254/latest/meta-data/
```

**組み合わされたコマンド**

トークンを保存し、コマンドを組み合わせることができます。次の例では上記の 2 つのコマンドを組み合わせて、セッショントークンヘッダーを TOKEN という名前の変数に格納します。

**注記**  
トークンの作成時にエラーが発生した場合は有効なトークンの代わりにエラーメッセージが変数に格納され、コマンドは機能しません。

```
[ec2-user ~]$ TOKEN=`curl -X PUT "http://169.254.169.254/latest/api/token" -H "X-aws-ec2-metadata-token-ttl-seconds: 21600"` \
	&& curl -H "X-aws-ec2-metadata-token: $TOKEN" http://169.254.169.254/latest/meta-data/
```

トークンを作成した後、期限切れになるまで再使用することができます。次のコマンド例ではインスタンスの起動に AMI の ID が使用されていますが、前の例で `$TOKEN`に保管されたトークンが再使用されています。

```
[ec2-user ~]$ curl -H "X-aws-ec2-metadata-token: $TOKEN" http://169.254.169.254/latest/meta-data/ami-id
```

### Windows の例
<a name="how-imdsv2-works-example-windows"></a>

```
PS C:\> [string]$token = Invoke-RestMethod -Headers @{"X-aws-ec2-metadata-token-ttl-seconds" = "21600"} -Method PUT -Uri http://169.254.169.254/latest/api/token
```

```
PS C:\> Invoke-RestMethod -Headers @{"X-aws-ec2-metadata-token" = $token} -Method GET -Uri http://169.254.169.254/latest/meta-data/
```

トークンを作成した後、期限切れになるまで再使用することができます。次のコマンド例ではインスタンスの起動に AMI の ID が使用されていますが、前の例で `$token`に保管されたトークンが再使用されています。

```
PS C:\> Invoke-RestMethod -Headers @{"X-aws-ec2-metadata-token" = $token} `
	-Method GET -uri http://169.254.169.254/latest/meta-data/ami-id
```

IMDSv2を使ってインスタンスメタデータをリクエストする際はリクエストに次の項目が含まれている必要があります。

1. `PUT` リクエストを使って、インスタンスメタデータサービスに対してセッションを開始します。`PUT` リクエストはインスタンスメタデータサービスに対する後続の `GET` リクエストに含まれている必要のあるトークンを返します。このトークンはIMDSv2を使ってメタデータにアクセスするのに必要です。

1. トークンを IMDS に対するすべての `GET` リクエストに含めます。トークンの使用が `required` に設定されている場合、有効なトークンがないリクエスト、または有効期限切れのトークンを持つリクエストで `401 - Unauthorized` HTTP エラーコードが発生します。
   + トークンはインスタンス固有のキーです。トークンは他の EC2 インスタンスで有効ではなく、生成されたインスタンスの外で使用しようとすると拒否されます。
   + `PUT`リクエストにはトークンの有効期限 (TTL) を最大 6 時間 (21,600 秒) まで秒単位で指定するヘッダーが含まれている必要があります。トークンは論理的セッションを表します。TTL はトークンが有効な時間の長さ、つまりセッションの期間を指定します。
   + トークンの期限が切れた後、インスタンスメタデータにアクセスし続けるためには別の `PUT`を使って新しいセッションを作成する必要があります。
   + 各リクエストについてトークンを再使用するか、あるいは新しいトークンを作成することを選択できます。少数のリクエストではIMDS にアクセスする必要があるたびに、トークンを生成してすぐに使用するほうが簡単である場合があります。ただし、効率を重視するなら、インスタンスメタデータをリクエストする必要があるたびに`PUT`リクエストを書くより、トークン期間を長く指定して再使用することができます。それぞれが独自のセッションを表すトークンを同時に使用できる数については実際的に制限がありません。ただし、IMDSv2 では通常の IMDS 接続とスロットリングの制限によって制約を受けます。詳細については「[クエリスロットル](instancedata-data-retrieval.md#instancedata-throttling)」を参照してください。

HTTP `GET`および`HEAD`メソッドはIMDSv2インスタンスメタデータリクエストで許可されています。 `PUT` リクエストはX-Forwarded-For ヘッダーが含まれている場合、拒否されます。

デフォルトで、`PUT` リクエストに対するレスポンスには IP プロトコルレベルで `1` のレスポンスホップリミット (有効期限) があります。より大きなホップリミットが必要な場合は[modify-instance-metadata-options](https://docs.aws.amazon.com/cli/latest/reference/ec2/modify-instance-metadata-options.html) AWS CLI コマンドを使って調整できます。例えば、インスタンスで実行されているコンテナサービスとの下位互換性のために、ホップリミットを拡大する必要がある場合があります。詳細については「[既存インスタンスのインスタンスメタデータオプションの変更](configuring-IMDS-existing-instances.md)」を参照してください。

## サポートされる AWS SDK を使用する
<a name="use-a-supported-sdk-version-for-imdsv2"></a>

IMDSv2 を使用するにはEC2 インスタンスが IMDSv2 の使用をサポートする AWS SDK バージョンを使用する必要があります。最新バージョンの AWS SDK はすべて IMDSv2 の使用をサポートしています。

**重要**  
最新の機能、セキュリティアップデート、および基本的な依存関係を維持するために、SDK のリリースを常に更新することをお勧めします。サポート対象外の SDK バージョンを継続して使用することはお勧めできません。お客様の判断で行ってください。詳細については*AWS SDK とツ*ールのリファレンスガイド」の「[AWS SDK とツールのメンテナンスポリシー](https://docs.aws.amazon.com/sdkref/latest/guide/maint-policy.html)」を参照してください。

IMDSv2 の使用をサポートする最小バージョンは次のとおりです。
+ [AWS CLI](https://github.com/aws/aws-cli) – 1.16.289
+ [AWS Tools for Windows PowerShell](https://github.com/aws/aws-tools-for-powershell) – 4.0.1.0
+ [AWS SDK for .NET](https://github.com/aws/aws-sdk-net) – 3.3.634.1
+ [AWS SDK for C\$1\$1](https://github.com/aws/aws-sdk-cpp) – 1.7.229
+ [AWS SDK for Go](https://github.com/aws/aws-sdk-go) – 1.25.38
+ [AWS SDK for Go v2](https://github.com/aws/aws-sdk-go-v2) – 0.19.0
+ [AWS SDK for Java](https://github.com/aws/aws-sdk-java) – 1.11.678
+ [AWS SDK for Java 2.x](https://github.com/aws/aws-sdk-java-v2) – 2.10.21
+ [AWS Node.js 内の SDK for JavaScript](https://github.com/aws/aws-sdk-js) – 2.722.0
+ [AWS SDK for Kotlin](https://github.com/awslabs/aws-sdk-kotlin) – 1.1.4
+ [AWS SDK for PHP](https://github.com/aws/aws-sdk-php) – 3.147.7
+ [AWS SDK for Python (Botocore)](https://github.com/boto/botocore) – 1.13.25
+ [AWS SDK for Python (Boto3)](https://github.com/boto/boto3) – 1.12.6
+ [AWS SDK for Ruby](https://github.com/aws/aws-sdk-ruby) – 3.79.0

## IMDSv2 の例
<a name="instance-metadata-retrieval-examples"></a>

Amazon EC2 インスタンスで次の例を実行して、IMDSv2 のインスタンスメタデータを取得します。

Windows インスタンスでは、Windows PowerShell を使用するか、cURL または wget をインストールすることができます。Windows インスタンスにサードパーティーツールをインストールする場合は、呼び出しおよび出力がここに記載されているものとは異なる場合があるため、必ず付属のドキュメントをよく読んでください。

**Topics**
+ [使用できるインスタンスメタデータのバージョンを取得する](#instance-metadata-ex-1)
+ [上位レベルのメタデータ項目を取得する](#instance-metadata-ex-2)
+ [メタデータ項目の値を取得する](#instance-metadata-ex-2a)
+ [使用可能なパブリックキーのリストを取得する](#instance-metadata-ex-3)
+ [パブリックキー 0 が使用できるフォーマットを示す](#instance-metadata-ex-4)
+ [パブリックキー 0 を取得する (OpenSSH キーフォーマット)](#instance-metadata-ex-5)
+ [インスタンスのサブネット ID を取得する](#instance-metadata-ex-6)
+ [インスタンスのインスタンスタグを取得する](#instance-metadata-ex-7)

### 使用できるインスタンスメタデータのバージョンを取得する
<a name="instance-metadata-ex-1"></a>

次の例では使用できるインスタンスメタデータのバージョンを取得しています。各バージョンは新しいインスタンスのメタデータカテゴリがリリースされたときのインスタンスメタデータビルドを参照してください。インスタンスメタデータビルドのバージョンはAmazon EC2 API のバージョンとは相関しません。以前のバージョンに存在する構造および情報に依存するスクリプトがある場合は以前のバージョンを使用することができます。

------
#### [ cURL ]

```
[ec2-user ~]$ TOKEN=`curl -X PUT "http://169.254.169.254/latest/api/token" -H "X-aws-ec2-metadata-token-ttl-seconds: 21600"` \
&& curl -H "X-aws-ec2-metadata-token: $TOKEN" http://169.254.169.254/
1.0
2007-01-19
2007-03-01
2007-08-29
2007-10-10
2007-12-15
2008-02-01
2008-09-01
2009-04-04
2011-01-01
2011-05-01
2012-01-12
2014-02-25
2014-11-05
2015-10-20
2016-04-19
...
latest
```

------
#### [ PowerShell ]

```
PS C:\> [string]$token = Invoke-RestMethod -Headers @{"X-aws-ec2-metadata-token-ttl-seconds" = "21600"} -Method PUT -Uri http://169.254.169.254/latest/api/token
```

```
PS C:\> Invoke-RestMethod -Headers @{"X-aws-ec2-metadata-token" = $token} -Method GET -Uri http://169.254.169.254/
1.0
2007-01-19
2007-03-01
2007-08-29
2007-10-10
2007-12-15
2008-02-01
2008-09-01
2009-04-04
2011-01-01
2011-05-01
2012-01-12
2014-02-25
2014-11-05
2015-10-20
2016-04-19
...
latest
```

------

### 上位レベルのメタデータ項目を取得する
<a name="instance-metadata-ex-2"></a>

次の例では上位レベルのメタデータ項目を取得しています。レスポンスの項目の詳細については「[インスタンスメタデータのカテゴリ](ec2-instance-metadata.md#instancedata-data-categories)」を参照してください。

アクセスを許可した場合にのみ、タグがこの出力に含まれることに注意してください。詳細については「[インスタンスメタデータ内のタグへのアクセスを有効にする](work-with-tags-in-IMDS.md#allow-access-to-tags-in-IMDS)」を参照してください。

------
#### [ cURL ]

```
[ec2-user ~]$ TOKEN=`curl -X PUT "http://169.254.169.254/latest/api/token" -H "X-aws-ec2-metadata-token-ttl-seconds: 21600"` \
&& curl -H "X-aws-ec2-metadata-token: $TOKEN" http://169.254.169.254/latest/meta-data/    
ami-id
ami-launch-index
ami-manifest-path
block-device-mapping/
events/
hostname
iam/
instance-action
instance-id
instance-life-cycle
instance-type
local-hostname
local-ipv4
mac
metrics/
network/
placement/
profile
public-hostname
public-ipv4
public-keys/
reservation-id
security-groups
services/
tags/
```

------
#### [ PowerShell ]

```
PS C:\> [string]$token = Invoke-RestMethod -Headers @{"X-aws-ec2-metadata-token-ttl-seconds" = "21600"} -Method PUT -Uri http://169.254.169.254/latest/api/token
```

```
PS C:\> Invoke-RestMethod -Headers @{"X-aws-ec2-metadata-token" = $token} -Method GET -Uri http://169.254.169.254/latest/meta-data/
ami-id
ami-launch-index
ami-manifest-path
block-device-mapping/
hostname
iam/
instance-action
instance-id
instance-life-cycle
instance-type
local-hostname
local-ipv4
mac
metrics/
network/
placement/
profile
public-hostname
public-ipv4
public-keys/
reservation-id
security-groups
services/
tags/
```

------

### メタデータ項目の値を取得する
<a name="instance-metadata-ex-2a"></a>

これらの例では前出の例で取得された一部の最上位メタデータ項目の値を取得しています。これらのリクエストは、前の例のコマンドを使用して作成された保管されているトークンを使用します。このトークンは有効期限が切れていない必要があります。

------
#### [ cURL ]

```
[ec2-user ~]$ curl -H "X-aws-ec2-metadata-token: $TOKEN" http://169.254.169.254/latest/meta-data/ami-id
ami-0abcdef1234567890
```

```
[ec2-user ~]$ curl -H "X-aws-ec2-metadata-token: $TOKEN" http://169.254.169.254/latest/meta-data/reservation-id
r-0efghijk987654321
```

```
[ec2-user ~]$ curl -H "X-aws-ec2-metadata-token: $TOKEN" http://169.254.169.254/latest/meta-data/local-hostname
ip-10-251-50-12.ec2.internal
```

```
[ec2-user ~]$ curl -H "X-aws-ec2-metadata-token: $TOKEN" http://169.254.169.254/latest/meta-data/public-hostname
ec2-203-0-113-25.compute-1.amazonaws.com
```

------
#### [ PowerShell ]

```
PS C:\> Invoke-RestMethod -Headers @{"X-aws-ec2-metadata-token" = $token} -Method GET -Uri http://169.254.169.254/latest/meta-data/ami-id
ami-0abcdef1234567890
```

```
PS C:\> Invoke-RestMethod -Headers @{"X-aws-ec2-metadata-token" = $token} -Method GET -Uri http://169.254.169.254/latest/meta-data/reservation-id
r-0efghijk987654321
```

```
PS C:\> Invoke-RestMethod -Headers @{"X-aws-ec2-metadata-token" = $token} -Method GET -Uri http://169.254.169.254/latest/meta-data/local-hostname
ip-10-251-50-12.ec2.internal
```

```
PS C:\> Invoke-RestMethod -Headers @{"X-aws-ec2-metadata-token" = $token} -Method GET -Uri http://169.254.169.254/latest/meta-data/public-hostname
ec2-203-0-113-25.compute-1.amazonaws.com
```

------

### 使用可能なパブリックキーのリストを取得する
<a name="instance-metadata-ex-3"></a>

次の例では使用できるパブリックキーの一覧を取得しています。

------
#### [ cURL ]

```
[ec2-user ~]$ TOKEN=`curl -X PUT "http://169.254.169.254/latest/api/token" -H "X-aws-ec2-metadata-token-ttl-seconds: 21600"` \
&& curl -H "X-aws-ec2-metadata-token: $TOKEN" http://169.254.169.254/latest/meta-data/public-keys/
0=my-public-key
```

------
#### [ PowerShell ]

```
PS C:\> [string]$token = Invoke-RestMethod -Headers @{"X-aws-ec2-metadata-token-ttl-seconds" = "21600"} -Method PUT -Uri http://169.254.169.254/latest/api/token
```

```
PS C:\> Invoke-RestMethod -Headers @{"X-aws-ec2-metadata-token" = $token} -Method GET -Uri http://169.254.169.254/latest/meta-data/public-keys/
0=my-public-key
```

------

### パブリックキー 0 が使用できるフォーマットを示す
<a name="instance-metadata-ex-4"></a>

次の例はパブリックキー0のフォーマットを示しています。

------
#### [ cURL ]

```
[ec2-user ~]$ TOKEN=`curl -X PUT "http://169.254.169.254/latest/api/token" -H "X-aws-ec2-metadata-token-ttl-seconds: 21600"` \
&& curl -H "X-aws-ec2-metadata-token: $TOKEN" http://169.254.169.254/latest/meta-data/public-keys/0/
openssh-key
```

------
#### [ PowerShell ]

```
PS C:\> [string]$token = Invoke-RestMethod -Headers @{"X-aws-ec2-metadata-token-ttl-seconds" = "21600"} -Method PUT -Uri http://169.254.169.254/latest/api/token
```

```
PS C:\> Invoke-RestMethod -Headers @{"X-aws-ec2-metadata-token" = $token} -Method GET -Uri http://169.254.169.254/latest/meta-data/public-keys/0/openssh-key
openssh-key
```

------

### パブリックキー 0 を取得する (OpenSSH キーフォーマット)
<a name="instance-metadata-ex-5"></a>

次の例ではパブリックキー0を取得しています (OpenSSH キーフォーマット)。

------
#### [ cURL ]

```
[ec2-user ~]$ TOKEN=`curl -X PUT "http://169.254.169.254/latest/api/token" -H "X-aws-ec2-metadata-token-ttl-seconds: 21600"` \
&& curl -H "X-aws-ec2-metadata-token: $TOKEN" http://169.254.169.254/latest/meta-data/public-keys/0/openssh-key
ssh-rsa MIICiTCCAfICCQD6m7oRw0uXOjANBgkqhkiG9w0BAQUFADCBiDELMAkGA1UEBhMC
VVMxCzAJBgNVBAgTAldBMRAwDgYDVQQHEwdTZWF0dGxlMQ8wDQYDVQQKEwZBbWF6
b24xFDASBgNVBAsTC0lBTSBDb25zb2xlMRIwEAYDVQQDEwlUZXN0Q2lsYWMxHzAd
BgkqhkiG9w0BCQEWEG5vb25lQGFtYXpvbi5jb20wHhcNMTEwNDI1MjA0NTIxWhcN
MTIwNDI0MjA0NTIxWjCBiDELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAldBMRAwDgYD
VQQHEwdTZWF0dGxlMQ8wDQYDVQQKEwZBbWF6b24xFDASBgNVBAsTC0lBTSBDb25z
b2xlMRIwEAYDVQQDEwlUZXN0Q2lsYWMxHzAdBgkqhkiG9w0BCQEWEG5vb25lQGFt
YXpvbi5jb20wgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAMaK0dn+a4GmWIWJ
21uUSfwfEvySWtC2XADZ4nB+BLYgVIk60CpiwsZ3G93vUEIO3IyNoH/f0wYK8m9T
rDHudUZg3qX4waLG5M43q7Wgc/MbQITxOUSQv7c7ugFFDzQGBzZswY6786m86gpE
Ibb3OhjZnzcvQAaRHhdlQWIMm2nrAgMBAAEwDQYJKoZIhvcNAQEFBQADgYEAtCu4
nUhVVxYUntneD9+h8Mg9q6q+auNKyExzyLwaxlAoo7TJHidbtS4J5iNmZgXL0Fkb
FFBjvSfpJIlJ00zbhNYS5f6GuoEDmFJl0ZxBHjJnyp378OD8uTs7fLvjx79LjSTb
NYiytVbZPQUQ5Yaxu2jXnimvw3rrszlaEXAMPLE my-public-key
```

------
#### [ PowerShell ]

```
PS C:\> [string]$token = Invoke-RestMethod -Headers @{"X-aws-ec2-metadata-token-ttl-seconds" = "21600"} -Method PUT -Uri http://169.254.169.254/latest/api/token
```

```
PS C:\> Invoke-RestMethod -Headers @{"X-aws-ec2-metadata-token" = $token} -Method GET -Uri http://169.254.169.254/latest/meta-data/public-keys/0/openssh-key
ssh-rsa MIICiTCCAfICCQD6m7oRw0uXOjANBgkqhkiG9w0BAQUFADCBiDELMAkGA1UEBhMC
VVMxCzAJBgNVBAgTAldBMRAwDgYDVQQHEwdTZWF0dGxlMQ8wDQYDVQQKEwZBbWF6
b24xFDASBgNVBAsTC0lBTSBDb25zb2xlMRIwEAYDVQQDEwlUZXN0Q2lsYWMxHzAd
BgkqhkiG9w0BCQEWEG5vb25lQGFtYXpvbi5jb20wHhcNMTEwNDI1MjA0NTIxWhcN
MTIwNDI0MjA0NTIxWjCBiDELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAldBMRAwDgYD
VQQHEwdTZWF0dGxlMQ8wDQYDVQQKEwZBbWF6b24xFDASBgNVBAsTC0lBTSBDb25z
b2xlMRIwEAYDVQQDEwlUZXN0Q2lsYWMxHzAdBgkqhkiG9w0BCQEWEG5vb25lQGFt
YXpvbi5jb20wgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAMaK0dn+a4GmWIWJ
21uUSfwfEvySWtC2XADZ4nB+BLYgVIk60CpiwsZ3G93vUEIO3IyNoH/f0wYK8m9T
rDHudUZg3qX4waLG5M43q7Wgc/MbQITxOUSQv7c7ugFFDzQGBzZswY6786m86gpE
Ibb3OhjZnzcvQAaRHhdlQWIMm2nrAgMBAAEwDQYJKoZIhvcNAQEFBQADgYEAtCu4
nUhVVxYUntneD9+h8Mg9q6q+auNKyExzyLwaxlAoo7TJHidbtS4J5iNmZgXL0Fkb
FFBjvSfpJIlJ00zbhNYS5f6GuoEDmFJl0ZxBHjJnyp378OD8uTs7fLvjx79LjSTb
NYiytVbZPQUQ5Yaxu2jXnimvw3rrszlaEXAMPLE my-public-key
```

------

### インスタンスのサブネット ID を取得する
<a name="instance-metadata-ex-6"></a>

次の例ではインスタンスのサブネット ID を取得しています。

------
#### [ cURL ]

```
[ec2-user ~]$ TOKEN=`curl -X PUT "http://169.254.169.254/latest/api/token" -H "X-aws-ec2-metadata-token-ttl-seconds: 21600"` \
&& curl -H "X-aws-ec2-metadata-token: $TOKEN" http://169.254.169.254/latest/meta-data/network/interfaces/macs/02:29:96:8f:6a:2d/subnet-id
subnet-be9b61d7
```

------
#### [ PowerShell ]

```
PS C:\> [string]$token = Invoke-RestMethod -Headers @{"X-aws-ec2-metadata-token-ttl-seconds" = "21600"} -Method PUT -Uri http://169.254.169.254/latest/api/token
```

```
PS C:\> Invoke-RestMethod -Headers @{"X-aws-ec2-metadata-token" = $token} -Method GET -Uri http://169.254.169.254/latest/meta-data/network/interfaces/macs/02:29:96:8f:6a:2d/subnet-id
subnet-be9b61d7
```

------

### インスタンスのインスタンスタグを取得する
<a name="instance-metadata-ex-7"></a>

インスタンスメタデータ内のインスタンスタグへのアクセスが有効になっている場合はインスタンスメタデータからインスタンスのタグを取得できます。詳細については「[インスタンスメタデータからタグを取得する](work-with-tags-in-IMDS.md#retrieve-tags-from-IMDS)」を参照してください。

## IMDSv1 の例
<a name="instance-metadata-retrieval-examples-imdsv1"></a>

Amazon EC2 インスタンスで次の例を実行して、IMDSv1 のインスタンスメタデータを取得します。

Windows インスタンスでは、Windows PowerShell を使用するか、cURL または wget をインストールすることができます。Windows インスタンスにサードパーティーツールをインストールする場合は、呼び出しおよび出力がここに記載されているものとは異なる場合があるため、必ず付属のドキュメントをよく読んでください。

**Topics**
+ [使用できるインスタンスメタデータのバージョンを取得する](#instance-metadata-ex-1-imdsv1)
+ [上位レベルのメタデータ項目を取得する](#instance-metadata-ex-2-imdsv1)
+ [メタデータ項目の値を取得する](#instance-metadata-ex-2a-imdsv1)
+ [使用可能なパブリックキーのリストを取得する](#instance-metadata-ex-3-imdsv1)
+ [パブリックキー 0 が使用できるフォーマットを示す](#instance-metadata-ex-4-imdsv1)
+ [パブリックキー 0 を取得する (OpenSSH キーフォーマット)](#instance-metadata-ex-5-imdsv1)
+ [インスタンスのサブネット ID を取得する](#instance-metadata-ex-6-imdsv1)
+ [インスタンスのインスタンスタグを取得する](#instance-metadata-ex-7-imdsv1)

### 使用できるインスタンスメタデータのバージョンを取得する
<a name="instance-metadata-ex-1-imdsv1"></a>

次の例では使用できるインスタンスメタデータのバージョンを取得しています。各バージョンは新しいインスタンスのメタデータカテゴリがリリースされたときのインスタンスメタデータビルドを参照してください。インスタンスメタデータビルドのバージョンはAmazon EC2 API のバージョンとは相関しません。以前のバージョンに存在する構造および情報に依存するスクリプトがある場合は以前のバージョンを使用することができます。

------
#### [ cURL ]

```
[ec2-user ~]$ curl http://169.254.169.254/
1.0
2007-01-19
2007-03-01
2007-08-29
2007-10-10
2007-12-15
2008-02-01
2008-09-01
2009-04-04
2011-01-01
2011-05-01
2012-01-12
2014-02-25
2014-11-05
2015-10-20
2016-04-19
...
latest
```

------
#### [ PowerShell ]

```
PS C:\> Invoke-RestMethod -uri http://169.254.169.254/
1.0
2007-01-19
2007-03-01
2007-08-29
2007-10-10
2007-12-15
2008-02-01
2008-09-01
2009-04-04
2011-01-01
2011-05-01
2012-01-12
2014-02-25
2014-11-05
2015-10-20
2016-04-19
...
latest
```

------

### 上位レベルのメタデータ項目を取得する
<a name="instance-metadata-ex-2-imdsv1"></a>

次の例では上位レベルのメタデータ項目を取得しています。レスポンスの項目の詳細については「[インスタンスメタデータのカテゴリ](ec2-instance-metadata.md#instancedata-data-categories)」を参照してください。

アクセスを許可した場合にのみ、タグがこの出力に含まれることに注意してください。詳細については「[インスタンスメタデータ内のタグへのアクセスを有効にする](work-with-tags-in-IMDS.md#allow-access-to-tags-in-IMDS)」を参照してください。

------
#### [ cURL ]

```
[ec2-user ~]$ curl http://169.254.169.254/latest/meta-data/    
ami-id
ami-launch-index
ami-manifest-path
block-device-mapping/
events/
hostname
iam/
instance-action
instance-id
instance-type
local-hostname
local-ipv4
mac
metrics/
network/
placement/
profile
public-hostname
public-ipv4
public-keys/
reservation-id
security-groups
services/
tags/
```

------
#### [ PowerShell ]

```
PS C:\> Invoke-RestMethod -uri http://169.254.169.254/latest/meta-data/    
ami-id
ami-launch-index
ami-manifest-path
block-device-mapping/
hostname
iam/
instance-action
instance-id
instance-type
local-hostname
local-ipv4
mac
metrics/
network/
placement/
profile
public-hostname
public-ipv4
public-keys/
reservation-id
security-groups
services/
tags/
```

------

### メタデータ項目の値を取得する
<a name="instance-metadata-ex-2a-imdsv1"></a>

これらの例では、前の例で取得した一部の最上位メタデータ項目の値を取得しています。

------
#### [ cURL ]

```
[ec2-user ~]$ curl http://169.254.169.254/latest/meta-data/ami-id
ami-0abcdef1234567890
```

```
[ec2-user ~]$ curl http://169.254.169.254/latest/meta-data/reservation-id
r-0efghijk987654321
```

```
[ec2-user ~]$ curl http://169.254.169.254/latest/meta-data/local-hostname
ip-10-251-50-12.ec2.internal
```

```
[ec2-user ~]$ curl http://169.254.169.254/latest/meta-data/public-hostname
ec2-203-0-113-25.compute-1.amazonaws.com
```

------
#### [ PowerShell ]

```
PS C:\> Invoke-RestMethod -uri http://169.254.169.254/latest/meta-data/ami-id
ami-0abcdef1234567890
```

```
PS C:\> Invoke-RestMethod -uri http://169.254.169.254/latest/meta-data/reservation-id
r-0efghijk987654321
```

```
PS C:\> Invoke-RestMethod -uri http://169.254.169.254/latest/meta-data/local-hostname
ip-10-251-50-12.ec2.internal
```

```
PS C:\> Invoke-RestMethod -uri http://169.254.169.254/latest/meta-data/public-hostname
ec2-203-0-113-25.compute-1.amazonaws.com
```

------

### 使用可能なパブリックキーのリストを取得する
<a name="instance-metadata-ex-3-imdsv1"></a>

次の例では使用できるパブリックキーの一覧を取得しています。

------
#### [ cURL ]

```
[ec2-user ~]$ curl http://169.254.169.254/latest/meta-data/public-keys/
0=my-public-key
```

------
#### [ PowerShell ]

```
PS C:\> Invoke-RestMethod -uri http://169.254.169.254/latest/meta-data/public-keys/ 0=my-public-key
```

------

### パブリックキー 0 が使用できるフォーマットを示す
<a name="instance-metadata-ex-4-imdsv1"></a>

次の例はパブリックキー0のフォーマットを示しています。

------
#### [ cURL ]

```
[ec2-user ~]$ curl http://169.254.169.254/latest/meta-data/public-keys/0/
openssh-key
```

------
#### [ PowerShell ]

```
PS C:\> Invoke-RestMethod -uri http://169.254.169.254/latest/meta-data/public-keys/0/openssh-key
openssh-key
```

------

### パブリックキー 0 を取得する (OpenSSH キーフォーマット)
<a name="instance-metadata-ex-5-imdsv1"></a>

次の例ではパブリックキー0を取得しています (OpenSSH キーフォーマット)。

------
#### [ cURL ]

```
[ec2-user ~]$ curl http://169.254.169.254/latest/meta-data/public-keys/0/openssh-key
ssh-rsa MIICiTCCAfICCQD6m7oRw0uXOjANBgkqhkiG9w0BAQUFADCBiDELMAkGA1UEBhMC
VVMxCzAJBgNVBAgTAldBMRAwDgYDVQQHEwdTZWF0dGxlMQ8wDQYDVQQKEwZBbWF6
b24xFDASBgNVBAsTC0lBTSBDb25zb2xlMRIwEAYDVQQDEwlUZXN0Q2lsYWMxHzAd
BgkqhkiG9w0BCQEWEG5vb25lQGFtYXpvbi5jb20wHhcNMTEwNDI1MjA0NTIxWhcN
MTIwNDI0MjA0NTIxWjCBiDELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAldBMRAwDgYD
VQQHEwdTZWF0dGxlMQ8wDQYDVQQKEwZBbWF6b24xFDASBgNVBAsTC0lBTSBDb25z
b2xlMRIwEAYDVQQDEwlUZXN0Q2lsYWMxHzAdBgkqhkiG9w0BCQEWEG5vb25lQGFt
YXpvbi5jb20wgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAMaK0dn+a4GmWIWJ
21uUSfwfEvySWtC2XADZ4nB+BLYgVIk60CpiwsZ3G93vUEIO3IyNoH/f0wYK8m9T
rDHudUZg3qX4waLG5M43q7Wgc/MbQITxOUSQv7c7ugFFDzQGBzZswY6786m86gpE
Ibb3OhjZnzcvQAaRHhdlQWIMm2nrAgMBAAEwDQYJKoZIhvcNAQEFBQADgYEAtCu4
nUhVVxYUntneD9+h8Mg9q6q+auNKyExzyLwaxlAoo7TJHidbtS4J5iNmZgXL0Fkb
FFBjvSfpJIlJ00zbhNYS5f6GuoEDmFJl0ZxBHjJnyp378OD8uTs7fLvjx79LjSTb
NYiytVbZPQUQ5Yaxu2jXnimvw3rrszlaEXAMPLE my-public-key
```

------
#### [ PowerShell ]

```
PS C:\> Invoke-RestMethod -uri http://169.254.169.254/latest/meta-data/public-keys/0/openssh-key
ssh-rsa MIICiTCCAfICCQD6m7oRw0uXOjANBgkqhkiG9w0BAQUFADCBiDELMAkGA1UEBhMC
VVMxCzAJBgNVBAgTAldBMRAwDgYDVQQHEwdTZWF0dGxlMQ8wDQYDVQQKEwZBbWF6
b24xFDASBgNVBAsTC0lBTSBDb25zb2xlMRIwEAYDVQQDEwlUZXN0Q2lsYWMxHzAd
BgkqhkiG9w0BCQEWEG5vb25lQGFtYXpvbi5jb20wHhcNMTEwNDI1MjA0NTIxWhcN
MTIwNDI0MjA0NTIxWjCBiDELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAldBMRAwDgYD
VQQHEwdTZWF0dGxlMQ8wDQYDVQQKEwZBbWF6b24xFDASBgNVBAsTC0lBTSBDb25z
b2xlMRIwEAYDVQQDEwlUZXN0Q2lsYWMxHzAdBgkqhkiG9w0BCQEWEG5vb25lQGFt
YXpvbi5jb20wgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAMaK0dn+a4GmWIWJ
21uUSfwfEvySWtC2XADZ4nB+BLYgVIk60CpiwsZ3G93vUEIO3IyNoH/f0wYK8m9T
rDHudUZg3qX4waLG5M43q7Wgc/MbQITxOUSQv7c7ugFFDzQGBzZswY6786m86gpE
Ibb3OhjZnzcvQAaRHhdlQWIMm2nrAgMBAAEwDQYJKoZIhvcNAQEFBQADgYEAtCu4
nUhVVxYUntneD9+h8Mg9q6q+auNKyExzyLwaxlAoo7TJHidbtS4J5iNmZgXL0Fkb
FFBjvSfpJIlJ00zbhNYS5f6GuoEDmFJl0ZxBHjJnyp378OD8uTs7fLvjx79LjSTb
NYiytVbZPQUQ5Yaxu2jXnimvw3rrszlaEXAMPLE my-public-key
```

------

### インスタンスのサブネット ID を取得する
<a name="instance-metadata-ex-6-imdsv1"></a>

次の例ではインスタンスのサブネット ID を取得しています。

------
#### [ cURL ]

```
[ec2-user ~]$ curl http://169.254.169.254/latest/meta-data/network/interfaces/macs/02:29:96:8f:6a:2d/subnet-id
subnet-be9b61d7
```

------
#### [ PowerShell ]

```
PS C:\> Invoke-RestMethod -uri http://169.254.169.254/latest/meta-data/network/interfaces/macs/02:29:96:8f:6a:2d/subnet-id
subnet-be9b61d7
```

------

### インスタンスのインスタンスタグを取得する
<a name="instance-metadata-ex-7-imdsv1"></a>

インスタンスメタデータ内のインスタンスタグへのアクセスが有効になっている場合はインスタンスメタデータからインスタンスのタグを取得できます。詳細については「[インスタンスメタデータからタグを取得する](work-with-tags-in-IMDS.md#retrieve-tags-from-IMDS)」を参照してください。

# インスタンスメタデータサービスバージョン 2 の使用への移行
<a name="instance-metadata-transition-to-version-2"></a>

インスタンスメタデータサービスバージョン 2 (IMDSv2) 呼び出しのみを許可するようにインスタンスを設定する場合は、次のツールと移行パスを使用することをお勧めします。

**Topics**
+ [IMDSv2 に移行するためのツール](#tools-for-transitioning-to-imdsv2)
+ [IMDSv2 を必要とする推奨パス](#recommended-path-for-requiring-imdsv2)

## IMDSv2 に移行するためのツール
<a name="tools-for-transitioning-to-imdsv2"></a>

次のツールは、IMDSv1 から IMDSv2 へのソフトウェアの移行を特定、モニタリング、管理するのに役立ちます。これらのツールの使用方法については、「[IMDSv2 を必要とする推奨パス](#recommended-path-for-requiring-imdsv2)」を参照してください。

**AWS ソフトウェア**  
最新バージョンの AWS CLI および AWS SDK ではIMDSv2 をサポートしています。IMDSv2 を使用するには、EC2 インスタンスを更新して最新バージョンを使用してください。IMDSv2 をサポートする最低限の AWS SDK バージョンについては「[サポートされる AWS SDK を使用する](configuring-instance-metadata-service.md#use-a-supported-sdk-version-for-imdsv2)」を参照してください。  
すべての Amazon Linux 2 と Amazon Linux 2023 ソフトウェアパッケージが IMDSv2 をサポートしています。Amazon Linux 2023 では、IMDSv1 はデフォルトで無効になっています。

**IMDS パケットアナライザー**  
IMDS パケットアナライザーは、インスタンスの起動フェーズおよびランタイムオペレーション時の IMDSv1 呼び出しを特定してログに記録する、オープンソースツールです。これらのログを解析すると、お使いのインスタンスで IMDSv1 呼び出しを行うソフトウェアを正確に特定し、お使いのインスタンスでのみ IMDSv2 をサポートするために更新する必要があるものを特定できます。IMDS パケットアナライザーはコマンドラインから実行することも、サービスとしてインストールすることもできます。詳細については*GitHub* の [AWS ImdsPacketAnalyzer](https://github.com/aws/aws-imds-packet-analyzer) のページを参照してください

**CloudWatch**  
CloudWatch では、インスタンスのモニタリング用に次の 2 つのメトリクスが用意されています。  
`MetadataNoToken` – IMDSv2 はトークンベースのセッションを使用します。ただし、IMDSv1 はこれを使用しません。`MetadataNoToken` メトリクスは IMDSv1 を使用しているインスタンスメタデータサービス (IMDS) への呼び出しの数を追跡します。このメトリクスをゼロまでトラッキングすることにより、すべてのソフトウェアが IMDSv2 を使用するようアップグレードされたかどうか、およびいつアップデートが行われたかを測定できます。  
`MetadataNoTokenRejected` – IMDSv1 を無効にした後、`MetadataNoTokenRejected` メトリクスを使用して、IMDSv1 呼び出しが試行および拒否された回数を追跡できます。このメトリクスを追跡することで、IMDSv2 を使用するようにソフトウェアを更新する必要があるかどうかを確認できます。  
各 EC2 インスタンスのこれらのメトリクスは相互排他的です。IMDSv1 が有効になっている場合 (`httpTokens = optional`) は、`MetadataNoToken` のみが出力されます。IMDSv1 が無効になっている場合 (`httpTokens = required`) は、`MetadataNoTokenRejected` のみが出力されます。これらのメトリクスをいつ使用すべきかについては、「[IMDSv2 を必要とする推奨パス](#recommended-path-for-requiring-imdsv2)」を参照してください。  
詳細については「[インスタンスメトリクス](viewing_metrics_with_cloudwatch.md#ec2-cloudwatch-metrics)」を参照してください。

**API の起動**  
**新しいインスタンス:** [RunInstances](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_RunInstances.html) API を使用して、IMDSv2 の使用を必須とする新しいインスタンスを起動します。詳細については「[新規インスタンスのインスタンスメタデータオプションの設定](configuring-IMDS-new-instances.md)」を参照してください。  
**既存のインスタンス:** [ModifyInstanceMetadataOptions](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_ModifyInstanceMetadataOptions.html) API を使用して、既存のインスタンスでの IMDSv2 の使用を必須にします。詳細については「[既存インスタンスのインスタンスメタデータオプションの変更](configuring-IMDS-existing-instances.md)」を参照してください。  
**Auto Scaling グループによって起動された新しいインスタンス:** Auto Scaling グループによって起動されたすべての新しいインスタンスで IMDSv2 の使用を必須とするには、Auto Scaling グループで起動テンプレートまたは起動設定を使用できます。[起動テンプレートの作成](https://docs.aws.amazon.com/cli/latest/reference/ec2/create-launch-template.html)時や[起動設定の作成](https://docs.aws.amazon.com/cli/latest/reference/autoscaling/create-launch-configuration.html)時に、IMDSv2 の使用が必須となるように `MetadataOptions` パラメータを設定する必要があります。Auto Scaling グループは新しい起動テンプレートまたは起動設定を使用して新しいインスタンスは新しいインスタンスを起動しますが、既存のインスタンスは影響を受けません。  
**Auto Scaling グループ内の既存のインスタンス**: [ModifyInstanceMetadataOptions](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_ModifyInstanceMetadataOptions.html) API を使用して、既存のインスタンスで IMDSv2 の使用を必須にします。または、インスタンスを終了すると、Auto Scaling グループが新しい起動テンプレートまたは起動設定で定義されているインスタンスメタデータオプション設定を使用して新しい代替インスタンスを起動します。

**AMI**  
`ImdsSupport` パラメータを `v2.0` に設定して構成された AMI は、デフォルトで IMDSv2 を必要とするインスタンスを起動します。Amazon Linux 2023 は `ImdsSupport = v2.0` を使用して設定されます。  
**新しい AMI:** 新しい AMI を作成するときは、[register-image](https://docs.aws.amazon.com/cli/latest/reference/ec2/register-image.html) CLI コマンドを使用して `ImdsSupport` パラメータを `v2.0` に設定します。  
**既存の AMI:** 既存の AMI を変更するときは、[modify-image-attribute](https://docs.aws.amazon.com/cli/latest/reference/ec2/modify-image-attribute.html) CLI コマンドを使用して `ImdsSupport` パラメータを `v2.0` に設定しますい。  
詳細については「[AMI を設定する](configuring-IMDS-new-instances.md#configure-IMDS-new-instances-ami-configuration)」を参照してください。

**アカウントレベルのコントロール**  
すべてのインスタンスメタデータオプションのデフォルト値をアカウントレベルで設定できます。デフォルト値は、インスタンスの起動時に自動的に適用されます。詳細については、「[IMDSv2 をアカウントのデフォルトとして設定する](configuring-IMDS-new-instances.md#set-imdsv2-account-defaults)」を参照してください。  
IMDSv2 を使用する要件をアカウントレベルで強制適用することもできます。IMDSv2 の強制適用が有効になっている場合:  
+ **新しいインスタンス:** IMDSv1 が有効化された状態で起動するように設定されたインスタンスは起動が失敗します
+ **IMDSv1 が無効になっている既存のインスタンス:** 既存のインスタンスで IMDSv1 を有効にする試みは阻止されます。
+ **IMDSv1 が有効になっている既存のインスタンス:** IMDSv1 が既に有効になっている既存のインスタンスは影響を受けません。
詳細については「[アカウントレベルで IMDSv2 を強制適用する](configuring-IMDS-new-instances.md#enforce-imdsv2-at-the-account-level)」を参照してください。

**IAM ポリシーおよび SCP**  
以下に示すように、ユーザーの管理にはIAM ポリシーを使用することも、AWS Organizations サービスコントロールポリシー (SCP) を使用することもできます。  
+ インスタンスが IMDSv2 を使用するように設定されていない限り、[RunInstances](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_RunInstances.html) API を使用してそのインスタンスを起動することはできません。
+ [ModifyInstanceMetadataOptions](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_ModifyInstanceMetadataOptions.html) API を使用して実行中のインスタンスを変更し、IMDSv1 を再度有効にすることはできません。
IAM ポリシーまたは SCP には次の IAM 条件キーを含める必要があります。  
+ `ec2:MetadataHttpEndpoint`
+ `ec2:MetadataHttpPutResponseHopLimit`
+ `ec2:MetadataHttpTokens`
API および CLI 呼び出し時のパラメータが、条件キーが含まれているポリシーで指定した状態と一致しない場合、これらの API または CLI の呼び出しは失敗し `UnauthorizedOperation` レスポンスが返されます。  
さらに、追加の保護レイヤーを選択して、IMDSv1からIMDSv2の変更を強制することもできます。EC2 ロールの認証情報経由で呼び出された各 API に関するアクセス管理レイヤーでは、IAM ポリシーまたは AWS Organizations サービスコントロールポリシー (SCP) で条件キーを使用できます。具体的にはIAM ポリシーで値 `2.0` を設定した条件キー `ec2:RoleDelivery` を使用していると、IMDSv1 から取得した EC2 ロールの認証情報を使用した API コールに対して、`UnauthorizedOperation` レスポンスが返されます。同じことはSCP によって義務付けられる条件を使ってより広く達成できます。これにより、指定した条件と一致しない API コールに対しては `UnauthorizedOperation` エラーが返されるため、実際に IMDSv1 から取得した認証情報を使用して API を呼び出すことはできなくなります。  
IAM ポリシーの例は[インスタンスメタデータの使用](ExamplePolicies_EC2.md#iam-example-instance-metadata)を参照してください。SCP の詳細については「*AWS Organizations ユーザーガイド 」の「サービスコントロ*ールポリシー [(SCPs)](https://docs.aws.amazon.com/organizations/latest/userguide/orgs_manage_policies_scps.html)」を参照してください。

**宣言型ポリシー**  
宣言型ポリシー (AWS Organizations の機能) を使用して、組織全体の IMDS アカウントデフォルト (IMDSv2 の強制適用を含む) を一元的に設定します。ポリシーの例については、「*AWS Organizations ユーザーガイド*」の「[サポートされている宣言型ポリシー](https://docs.aws.amazon.com/organizations/latest/userguide/orgs_manage_policies_declarative_syntax.html#declarative-policy-examples)」セクションにある「**インスタンスメタデータ**」タブを参照してください。

## IMDSv2 を必要とする推奨パス
<a name="recommended-path-for-requiring-imdsv2"></a>

**Topics**
+ [ステップ 1: IMDSv2=optional を使用するインスタンスを特定し、IMDSv1 の使用状況を監査する](#path-step-1)
+ [ステップ 2: ソフトウェアを IMDSv2 に更新する](#path-step-2)
+ [ステップ 3: インスタンスで IMDSv2 を要求する](#path-step-3)
+ [ステップ 4: IMDSv2=required をデフォルトとして設定する](#path-step-4)
+ [ステップ 5: インスタンスに IMDSv2 を要求するように強制する](#path-step-5)

### ステップ 1: IMDSv2=optional を使用するインスタンスを特定し、IMDSv1 の使用状況を監査する
<a name="path-step-1"></a>

IMDSv2 移行の範囲を評価するには、IMDSv1 または IMDSv2 のいずれかを許可するように設定されたインスタンスを特定し、IMDSv1 呼び出しを監査します。

1. **IMDSv1 または IMDSv2 のいずれかを許可するように設定されたインスタンスを特定する:**

------
#### [ Amazon EC2 console ]

   1. Amazon EC2 コンソールの [https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/) を開いてください。

   1. ナビゲーションペインで、**[Instances]** (インスタンス) を選択してください。

   1. IMDSv1 または IMDSv2 を許可するように設定されたインスタンスのみを表示するには、フィルター「**IMDSv2 = optional**」を追加します。

   1. または、IMDSv2 がすべてのインスタンスで**オプション**か**必須**かを確認するには、**[設定]** ウィンドウ (歯車アイコン) を開き、**[IMDSv2]** をオンにして **[確認]** を選択します。これにより **IMDSv2** 列が**インスタンス**テーブルに追加されます。

------
#### [ AWS CLI ]

   [describe-instances](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/ec2/modify-instance-metadata-options.html) コマンドを使用して、次のように `metadata-options.http-tokens = optional` でフィルタリングします。

   ```
   aws ec2 describe-instances --filters "Name=metadata-options.http-tokens,Values=optional" --query "Reservations[*].Instances[*].[InstanceId]" --output text
   ```

------

1. **各インスタンスで IMDSv1 呼び出しを監査する:**

   CloudWatch メトリクス `MetadataNoToken` を使用します。このメトリクスはインスタンスの IMDS に対する IMDSv1 呼び出しの数を示します。詳細については、「[インスタンスのメトリクス](https://docs.aws.amazon.com/en_us/AWSEC2/latest/UserGuide/viewing_metrics_with_cloudwatch.html#ec2-cloudwatch-metrics)」を参照してください。

1. **IMDSv1 呼び出しを行うインスタンス上のソフトウェアを特定する:**

   オープンソースの [IMDS パケットアナライザー](https://github.com/aws/aws-imds-packet-analyzer)を使用して、インスタンスの起動フェーズおよびランタイムオペレーション中に IMDSv1 呼び出しを特定し、ログに記録します。この情報を使用して、更新するソフトウェアを特定し、インスタンスが IMDSv2 のみを使用する準備を行います。IMDS パケットアナライザーはコマンドラインから実行することも、サービスとしてインストールすることもできます。

### ステップ 2: ソフトウェアを IMDSv2 に更新する
<a name="path-step-2"></a>

インスタンスでロール認証情報を使用するすべてのSDK、CLI、ソフトウェアを IMDSv2 対応バージョンに更新します。詳細については *AWS Command Line Interface ユーザーガイド」の「[AWS CLI の最新バージョンをインストールまたは更新](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html)」を参照してください*。

### ステップ 3: インスタンスで IMDSv2 を要求する
<a name="path-step-3"></a>

`MetadataNoToken` メトリクスを通じて IMDSv1 呼び出しがゼロになったことを確認したら、IMDSv2 を要求するように既存のインスタンスを設定します。また、IMDSv2 を要求するようにすべての新しいインスタンスを設定します。つまり、すべての既存のインスタンスと新しいインスタンスで IMDSv1 を無効にします。

1. **IMDSv2 を要求するように既存のインスタンスを設定する:**

------
#### [ Amazon EC2 console ]

   1. Amazon EC2 コンソールの [https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/) を開いてください。

   1. ナビゲーションペインで、**[Instances]** (インスタンス) を選択してください。

   1. インスタンスを選択してください。

   1. **[アクション]**、**[インスタンスの設定]**、**[インスタンスメタデータのオプションを変更]** の順に選択してください。

   1. **[IMDSv2]** の場合は**[必須]** を選択してください。

   1. [**Save**] を選択してください。

------
#### [ AWS CLI ]

   IMDSv2 のみを使用するように指定するには、[modify-instance-metadata-options](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/ec2/modify-instance-metadata-options.html) CLI コマンドを使用します。

------
**注記**  
この設定は、実行中のインスタンスで変更できます。変更は、インスタンスを再起動しなくてもすぐに有効になります。

   詳細については「[IMDSv2 の使用を要求する](configuring-IMDS-existing-instances.md#modify-require-IMDSv2)」を参照してください。

1. **IMDSv1 を無効にした後の問題を監視する:**

   1. `MetadataNoTokenRejected` CloudWatch メトリクスを使用して、IMDSv1 呼び出しが試行および拒否された回数を追跡できます。

   1. ソフトウェアの問題が発生しているインスタンスで `MetadataNoTokenRejected` メトリクスが IMDSv1 呼び出しを記録する場合、これは IMDSv2 を使用するためにソフトウェアを更新する必要があることを示します。

1. **IMDSv2 を要求するように新しいインスタンスを設定する:**

------
#### [ Amazon EC2 console ]

   1. Amazon EC2 コンソールの [https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/) を開いてください。

   1. [インスタンスを起動](ec2-launch-instance-wizard.md)するには、次のステップに沿って操作します。

   1. **[高度な詳細]** を展開し、**[メタデータバージョン]** で **[V2 のみ (トークンが必要)]** を選択します。

   1. **[Summary]** (概要) パネルでインスタンスの設定を確認し、**[Launch instance]** (インスタンスを起動) を選択してください。

      詳細については「[起動時にインスタンスを設定する](configuring-IMDS-new-instances.md#configure-IMDS-new-instances-instance-settings)」を参照してください。

------
#### [ AWS CLI ]

   AWS CLI: [run-instances](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/ec2/run-instances.html) CLI コマンドを使用して、IMDSv2 が必須となるように指定します。

------

### ステップ 4: IMDSv2=required をデフォルトとして設定する
<a name="path-step-4"></a>

IMDSv2=required は、アカウントレベルまたは組織レベルのいずれかでデフォルト設定として設定できます。これにより、新しく起動されたすべてのインスタンスが IMDSv2 を要求するように自動的に設定されます。

1. **アカウントレベルのデフォルトを設定する:**

------
#### [ Amazon EC2 console ]

   1. Amazon EC2 コンソールの [https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/) を開いてください。

   1. ナビゲーションペインで、**ダッシュボード**を選択してください。

   1. **[アカウント属性]** カードの **[設定]** で、**[データ保護とセキュリティ]** を選択します。

   1. **[IMDS のデフォルト]** で **[管理]** を選択します。

   1. **[インスタンスメタデータサービス]** で、**[有効にする]** を選択します。

   1. **[メタデータバージョン]** で、**[V2 のみ (トークンが必要)]** を選択します。

   1. **[Update]** (更新) を選択してください。

------
#### [ AWS CLI ]

   [modify-instance-metadata-defaults](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/ec2/modify-instance-metadata-defaults.html) CLI コマンドを使用して、`--http-tokens required` と `--http-put-response-hop-limit 2` を指定します。

------

   詳細については「[IMDSv2 をアカウントのデフォルトとして設定する](configuring-IMDS-new-instances.md#set-imdsv2-account-defaults)」を参照してください。

1. **または、宣言型ポリシーを使用して組織レベルのデフォルトを設定します。**

   宣言型ポリシーを使用して、IMDSv2 の組織のデフォルトを必須に設定します。ポリシーの例については、「*AWS Organizations ユーザーガイド*」の「[サポートされている宣言型ポリシー](https://docs.aws.amazon.com/organizations/latest/userguide/orgs_manage_policies_declarative_syntax.html#declarative-policy-examples)」セクションにある「**インスタンスメタデータ**」タブを参照してください。

### ステップ 5: インスタンスに IMDSv2 を要求するように強制する
<a name="path-step-5"></a>

どのインスタンスにも IMDSv1 への依存がないことを確認したら、すべての新しいインスタンスに IMDSv2 を強制適用することが推奨されます。

次の 2 つのオプションのいずれかを使用して IMDSv2 を強制適用します。

1. **アカウントプロパティを使用して IMDSv2 を強制適用する**

   各 AWS リージョンに対し、アカウントレベルで IMDSv2 の使用を強制できます。使用が強制されると、インスタンスを起動できるのは IMDSv2 が必須として設定されている場合のみになります。この強制は、インスタンスまたは AMI の設定方法を問わずに適用されます。詳細については「[アカウントレベルで IMDSv2 を強制適用する](configuring-IMDS-new-instances.md#enforce-imdsv2-at-the-account-level)」を参照してください。この設定を組織レベルで適用するには、宣言型ポリシーを設定します。ポリシーの例については、「*AWS Organizations ユーザーガイド*」の「[サポートされている宣言型ポリシー](https://docs.aws.amazon.com/organizations/latest/userguide/orgs_manage_policies_declarative_syntax.html#declarative-policy-examples)」セクションにある「**インスタンスメタデータ**」タブを参照してください。

   強制適用が取り消されないようにするため、IAM ポリシーを使用して [ModifyInstanceMetadataDefaults](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_ModifyInstanceMetadataDefaults.html) API へのアクセスを防ぐ必要があります。詳細については「[IAM ポリシーを使用する](configuring-IMDS-new-instances.md#configure-IMDS-new-instances-iam-policy)」を参照してください。
**注記**  
この設定は既存のインスタンスの IMDS バージョンを変更しませんが、IMDSv1 が現在無効になっている既存のインスタンスでの IMDSv1 の有効化が阻止されます。
**警告**  
IMDSv2 の強制適用が有効になっており、`httpTokens` が起動時のインスタンス設定、アカウント設定、または AMI 構成のいずれかで `required` に設定されていない場合、インスタンスの起動は失敗します。トラブルシューティング情報については、「[IMDSv1 が有効化されたインスタンスの起動が失敗する](troubleshooting-launch.md#launching-an-imdsv1-enabled-instance-fails)」を参照してください。

1. **別の手段として、次の IAM または SCP 条件キーを用いて IMDSv2 を強制適用します。**
   + `ec2:MetadataHttpTokens`
   + `ec2:MetadataHttpPutResponseHopLimit`
   + `ec2:MetadataHttpEndpoint`

   これらの条件キーは [RunInstances](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_RunInstances.html) API と [ModifyInstanceMetadataOptions](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_ModifyInstanceMetadataOptions.html) API、および対応する CLI の使用を制御します。ポリシーを作成し、条件キーを使用してポリシーに指定した状態と API コールのパラメータが一致しない場合、API コールまたは CLI コールは失敗して `UnauthorizedOperation` レスポンスが返されます。

   IAM ポリシーの例は[インスタンスメタデータの使用](ExamplePolicies_EC2.md#iam-example-instance-metadata)を参照してください。

# インスタンスメタデータサービスへのアクセスを制限する
<a name="instance-metadata-limiting-access"></a>

ローカルファイアウォールルールを使って、プロセスの一部またはすべてからインスタンスメタデータサービス (IMDS) へのアクセスを無効化することを検討できます。

[Nitro ベースのインスタンス](instance-types.md#instance-hypervisor-type)ではVPC 内のネットワークアプライアンス (仮想ルーターなど) がパケットを IMDS アドレスに転送し、かつ、インスタンス上のデフォルトの[送信元/送信先チェック](https://docs.aws.amazon.com/vpc/latest/userguide/VPC_NAT_Instance.html#EIP_Disable_SrcDestCheck)が無効な場合、IMDS がユーザー自身のネットワークから到達可能になります。VPC の外側にある送信元から IMDS に到達しないようにするには送信先 IMDS の IPv4 アドレスが `169.254.169.254` (IPv6 エンドポイントを有効にしている場合はIMDS の IPv6 アドレスが `[fd00:ec2::254]`) であるパケットをドロップするように、ネットワークアプライアンスの設定を変更することをお勧めします。

## Linux インスタンスの IMDS アクセスを制限する
<a name="instance-metadata-limiting-access-linux"></a>

**iptables を使ったアクセス制限**

次の例ではLinux iptables およびその`owner`モジュールを使って、Apache ウェブサーバーが (デフォルトインストールユーザー ID `apache`に基づいて) 169.254.169.254 にアクセスするのを防ぐことができます。*拒否ルール*を使って、そのユーザーとして実行中のプロセスからのインスタンスメタデータリクエスト (IMDSv1またはIMDSv2) をすべて拒否します。

```
$ sudo iptables --append OUTPUT --proto tcp --destination 169.254.169.254 --match owner --uid-owner apache --jump REJECT
```

また、*ルールの許可*を使うことで、特定のユーザーまたはグループへのアクセスを許可することを検討できます。ルールの許可はどのソフトウェアがインスタンスメタデータへのアクセスが必要かについてユーザーが決定しなければならないため、セキュリティ観点からみたときに管理しやすいかもしれません。*ルールの許可* を使用すると、後にインスタンスのソフトウェアまたは構成を変更した場合に、誤ってソフトウェアがメタデータサービス (アクセスする意図がなかった) にアクセスするのを許可する可能性が低くなります。また、ファイアウォールのルールを変更しなくても許可されたグループにユーザーを追加/削除できるよう、グループ使用をルールの許可と組み合わせることもできます。

次の例ではユーザーアカウント `trustworthy-user` で実行中のプロセス以外のすべてのプロセスによる IMDS へのアクセスを禁止しています。

```
$ sudo iptables --append OUTPUT --proto tcp --destination 169.254.169.254 --match owner ! --uid-owner trustworthy-user --jump REJECT
```

**注記**  
ローカルファイアウォールルールを使用するには前の例のコマンドをニーズに合わせて変更する必要があります。
デフォルトではiptables ルールはシステム再起動全体で永続しません。ここには説明されていない OS 機能を使って永続的にすることができます。
iptables `owner`モジュールはグループが所定のローカルユーザーのプライマリグループである場合にのみツールメンバーシップと一致します。他のグループは一致しません。

**PF または IPFW を使ってアクセスを制限する**

FreeBSD または OpenBSD を使用している場合、PF または IPFW の使用も検討できます。次の例ではIMDS へのアクセスをルートユーザーにのみ制限しています。

**PF**

```
$ block out inet proto tcp from any to 169.254.169.254
```

```
$ pass out inet proto tcp from any to 169.254.169.254 user root
```

**IPFW**

```
$ allow tcp from any to 169.254.169.254 uid root
```

```
$ deny tcp from any to 169.254.169.254
```

**注記**  
PF および IPFW コマンドの順序は重要となります。PF のデフォルトは最後に一致したルールであり、IPFW のデフォルトは最初に一致したルールです。

## Windows インスタンスの IMDS アクセスを制限する
<a name="instance-metadata-limiting-access-windows"></a>

**Windows ファイアウォールを使ってアクセスを制限する**

次の PowerShell 例では組み込み Windows ファイアウォールを使って、インターネット情報サービスウェブサーバー (デフォルトインストールユーザー ID の`NT AUTHORITY\IUSR`に基づいて) が 169.254.169.254 にアクセスするのを防いでいます。*拒否ルール*を使って、そのユーザーとして実行中のプロセスからのインスタンスメタデータリクエスト (IMDSv1またはIMDSv2) をすべて拒否します。

```
PS C:\> $blockPrincipal = New-Object -TypeName System.Security.Principal.NTAccount ("NT AUTHORITY\IUSR")
PS C:\> $BlockPrincipalSID = $blockPrincipal.Translate([System.Security.Principal.SecurityIdentifier]).Value
PS C:\> $BlockPrincipalSDDL = "D:(A;;CC;;;$BlockPrincipalSID)"
PS C:\> New-NetFirewallRule -DisplayName "Block metadata service from IIS" -Action block -Direction out `
-Protocol TCP -RemoteAddress 169.254.169.254 -LocalUser $BlockPrincipalSDDL
```

また、*ルールの許可*を使うことで、特定のユーザーまたはグループへのアクセスを許可することを検討できます。ルールの許可はどのソフトウェアがインスタンスメタデータへのアクセスが必要かについてユーザーが決定しなければならないため、セキュリティ観点からみたときに管理しやすいかもしれません。*ルールの許可* を使用すると、後にインスタンスのソフトウェアまたは構成を変更した場合に、誤ってソフトウェアがメタデータサービス (アクセスする意図がなかった) にアクセスするのを許可する可能性が低くなります。また、ファイアウォールのルールを変更しなくても許可されたグループにユーザーを追加/削除できるよう、グループ使用をルールの許可と組み合わせることもできます。

次の例では`exceptionPrincipal`で指定したプロセス (この例では`trustworthy-users`と呼ばれるグループ) 以外の、変数 `blockPrincipal` (この例では Windows グループ`Everyone`) で指定された OS グループとして実行中のすべてのプロセスによるインスタンスメタデータへのアクセスを禁止しています。Windows ファイアウォールはLinux iptables の`! --uid-owner trustworthy-user`とは異なり、その他すべてを拒否することにより、特定のプリンシパル (ユーザーまたはグループ) のみを許可するショートカット機構を提供しないため、拒否と許可プリンシパルの両方を指定する必要があります。

```
PS C:\> $blockPrincipal = New-Object -TypeName System.Security.Principal.NTAccount ("Everyone")
PS C:\> $BlockPrincipalSID = $blockPrincipal.Translate([System.Security.Principal.SecurityIdentifier]).Value
PS C:\> $exceptionPrincipal = New-Object -TypeName System.Security.Principal.NTAccount ("trustworthy-users")
PS C:\> $ExceptionPrincipalSID = $exceptionPrincipal.Translate([System.Security.Principal.SecurityIdentifier]).Value
PS C:\> $PrincipalSDDL = "O:LSD:(D;;CC;;;$ExceptionPrincipalSID)(A;;CC;;;$BlockPrincipalSID)"
PS C:\> New-NetFirewallRule -DisplayName "Block metadata service for $($blockPrincipal.Value), exception: $($exceptionPrincipal.Value)" -Action block -Direction out `
-Protocol TCP -RemoteAddress 169.254.169.254 -LocalUser $PrincipalSDDL
```

**注記**  
ローカルファイアウォールルールを使用するには前の例のコマンドをニーズに合わせて変更する必要があります。

**netsh ルールを使ってアクセスを制限する**

`netsh`ルールを使ってすべてのソフトウェアをブロックすることを検討できますが、柔軟性は大幅に低下します。

```
C:\> netsh advfirewall firewall add rule name="Block metadata service altogether" dir=out protocol=TCP remoteip=169.254.169.254 action=block
```

**注記**  
ローカルファイアウォールルールを使用するには前の例のコマンドをニーズに合わせて変更する必要があります。
`netsh`ルールは elevated コマンドプロンプトから設定する必要があり、拒否または許可の特定のプリンシパルに設定できません。