全リージョンのデフォルト IMDS 設定を AWS CLI で設定してみる

2024.04.12

AWS CLI を利用して全てのリージョンで IMDS のデフォルト設定を試してみます。

IMDS のデフォルト設定については次のブログで詳しく紹介されています。また、CloudFormation Custom Resource を利用して設定する方法も紹介されています。

AWS CLI でデフォルト IMDS を設定する

デフォルト IMDS はmodify-instance-metadata-defaultsコマンドで設定できます。


全てのリージョンで下記の設定に変更したい場合のコマンドを示します。他の値に設定にしたい場合は上記のコマンドリファレンスを見てオプションの値を変えることで可能です。

  • インスタンスメタデータサービス 有効
  • Metadata version V2 only (token ewquired)
  • Access to tags in metadata 無効
  • メタデータレスポンスのホップ制限 No reference
aws ec2 describe-regions --query "Regions[].[RegionName]" --output text \
| while read region; do
  echo "### Modify instance metadata defaults in ${region}"
  aws ec2 modify-instance-metadata-defaults \
    --http-endpoint enabled \
    --http-tokens required \
    --instance-metadata-tags disabled \
    --http-put-response-hop-limit -1 \
    --region ${region}
done

メタデータレスポンスのホップ制限を設定するhttp-put-response-hop-limit-1を指定することで、No referenceとして設定されます。コマンドのリファレンスには記載がないのですが、試しに0を設定してみた際にエラーメッセージで説明がありました。

An error occurred (InvalidParameterValue) when calling the ModifyInstanceMetadataDefaults operation: Invalid value for HttpPutResponseHopLimit. Expecting 1-64, or -1 for no-preference.


また、ホップ制限はコンテナ環境では2を設定することがおすすめされています。

コンテナ環境では、ホップ制限を 2 に設定することをお勧めします。

AWS SDK はデフォルトで IMDSv2 コールを使用します。IMDSv2 呼び出しに応答がない場合、SDK は呼び出しを再試行し、それでも失敗した場合は、IMDSv1 を使用します。これにより、特にコンテナ環境では、遅延が発生することがあります。コンテナ環境では、ホップ制限が 1 の場合、コンテナへの到達は余分なネットワークホップと見なされるため、IMDSv2 応答は返されません。IMDSv1 へのフォールバックプロセスとその結果として生じる遅延を回避するために、コンテナ環境でホップ制限を 2 に設定することをお勧めします。詳細については、「インスタンスメタデータオプションの設定」を参照してください。

(引用元)インスタンスメタデータの取得 - Amazon Elastic Compute Cloud


アカウントレベルでホップ制限を指定していない、かつ、起動時にメタデータオプションを指定していない場合は、AMI の設定が優先されるようなので、今回は AMI 設定を優先としてみました。

インスタンスメタデータオプションの優先順位


全てのリージョンの設定を確認する場合は次のコマンドで確認できます。

aws ec2 describe-regions --query "Regions[].[RegionName]" --output text \
| while read region; do
  echo "### Get instance metadata defaults in ${region}"
  aws ec2 get-instance-metadata-defaults --region ${region}
done


ここからは、コマンドの実行結果例を記載します。

始めに、設定コマンドの実行結果例です。

$ aws ec2 describe-regions --query "Regions[].[RegionName]" --output text \
> | while read region; do
>   echo "### Modify instance metadata defaults in ${region}"
>   aws ec2 modify-instance-metadata-defaults \
>     --http-endpoint enabled \
>     --http-tokens required \
>     --instance-metadata-tags disabled \
>     --http-put-response-hop-limit -1 \
>     --region ${region}
> done
### Modify instance metadata defaults in ap-south-1
{
    "Return": true
}
### Modify instance metadata defaults in eu-north-1
{
    "Return": true
}
### Modify instance metadata defaults in eu-west-3
{
    "Return": true
}
### Modify instance metadata defaults in eu-west-2
{
    "Return": true
}
### Modify instance metadata defaults in eu-west-1
{
    "Return": true
}
### Modify instance metadata defaults in ap-northeast-3
{
    "Return": true
}
### Modify instance metadata defaults in ap-northeast-2
{
    "Return": true
}
### Modify instance metadata defaults in ap-northeast-1
{
    "Return": true
}
### Modify instance metadata defaults in ca-central-1
{
    "Return": true
}
### Modify instance metadata defaults in sa-east-1
{
    "Return": true
}
### Modify instance metadata defaults in ap-southeast-1
{
    "Return": true
}
### Modify instance metadata defaults in ap-southeast-2
{
    "Return": true
}
### Modify instance metadata defaults in eu-central-1
{
    "Return": true
}
### Modify instance metadata defaults in us-east-1
{
    "Return": true
}
### Modify instance metadata defaults in us-east-2
{
    "Return": true
}
### Modify instance metadata defaults in us-west-1
{
    "Return": true
}
### Modify instance metadata defaults in us-west-2
{
    "Return": true
}

次に、設定確認コマンドの実行結果例です。

$ aws ec2 describe-regions --query "Regions[].[RegionName]" --output text \
> | while read region; do
>   echo "### Get instance metadata defaults in ${region}"
>   aws ec2 get-instance-metadata-defaults --region ${region}
> done
### Get instance metadata defaults in ap-south-1
{
    "AccountLevel": {
        "HttpTokens": "required",
        "HttpEndpoint": "enabled",
        "InstanceMetadataTags": "disabled"
    }
}
### Get instance metadata defaults in eu-north-1
{
    "AccountLevel": {
        "HttpTokens": "required",
        "HttpEndpoint": "enabled",
        "InstanceMetadataTags": "disabled"
    }
}
### Get instance metadata defaults in eu-west-3
{
    "AccountLevel": {
        "HttpTokens": "required",
        "HttpEndpoint": "enabled",
        "InstanceMetadataTags": "disabled"
    }
}
### Get instance metadata defaults in eu-west-2
{
    "AccountLevel": {
        "HttpTokens": "required",
        "HttpEndpoint": "enabled",
        "InstanceMetadataTags": "disabled"
    }
}
### Get instance metadata defaults in eu-west-1
{
    "AccountLevel": {
        "HttpTokens": "required",
        "HttpEndpoint": "enabled",
        "InstanceMetadataTags": "disabled"
    }
}
### Get instance metadata defaults in ap-northeast-3
{
    "AccountLevel": {
        "HttpTokens": "required",
        "HttpEndpoint": "enabled",
        "InstanceMetadataTags": "disabled"
    }
}
### Get instance metadata defaults in ap-northeast-2
{
    "AccountLevel": {
        "HttpTokens": "required",
        "HttpEndpoint": "enabled",
        "InstanceMetadataTags": "disabled"
    }
}
### Get instance metadata defaults in ap-northeast-1
{
    "AccountLevel": {
        "HttpTokens": "required",
        "HttpEndpoint": "enabled",
        "InstanceMetadataTags": "disabled"
    }
}
### Get instance metadata defaults in ca-central-1
{
    "AccountLevel": {
        "HttpTokens": "required",
        "HttpEndpoint": "enabled",
        "InstanceMetadataTags": "disabled"
    }
}
### Get instance metadata defaults in sa-east-1
{
    "AccountLevel": {
        "HttpTokens": "required",
        "HttpEndpoint": "enabled",
        "InstanceMetadataTags": "disabled"
    }
}
### Get instance metadata defaults in ap-southeast-1
{
    "AccountLevel": {
        "HttpTokens": "required",
        "HttpEndpoint": "enabled",
        "InstanceMetadataTags": "disabled"
    }
}
### Get instance metadata defaults in ap-southeast-2
{
    "AccountLevel": {
        "HttpTokens": "required",
        "HttpEndpoint": "enabled",
        "InstanceMetadataTags": "disabled"
    }
}
### Get instance metadata defaults in eu-central-1
{
    "AccountLevel": {
        "HttpTokens": "required",
        "HttpEndpoint": "enabled",
        "InstanceMetadataTags": "disabled"
    }
}
### Get instance metadata defaults in us-east-1
{
    "AccountLevel": {
        "HttpTokens": "required",
        "HttpEndpoint": "enabled",
        "InstanceMetadataTags": "disabled"
    }
}
### Get instance metadata defaults in us-east-2
{
    "AccountLevel": {
        "HttpTokens": "required",
        "HttpEndpoint": "enabled",
        "InstanceMetadataTags": "disabled"
    }
}
### Get instance metadata defaults in us-west-1
{
    "AccountLevel": {
        "HttpTokens": "required",
        "HttpEndpoint": "enabled",
        "InstanceMetadataTags": "disabled"
    }
}
### Get instance metadata defaults in us-west-2
{
    "AccountLevel": {
        "HttpTokens": "required",
        "HttpEndpoint": "enabled",
        "InstanceMetadataTags": "disabled"
    }
}

以上で終わりです。

さいごに

IMDS のデフォルト設定を AWS CLI で試してみました。IMDS V2 を利用することは AWS Security Hub セキュリティ基準「AWS 基礎セキュリティのベストプラクティス v1.0.0」における[EC2.8] EC2 instances should use Instance Metadata Service Version 2 (IMDSv2)のコントロールにもなっており、意識しておきたい設定となります。

以上、このブログがどなたかのご参考になれば幸いです。