次のいずれかのメソッドを使って、実行中のインスタンスからインスタンスメタデータにアクセスできます。
デフォルトではIMDSv1またはIMDSv2のいずれか、あるいは両方を使用できます。
ローカルコードまたはユーザーに IMDSv2 を使用させるように、各インスタンスのインスタンスメタデータサービス (IMDS) を設定することができます。IMDSv2を使用しなければならないように指定すると、IMDSv1はもう機能しなくなります。ユーザーに IMDSv2 を使用させるようにインスタンスを設定する方法については「インスタンスメタデータサービスのオプションを設定する」を参照してください。
PUT
または GET
ヘッダーは IMDSv2 に固有のものです。これらのヘッダーがリクエストに含まれている場合、そのリクエストは IMDSv2 を対象としています。ヘッダーが存在しない場合、そのリクエストは IMDSv1 を対象としているものとみなされます。
IMDSv2 の拡張のレビューの詳細については「EC2 Instance Metadata Service の拡張により、オープンファイアウォール、リバースプロキシ、および SSRF の脆弱性に対して多層防御を追加
インスタンスメタデータサービスバージョン 2 の仕組み
IMDSv2 はセッション指向リクエストを使用します。セッション指向リクエストを使用して、セッション期間 (1 秒~6 時間) を定義するセッショントークンを作成します。指定した期間中、それ以降のリクエストに同じセッショントークンを使用できます。指定した期間が期限切れになった後、将来のリクエストに使用する新しいセッショントークンを作成する必要があります。
注記
このセクションの例ではインスタンスメタデータサービス (IMDS) の IPv4 アドレス 169.254.169.254
を使用します。IPv6 アドレスを使用して EC2 インスタンスのインスタンスメタデータを取得する場合はIPv6 アドレスを有効にして使用してください。[fd00:ec2::254]
。IMDS の IPv6 アドレスはIMDSv2 コマンドと互換性があります。IPv6 アドレスにはNitro ベースのインスタンスと IPv6 対応サブネット (デュアルスタックまたは IPv6 のみ) でのみアクセスできます。
次の例ではシェルスクリプトと IMDSv2 を使用して、最上位インスタンスメタデータ項目を取得します。各例の操作は次のとおりです。
-
PUT
リクエストを使って、6 時間 (21,600 秒) のセッショントークンを作成する -
セッショントークンヘッダーを
TOKEN
(Linux インスタンス) またはtoken
(Windows インスタンス) という名前の変数に保管する -
トークンを使って最上位メタデータアイテムをリクエストする
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
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を使ってインスタンスメタデータをリクエストする際はリクエストに次の項目が含まれている必要があります。
-
PUT
リクエストを使って、インスタンスメタデータサービスに対してセッションを開始します。PUT
リクエストはインスタンスメタデータサービスに対する後続のGET
リクエストに含まれている必要のあるトークンを返します。このトークンはIMDSv2を使ってメタデータにアクセスするのに必要です。 -
トークンを IMDS に対するすべての
GET
リクエストに含めます。トークンの使用がrequired
に設定されている場合、有効なトークンがないリクエスト、または有効期限切れのトークンを持つリクエストで401 - Unauthorized
HTTP エラーコードが発生します。-
トークンはインスタンス固有のキーです。トークンは他の EC2 インスタンスで有効ではなく、生成されたインスタンスの外で使用しようとすると拒否されます。
-
PUT
リクエストにはトークンの有効期限 (TTL) を最大 6 時間 (21,600 秒) まで秒単位で指定するヘッダーが含まれている必要があります。トークンは論理的セッションを表します。TTL はトークンが有効な時間の長さ、つまりセッションの期間を指定します。 -
トークンの期限が切れた後、インスタンスメタデータにアクセスし続けるためには別の
PUT
を使って新しいセッションを作成する必要があります。 -
各リクエストについてトークンを再使用するか、あるいは新しいトークンを作成することを選択できます。少数のリクエストではIMDS にアクセスする必要があるたびに、トークンを生成してすぐに使用するほうが簡単である場合があります。ただし、効率を重視するなら、インスタンスメタデータをリクエストする必要があるたびに
PUT
リクエストを書くより、トークン期間を長く指定して再使用することができます。それぞれが独自のセッションを表すトークンを同時に使用できる数については実際的に制限がありません。ただし、IMDSv2 では通常の IMDS 接続とスロットリングの制限によって制約を受けます。詳細については「クエリスロットル」を参照してください。
-
HTTP GET
およびHEAD
メソッドはIMDSv2インスタンスメタデータリクエストで許可されています。 PUT
リクエストはX-Forwarded-For ヘッダーが含まれている場合、拒否されます。
デフォルトで、PUT
リクエストに対するレスポンスには IP プロトコルレベルで 1
のレスポンスホップリミット (有効期限) があります。より大きなホップリミットが必要な場合はmodify-instance-metadata-options
サポートされる AWS SDK を使用する
IMDSv2 を使用するにはEC2 インスタンスが IMDSv2 の使用をサポートする AWS SDK バージョンを使用する必要があります。最新バージョンの AWS SDK はすべて IMDSv2 の使用をサポートしています。
重要
最新の機能、セキュリティアップデート、および基本的な依存関係を維持するために、SDK のリリースを常に更新することをお勧めします。サポート対象外の SDK バージョンを継続して使用することはお勧めできません。お客様の判断で行ってください。詳細についてはAWS SDK とツールのリファレンスガイド」の「AWS SDK とツールのメンテナンスポリシー」を参照してください。
IMDSv2 の使用をサポートする最小バージョンは次のとおりです。
-
AWS CLI
– 1.16.289 -
AWS Tools for Windows PowerShell
– 4.0.1.0 -
AWS SDK for .NET
– 3.3.634.1 -
AWS SDK for C++
– 1.7.229 -
AWS SDK for Go
– 1.25.38 -
AWS SDK for Go v2
– 0.19.0 -
AWS SDK for Java
– 1.11.678 -
AWS SDK for Java 2.x
– 2.10.21 -
AWS Node.js 内の SDK for JavaScript
– 2.722.0 -
AWS SDK for Kotlin
– 1.1.4 -
AWS SDK for PHP
– 3.147.7 -
AWS SDK for Python (Botocore)
– 1.13.25 -
AWS SDK for Python (Boto3)
– 1.12.6 -
AWS SDK for Ruby
– 3.79.0
IMDSv2 の例
Amazon EC2 インスタンスで次の例を実行して、IMDSv2 のインスタンスメタデータを取得します。
Windows インスタンスではWindows PowerShell を使用するか、cURL または wget をインストールすることができます。Windows インスタンスにサードパーティーツールをインストールする場合は呼び出しおよび出力がここに記載されているものとは異なる場合があるため、必ず付属のドキュメントをよく読んでください。
例
使用できるインスタンスメタデータのバージョンを取得する
次の例では使用できるインスタンスメタデータのバージョンを取得しています。各バージョンは新しいインスタンスのメタデータカテゴリがリリースされたときのインスタンスメタデータビルドを参照してください。インスタンスメタデータビルドのバージョンはAmazon EC2 API のバージョンとは相関しません。以前のバージョンに存在する構造および情報に依存するスクリプトがある場合は以前のバージョンを使用することができます。
[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
上位レベルのメタデータ項目を取得する
次の例では上位レベルのメタデータ項目を取得しています。レスポンスの項目の詳細については「インスタンスメタデータのカテゴリ」を参照してください。
アクセスを許可した場合にのみ、タグがこの出力に含まれることに注意してください。詳細については「インスタンスメタデータのタグへのアクセスを許可する」を参照してください。
[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/
メタデータ項目の値を取得する
これらの例では前出の例で取得された一部の最上位メタデータ項目の値を取得しています。これらのリクエストは前の例のコマンドを使用して作成された保管されているトークンを使用します。このトークンは有効期限が切れていない必要があります。
[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
使用可能なパブリックキーのリストを取得する
次の例では使用できるパブリックキーの一覧を取得しています。
[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
パブリックキー 0 が使用できるフォーマットを示す
次の例はパブリックキー0のフォーマットを示しています。
[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
パブリックキー 0 を取得する (OpenSSH キーフォーマット)
次の例ではパブリックキー0を取得しています (OpenSSH キーフォーマット)。
[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
インスタンスのサブネット ID を取得する
次の例ではインスタンスのサブネット ID を取得しています。
[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
インスタンスのインスタンスタグを取得する
インスタンスメタデータ内のインスタンスタグへのアクセスが有効になっている場合はインスタンスメタデータからインスタンスのタグを取得できます。詳細については「インスタンスメタデータからタグを取得する」を参照してください。
IMDSv1 の例
Amazon EC2 インスタンスで次の例を実行して、IMDSv1 のインスタンスメタデータを取得します。
Windows インスタンスではWindows PowerShell を使用するか、cURL または wget をインストールすることができます。Windows インスタンスにサードパーティーツールをインストールする場合は呼び出しおよび出力がここに記載されているものとは異なる場合があるため、必ず付属のドキュメントをよく読んでください。
例
使用できるインスタンスメタデータのバージョンを取得する
次の例では使用できるインスタンスメタデータのバージョンを取得しています。各バージョンは新しいインスタンスのメタデータカテゴリがリリースされたときのインスタンスメタデータビルドを参照してください。インスタンスメタデータビルドのバージョンはAmazon EC2 API のバージョンとは相関しません。以前のバージョンに存在する構造および情報に依存するスクリプトがある場合は以前のバージョンを使用することができます。
[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
上位レベルのメタデータ項目を取得する
次の例では上位レベルのメタデータ項目を取得しています。レスポンスの項目の詳細については「インスタンスメタデータのカテゴリ」を参照してください。
アクセスを許可した場合にのみ、タグがこの出力に含まれることに注意してください。詳細については「インスタンスメタデータのタグへのアクセスを許可する」を参照してください。
[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/
メタデータ項目の値を取得する
これらの例では前の例で取得した一部の最上位メタデータ項目の値を取得しています。
[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
使用可能なパブリックキーのリストを取得する
次の例では使用できるパブリックキーの一覧を取得しています。
[ec2-user ~]$
curl http://169.254.169.254/latest/meta-data/public-keys/
0=my-public-key
パブリックキー 0 が使用できるフォーマットを示す
次の例はパブリックキー0のフォーマットを示しています。
[ec2-user ~]$
curl http://169.254.169.254/latest/meta-data/public-keys/0/
openssh-key
パブリックキー 0 を取得する (OpenSSH キーフォーマット)
次の例ではパブリックキー0を取得しています (OpenSSH キーフォーマット)。
[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
インスタンスのサブネット ID を取得する
次の例ではインスタンスのサブネット ID を取得しています。
[ec2-user ~]$
curl http://169.254.169.254/latest/meta-data/network/interfaces/macs/02:29:96:8f:6a:2d/subnet-id
subnet-be9b61d7
インスタンスのインスタンスタグを取得する
インスタンスメタデータ内のインスタンスタグへのアクセスが有効になっている場合はインスタンスメタデータからインスタンスのタグを取得できます。詳細については、「インスタンスメタデータからタグを取得する」を参照してください。