

# 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 にアクセスする際にスロットリングした場合、エクスポネンシャルバックオフ戦略でクエリを再試行します。