インスタンスメタデータの取得
インスタンスメタデータは実行中のインスタンスから取得できるため、Amazon EC2 コンソールまたは AWS CLI を使用する必要はありません。これは、インスタンスから実行するスクリプトを記述しているときに便利です。例えば、インスタンスメタデータからインスタンスのローカル IP アドレスにアクセスして、外部アプリケーションへの接続を管理できます。
インスタンスメタデータはいくつかのカテゴリに分けられます。各インスタンスメタデータカテゴリの説明については、 インスタンスメタデータのカテゴリ を参照してください。
実行中のインスタンス内にあるインスタンスメタデータの、すべてのカテゴリを表示するには、以下の IPv4 または IPv6 URI を使用します。
IPv4
http://169.254.169.254/latest/meta-data/
IPv6
http://[fd00:ec2::254]/latest/meta-data/
これらの IP アドレス は、リンクローカルアドレスであり、インスタンスからのみ使用することが可能です。詳細については、このユーザーガイドの「
リンクローカルアドレス
」と Wikipedia の「
Link-local address
注記
このセクションの例では、IMDS の IPv4 アドレス
169.254.169.254
を使用します。IPv6 アドレスを使用して EC2 インスタンスのインスタンスメタデータを取得する場合は、IPv6 アドレスを有効にして使用してください。
[fd00:ec2::254]
。IMDS の IPv6 アドレスは、IMDSv2 コマンドと互換性があります。IPv6 アドレスは、
AWS Nitro System 上に構築されたインスタンス
と
IPv6 対応サブネット
(デュアルスタックまたは IPv6 のみ) でのみアクセスできます。
コマンドフォーマットは、IMDSv1とIMDSv2のどちらを使うかによって異なります。デフォルトでは、両方のバージョンの IMDS を使用できます。IMDSv2の使用を義務付けるには、 IMDSv2 の使用 を参照してください。
次の例のように、cURL などのツールを使用できます。
Windows インスタンスからインスタンスメタデータを取得するコマンドについては、「Windows インスタンス用 Amazon EC2 ユーザーガイド」の「 インスタンスメタデータの取得 」を参照してください。
インスタンスメタデータおよびユーザーデータの取得に使用する HTTP リクエストに対しては課金されません。
インスタンスメタデータの取得に関する問題を回避するには、次の点を考慮してください。
コンテナ環境では、ホップ制限を 2 に設定することをお勧めします。
AWS SDK はデフォルトで IMDSv2 コールを使用します。IMDSv2 呼び出しに応答がない場合、SDK は呼び出しを再試行し、それでも失敗した場合は、IMDSv1 を使用します。これにより、特にコンテナ環境では、遅延が発生することがあります。コンテナ環境では、ホップ制限が 1 の場合、コンテナへの到達は余分なネットワークホップと見なされるため、IMDSv2 応答は返されません。IMDSv1 へのフォールバックプロセスとその結果として生じる遅延を回避するために、コンテナ環境でホップ制限を 2 に設定することをお勧めします。詳細については、「 インスタンスメタデータオプションの設定 」を参照してください。
IMDSv2 でトークンを取得する際には、
/latest/api/token
を使用する必要があります。
バージョン固有の任意のパス (例:
/2021-03-23/api/token
) に
PUT
リクエストを発行した場合は、メタデータサービスから 403 Forbidden エラーが返されます。この応答は意図されたものです。
IMDSv2 が必要な場合は、IMDSv1 は動作しません。
インスタンスに IMDSv2 が必要かどうかは、次のように確認できます。インスタンスを選択して詳細を表示し、 [IMDSv2] の値を確認します。値は、 [必須] (IMDSv2 のみ使用可能) または [オプション] (IMDSv2 と IMDSv1 を使用できます) のいずれかです。
リスポンスおよびエラーメッセージ
すべてのインスタンスメタデータがテキスト (HTTP コンテンツタイプ
text/plain
) として返されます。
特定のメタデータリソースに対するリクエストは、適切な値または
404 - Not Found
HTTP エラーコード (リソースを使用できない場合) を返します。
一般的なメタデータリソースに対するリクエスト (/ で終わる URI) は、使用可能なリソースのリストまたは
404 - Not Found
HTTP エラーコード (使用可能なリソースがない場合) を返します。リスト項目は個別の行に表示され、各行の末尾には改行記号 (ASCII 10) が付いています。
インスタンスメタデータサービスバージョン 2を使って行われたリクエストについては、次の HTTP エラーコードが返されます。
400 - Missing or Invalid Parameters
–
PUT
リクエストが無効である。
401 - Unauthorized
–
GET
リクエストが無効なトークンを使用している。推奨されるアクションは新しいトークンを生成することです。
403 - Forbidden
- リクエストが許可されていないか、あるいは IMDS がオフです。
インスタンスメタデータの取得の例
次の例は、Linux インスタンスで使用できるコマンドを示しています。Windows インスタンスからインスタンスメタデータを取得するコマンドについては、「Windows インスタンス用 Amazon EC2 ユーザーガイド」の「 インスタンスメタデータの取得 」を参照してください。
例
使用できるインスタンスメタデータのバージョンを取得する
次の例では、使用できるインスタンスメタデータのバージョンを取得しています。各バージョンは、新しいインスタンスのメタデータカテゴリがリリースされたときのインスタンスメタデータビルドを参照します。インスタンスメタデータビルドのバージョンは、Amazon EC2 API のバージョンとは相関しません。以前のバージョンに存在する構造および情報に依存するスクリプトがある場合は、以前のバージョンを使用することができます。
注記
Amazon EC2 が新しいインスタンスメタデータビルドをリリースするたびにコードを更新する必要をなくすために、バージョン番号ではなく、パス内の
latest
を使用することが推奨されます。例えば、以下のように
latest
を使用します。
curl http://169.254.169.254/
latest
/meta-data/ami-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/
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/
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 instance-action instance-id instance-life-cycle instance-type local-hostname local-ipv4 metrics/ network/ placement/ profile public-hostname public-ipv4 public-keys/ reservation-id security-groups services/
[ec2-user ~]$
curl http://169.254.169.254/latest/meta-data/
ami-id ami-launch-index ami-manifest-path block-device-mapping/ events/ hostname instance-action instance-id instance-type local-hostname local-ipv4 metrics/ network/ placement/ profile public-hostname public-ipv4 public-keys/ reservation-id security-groups services/
次の例では、前の例で取得された最上位メタデータアイテムの値のいくつかを取得しています。IMDSv2 リクエストは、前の例のコマンドで作成された保管済みトークン (期限内であると仮定) を使用します。
[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 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 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 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 ~]$
curl 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
[ec2-user ~]$
curl http://169.254.169.254/latest/meta-data/public-keys/
0=my-public-key
[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
[ec2-user ~]$
curl http://169.254.169.254/latest/meta-data/public-keys/0/
openssh-key
[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
[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
[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
[ec2-user ~]$
curl http://169.254.169.254/latest/meta-data/network/interfaces/macs/02:29:96:8f:6a:2d/subnet-id
subnet-be9b61d7
インスタンスのインスタンスタグを取得する
次の例では、サンプルインスタンスで
インスタンスメタデータのタグが有効
になっており、インスタンスタグ
Name=MyInstance
および
Environment=Dev
が含まれています。
この例では、インスタンスのインスタンスタグキーをすべて取得しています。
[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/tags/instance
Environment
[ec2-user ~]$
curl http://169.254.169.254/latest/meta-data/tags/instance
Environment
次の例では、前の例で取得した
Name
キーの値を取得しています。IMDSv2 リクエストは、前の例のコマンドで作成された保管済みトークン (期限内であると仮定) を使用します。
[ec2-user ~]$
curl -H "X-aws-ec2-metadata-token: $TOKEN" http://169.254.169.254/latest/meta-data/tags/instance/Name
MyInstance
[ec2-user ~]$
curl http://169.254.169.254/latest/meta-data/tags/instance/Name
MyInstance
クエリスロットル
クエリは IMDS でインスタンスごとにスロットリングし、インスタンスから IMDS への同時接続数を制限します。
AWS セキュリティ認証情報を取得するために IMDS を使用している場合、毎回のトランザクションで、または高頻度のスレッドやプロセスから同時に認証情報をクエリしないようにします。スロットリングの原因となる可能性があります。代わりに、認証情報をキャッシュに格納して有効期限が近づくまで待つことをお勧めします。IAM ロールとロールに関連付けられたセキュリティ認証情報の詳細については、「 インスタンスメタデータからのセキュリティ認証情報の取得 」を参照してください。
IMDS にアクセスする際にスロットリングした場合、エクスポネンシャルバックオフ戦略でクエリを再試行します。
IMDS アクセスの制限
ローカルファイアウォールルールを使って、プロセスの一部またはすべてから IMDS へのアクセスを無効化することを検討できます。
注記
AWS Nitro System 上に構築されたインスタンス
では、VPC 内のネットワークアプライアンス (仮想ルーターなど) がパケットを IMDS アドレスに転送し、インスタンス上のデフォルトの
送信元/送信先チェック
が無効な場合、ユーザー自身のネットワークから IMDS にアクセスできるようになります。VPC の外側にある送信元から IMDS に到達しないようにするには、送信先 IMDS の IPv4 アドレスが
169.254.169.254
(IPv6 エンドポイントを有効にしている場合は、IMDS の IPv6 アドレスが
[fd00:ec2::254]
) であるパケットをドロップするように、ネットワークアプライアンスの設定を変更することをお勧めします。
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 へのアクセスをルートユーザーにのみ制限しています。
$
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
$
allow tcp from any to 169.254.169.254 uid root
$
deny tcp from any to 169.254.169.254
注記
PF および IPFW コマンドの順序は重要となります。PF のデフォルトは最後に一致したルールであり、IPFW のデフォルトは最初に一致したルールです。