インスタンスメタデータサービスバージョン 2 の仕組み
IMDSv2 は、セッション指向リクエストを使用します。セッション指向リクエストを使用して、セッション期間 (1 秒~6 時間) を定義するセッショントークンを作成します。指定した期間中、それ以降のリクエストに同じセッショントークンを使用できます。指定した期間が期限切れになった後、将来のリクエストに使用する新しいセッショントークンを作成する必要があります。
注記
このセクションの例では、インスタンスメタデータサービス (IMDS) の IPv4 アドレス 169.254.169.254
を使用します。IPv6 アドレスを使用して EC2 インスタンスのインスタンスメタデータを取得する場合は、IPv6 アドレスを有効にして使用してください。[fd00:ec2::254]
。IMDS の IPv6 アドレスは、IMDSv2 コマンドと互換性があります。IPv6 アドレスは、AWS Nitro System 上に構築されたインスタンスでのみアクセス可能です。
次の例では、PowerShellシェルスクリプトとIMDSv2を使って、最上位インスタンスメタデータアイテムを取得しています。例:
-
PUT
リクエストを使って、6 時間 (21,600 秒) のセッショントークンを作成する -
セッショントークンヘッダーを
token
という名前の変数に保管する -
トークンを使って最上位メタデータアイテムをリクエストする
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 CLI コマンドを使って調整できます。例えば、インスタンスで実行されているコンテナサービスとの下位互換性のために、ホップリミットを拡大する必要がある場合があります。詳細については、「既存インスタンスのインスタンスメタデータオプションの変更」を参照してください。