新規インスタンスのインスタンスメタデータオプションの設定
新規インスタンスに、以下のインスタンスメタデータオプションを設定できます。
次の方法を使用して、新しいインスタンスで IMDSv2 の使用を必須にすることができます。
IMDSv2 をアカウントのデフォルトとして設定する
インスタンスメタデータサービス (IMDS) のデフォルトバージョンは、各 AWS リージョンのアカウントレベルで設定できます。つまり、新規インスタンスを起動すると、そのインスタンスメタデータバージョンは自動的にアカウントレベルのデフォルトに設定されます。ただし、起動時または起動後に値を手動で上書きできます。アカウントレベルの設定と手動オーバーライドがインスタンスに与える影響の詳細については、「インスタンスメタデータオプションの優先順位」を参照してください。
アカウントレベルのデフォルトを設定しても、既存のインスタンスはリセットされません。たとえば、アカウントレベルのデフォルトを IMDSv2 に設定しても、IMDSv1 に設定されている既存のインスタンスは影響を受けません。既存のインスタンスの値を変更する場合は、インスタンス自体の値を手動で変更する必要があります。
インスタンスメタデータバージョンのアカウントのデフォルトを IMDSv2 に設定すると、アカウント内のすべての新しいインスタンスを IMDSv2 で起動できます。そうすると、IMDSv1 は無効になります。このアカウントデフォルトでは、インスタンスを起動すると、インスタンスのデフォルト値は次のようになります。
アカウントのデフォルトを IMDSv2 に設定する前に、インスタンスが IMDSv1 に依存していないことを確認してください。詳細については、「IMDSv2 を必要とする推奨パス」を参照してください。
- Console
-
指定したリージョンのアカウントのデフォルトとして IMDSv2 を設定するには
Amazon EC2 コンソール (https://console.aws.amazon.com/ec2/) を開きます。
-
AWS リージョン を変更するには、ページの右上隅にあるリージョンセレクターを使用します。
-
ナビゲーションペインで、[EC2 ダッシュボード] を選択します。
-
[アカウントの属性] で [データ保護とセキュリティ] を選択します。
-
[IMDS のデフォルト] の横にある [管理] を選択します。
-
[IMDS のデフォルトを管理] ページで、次の操作を実行します。
-
[インスタンスメタデータサービス] で、[有効にする] を選択します。
-
[Metadata version] (メタデータバージョン) には、[V2 only (token required)] (V2 のみ (トークンが必要)) を選択します。
-
インスタンスがコンテナをホストする場合は、[メタデータレスポンスのホップ制限] で 2 を指定します。それ以外の場合は、[設定なし] を選択します。設定なしが指定されているとき、AMI が IMDSv2 を必要とする場合は、起動時の値がデフォルトで [2] になります。それ以外の場合は、デフォルトで [1] になります。
-
[Update] (更新) を選択します。
- AWS CLI
-
指定したリージョンのアカウントのデフォルトとして IMDSv2 を設定するには
modify-instance-metadata-defaults コマンドを使用して、IMDS アカウントレベルの設定を変更するリージョンを指定します。インスタンスがコンテナをホストする場合は、--http-tokens
を required
に、--http-put-response-hop-limit
を 2
に設定します。それ以外の場合は、-1
を指定して、設定がないことを示します。-1
(設定なし) が指定されているとき、AMI が IMDSv2 を必要とする場合は、起動時の値がデフォルトで 2
になります。それ以外の場合は、デフォルトで 1
になります。
aws ec2 modify-instance-metadata-defaults \
--region us-east-1
\
--http-tokens required \
--http-put-response-hop-limit 2
正常な出力
{
"Return": true
}
指定したリージョンのインスタンスメタデータオプションのデフォルトのアカウント設定を表示するには
get-instance-metadata-defaults コマンドを使用して、リージョンを指定します。
aws ec2 get-instance-metadata-defaults --region us-east-1
出力例
{
"AccountLevel": {
"HttpTokens": "required",
"HttpPutResponseHopLimit": 2
}
}
すべてのリージョンのアカウントのデフォルトとして IMDSv2 を設定するには
すべてのリージョンの IMDS アカウントレベル設定を変更するには、modify-instance-metadata-defaults コマンドを使用します。インスタンスがコンテナをホストする場合は、--http-tokens
を required
に、--http-put-response-hop-limit
を 2
に設定します。それ以外の場合は、-1
を指定して、設定がないことを示します。-1
(設定なし) が指定されているとき、AMI が IMDSv2 を必要とする場合は、起動時の値がデフォルトで 2
になります。それ以外の場合は、デフォルトで 1
になります。
echo -e "Region \t Modified" ; \
echo -e "-------------- \t ---------" ; \
for region in $(
aws ec2 describe-regions \
--region us-east-1 \
--query "Regions[*].[RegionName]" \
--output text
);
do (output=$(
aws ec2 modify-instance-metadata-defaults \
--region $region \
--http-tokens required \
--http-put-response-hop-limit 2
\
--output text)
echo -e "$region \t $output"
);
done
正常な出力
Region Modified
-------------- ---------
ap-south-1 True
eu-north-1 True
eu-west-3 True
...
すべてのリージョンのインスタンスメタデータオプションのデフォルトアカウント設定を表示するには
get-instance-metadata-defaults コマンドを使用します。
echo -e "Region \t Level Hops HttpTokens" ; \
echo -e "-------------- \t ------------ ---- ----------" ; \
for region in $(
aws ec2 describe-regions \
--region us-east-1 \
--query "Regions[*].[RegionName]" \
--output text
);
do (output=$(
aws ec2 get-instance-metadata-defaults \
--region $region \
--output text)
echo -e "$region \t $output"
);
done
正常な出力
Region Level Hops HttpTokens
-------------- ------------ ---- ----------
ap-south-1 ACCOUNTLEVEL 2 required
eu-north-1 ACCOUNTLEVEL 2 required
eu-west-3 ACCOUNTLEVEL 2 required
...
- PowerShell
-
指定したリージョンのアカウントのデフォルトとして IMDSv2 を設定するには
Edit-EC2InstanceMetadataDefault コマンドを使用して、IMDS アカウントレベルの設定を変更するリージョンを指定します。インスタンスがコンテナをホストする場合は、-HttpToken
を required
に、-HttpPutResponseHopLimit
を 2
に設定します。それ以外の場合は、-1
を指定して、設定がないことを示します。-1
(設定なし) が指定されているとき、AMI が IMDSv2 を必要とする場合は、起動時の値がデフォルトで 2
になります。それ以外の場合は、デフォルトで 1
になります。
Edit-EC2InstanceMetadataDefault `
-Region us-east-1
`
-HttpToken required `
-HttpPutResponseHopLimit 2
正常な出力
True
指定したリージョンのインスタンスメタデータオプションのデフォルトのアカウント設定を表示するには
Get-EC2InstanceMetadataDefault コマンドを使用して、リージョンを指定します。
Get-EC2InstanceMetadataDefault -Region us-east-1
| Format-List
出力例
HttpEndpoint :
HttpPutResponseHopLimit : 2
HttpTokens : required
InstanceMetadataTags :
すべてのリージョンのアカウントのデフォルトとして IMDSv2 を設定するには
Edit-EC2InstanceMetadataDefault コマンドレットを使用して、すべてのリージョンの IMDS アカウントレベル設定を変更します。インスタンスがコンテナをホストする場合は、-HttpToken
を required
に、-HttpPutResponseHopLimit
を 2
に設定します。それ以外の場合は、-1
を指定して、設定がないことを示します。-1
(設定なし) が指定されているとき、AMI が IMDSv2 を必要とする場合は、起動時の値がデフォルトで 2
になります。それ以外の場合は、デフォルトで 1
になります。
(Get-EC2Region).RegionName | `
ForEach-Object {
[PSCustomObject]@{
Region = $_
Modified = (Edit-EC2InstanceMetadataDefault `
-Region $_ `
-HttpToken required `
-HttpPutResponseHopLimit 2
)
}
} | `
Format-Table Region, Modified -AutoSize
正常な出力
Region Modified
------ --------
ap-south-1 True
eu-north-1 True
eu-west-3 True
...
すべてのリージョンのインスタンスメタデータオプションのデフォルトアカウント設定を表示するには
Get-EC2InstanceMetadataDefault コマンドレットを使用します。
(Get-EC2Region).RegionName | `
ForEach-Object {
[PSCustomObject]@{
Region = $_
HttpPutResponseHopLimit = (Get-EC2InstanceMetadataDefault -Region $_).HttpPutResponseHopLimit
HttpTokens = (Get-EC2InstanceMetadataDefault -Region $_).HttpTokens
}
} | `
Format-Table -AutoSize
出力例
Region HttpPutResponseHopLimit HttpTokens
------ ----------------------- ----------
ap-south-1 2 required
eu-north-1 2 required
eu-west-3 2 required
...
インスタンスを起動する際に、以下のフィールドを設定しておくことで、IMDSv2 が使用されるようにそのインスタンスを構成できます。
IMDSv2 が必須であることを指定する場合、[メタデータにアクセス可能] に [有効] (コンソールの場合) を設定するか、HttpEndpoint
に enabled
(AWS CLI の場合) を設定して、インスタンスメタデータサービス (IMDS) のエンドポイントも有効にする必要があります。
コンテナ環境では、IMDSv2 が要求されている場合、ホップ制限を 2
に設定することをお勧めします。詳細については、「インスタンスメタデータアクセス考慮事項」を参照してください。
- Console
-
新しいインスタンスで IMDSv2 の使用を要求するには
- AWS CLI
-
新しいインスタンスで IMDSv2 の使用を要求するには
次の run-instances の例では、c6i.large
を --metadata-options
に設定して HttpTokens=required
インスタンスを起動します。HttpTokens
の値を指定する場合は、HttpEndpoint
も enabled
に設定する必要があります。メタデータの取得リクエストでは、セキュリティで保護されたトークンヘッダーは required
に設定されるので、インスタンスメタデータのリクエストに際しては、そのインスタンスは必ず IMDSv2 を使用することになります。
コンテナ環境では、IMDSv2 が要求されている場合、HttpPutResponseHopLimit=2
を使用してホップ制限を 2
に設定することをお勧めします。
aws ec2 run-instances \
--image-id ami-0abcdef1234567890
\
--instance-type c6i.large
\
...
--metadata-options "HttpEndpoint=enabled,HttpTokens=required,HttpPutResponseHopLimit=2"
- PowerShell
-
新しいインスタンスで IMDSv2 の使用を要求するには
次の New-EC2Instance コマンドレットの例では、MetadataOptions_HttpEndpoint
を enabled
に、MetadataOptions_HttpTokens
パラメータを required
に設定して c6i.large
インスタンスを起動します。HttpTokens
の値を指定する場合は、HttpEndpoint
も enabled
に設定する必要があります。メタデータの取得リクエストでは、セキュリティで保護されたトークンヘッダーは required
に設定されるので、インスタンスメタデータのリクエストに際しては、そのインスタンスは必ず IMDSv2 を使用することになります。
New-EC2Instance `
-ImageId ami-0abcdef1234567890
`
-InstanceType c6i.large
`
-MetadataOptions_HttpEndpoint enabled `
-MetadataOptions_HttpTokens required
- AWS CloudFormation
-
AWS CloudFormation を使用してインスタンスのメタデータオプションを指定するには、「AWS CloudFormation ユーザーガイド」の「AWS::EC2::LaunchTemplate MetadataOptions」プロパティを参照してください。
新しい AMI を登録したり、既存の AMI を変更したりするときに、imds-support
パラメータを v2.0
に設定できます。この AMI から起動されたインスタンスでは、[Metadata version] (メタデータバージョン) に V2 only (token required)] (V2 のみ (トークンが必要)) (コンソールの場合) が設定されるか、HttpTokens
に required
(AWS CLI の場合) が設定されます。この設定が行われている場合、インスタンスメタデータがリクエストされる際には IMDSv2 を使用することが、インスタンスでの必須になります。
この AMI から起動されるインスタンスでは、imds-support
に v2.0
を設定している場合、[Metadata response hop limit] (メタデータレスポンスのホップ制限) (コンソールの場合)、または http-put-response-hop-limit
(AWS CLI の場合) が「2」に設定されることに注意してください。
ご使用の AMI ソフトウェアが IMDSv2 をサポートしていない限りは、このパラメータを使用しないでください。値を v2.0
に設定すると、元に戻すことはできません。AMI を「リセット」する唯一の方法は、基礎となるスナップショットから新しい AMI を作成することです。
IMDSv2 向けに AMI を新たに設定するには
IMDSv2 に新しい AMI を設定するには、次のいずれかの方法を使用します。
- AWS CLI
-
以下の register-image の例では、EBS ルートボリュームの指定されたスナップショットをデバイス /dev/xvda
として使用して、AMI を登録しています。imds-support
パラメータ用に v2.0
を指定し、この AMI から起動するインスタンスに対して、インスタンスメタデータのリクエスト時に IMDSv2 を使用することが、この AMI から起動されるインスタンスでの必須になります。
aws ec2 register-image \
--name my-image
\
--root-device-name /dev/xvda \
--block-device-mappings DeviceName=/dev/xvda,Ebs={SnapshotId=snap-0123456789example
} \
--architecture x86_64 \
--imds-support v2.0
- PowerShell
-
次の Register-EC2Image コマンドレットの例では、EBS ルートボリュームの指定されたスナップショットをデバイス /dev/xvda
として使用して、AMI を登録しています。ImdsSupport
パラメータ用に v2.0
を指定し、この AMI から起動するインスタンスに対して、インスタンスメタデータのリクエスト時に IMDSv2 を使用することが、この AMI から起動されるインスタンスでの必須になります。
Register-EC2Image `
-Name 'my-image
' `
-RootDeviceName /dev/xvda `
-BlockDeviceMapping (
New-Object `
-TypeName Amazon.EC2.Model.BlockDeviceMapping `
-Property @{
DeviceName = '/dev/xvda';
EBS = (New-Object -TypeName Amazon.EC2.Model.EbsBlockDevice -Property @{
SnapshotId = 'snap-0123456789example
'
VolumeType = 'gp3'
} )
} ) `
-Architecture X86_64 `
-ImdsSupport v2.0
IMDSv2 向けに既存の AMI を設定するには
IMDSv2 向けに既存の AMI を設定するには、次のいずれかの方法を使用します。
- AWS CLI
-
次の modify-image-attribute の例では、IMDSv2 用の既存の AMI のみを変更します。imds-support
パラメータ用に v2.0
を指定し、この AMI から起動するインスタンスに対して、インスタンスメタデータのリクエスト時に IMDSv2 を使用することが、この AMI から起動されるインスタンスでの必須になります。
aws ec2 modify-image-attribute \
--image-id ami-0123456789example
\
--imds-support v2.0
- PowerShell
-
次の Edit-EC2ImageAttribute コマンドレットの例では、IMDSv2 用の既存の AMI のみを変更します。imds-support
パラメータ用に v2.0
を指定し、この AMI から起動するインスタンスに対して、インスタンスメタデータのリクエスト時に IMDSv2 を使用することが、この AMI から起動されるインスタンスでの必須になります。
Edit-EC2ImageAttribute `
-ImageId ami-0abcdef1234567890
`
-ImdsSupport 'v2.0'
IMDSv2 の使用が必須ではない新しいインスタンスをユーザーが起動できないように、IAM ポリシーを作成することもできます。
IAM ポリシーにより、すべての新しいインスタンスでの IMDSv2 の使用を必須にするには
ユーザーがインスタンスメタデータをリクエストする際に IMDSv2 の使用を義務付けるインスタンスみを起動できるようにするには、IMDSv2 を必要とする条件が満たされないとインスタンスを起動できないように指定することができます。IAM ポリシーの例については、「インスタンスメタデータの使用」を参照してください。
IMDS のインスタンスには、IPv4 (169.254.169.254
) と IPv6 ([fd00:ec2::254]
) という 2 つのエンドポイントがあります。IMDS を有効にすると、IPv4 エンドポイントが自動的に有効になります。IPv6 専用サブネットに対してインスタンスを起動しても、その IPv6 エンドポイントは無効のままになります。IPv6 エンドポイントを有効にするには、明示的に有効にする必要があります。IPv6 エンドポイントを有効にしても、IPv4 エンドポイントは有効なままになります。
IPv6 エンドポイントは、インスタンス起動時またはその後に有効にできます。
IMDS IPv6 エンドポイント対応のインスタンスを起動するには、以下のいずれかの方法を使用します。
- Console
-
インスタンス起動時に IMDS IPv6 エンドポイントを有効にするには
詳細については、「高度な詳細」を参照してください。
- AWS CLI
-
インスタンス起動時に IMDS IPv6 エンドポイントを有効にするには
以下の run-instances の例では、IMDS 用に IPv6 エンドポイントが有効化された、c6i.large
インスタンスを起動しています。IPv6 エンドポイントを有効にするには、--metadata-options
パラメータに HttpProtocolIpv6=enabled
を指定します。HttpProtocolIpv6
の値を指定する場合は、HttpEndpoint
も enabled
に設定する必要があります。
aws ec2 run-instances \
--image-id ami-0abcdef1234567890
\
--instance-type c6i.large
\
...
--metadata-options "HttpEndpoint=enabled,HttpProtocolIpv6=enabled"
- PowerShell
-
インスタンス起動時に IMDS IPv6 エンドポイントを有効にするには
次の New-EC2Instance コマンドレットの例では、IMDS 用に IPv6 エンドポイントが有効化された、c6i.large
インスタンスを起動しています。IPv6 エンドポイントを有効にするには、MetadataOptions_HttpProtocolIpv6
を enabled
に指定します。MetadataOptions_HttpProtocolIpv6
の値を指定する場合は、MetadataOptions_HttpEndpoint
も enabled
に設定する必要があります。
New-EC2Instance `
-ImageId ami-0abcdef1234567890
`
-InstanceType c6i.large
`
-MetadataOptions_HttpEndpoint enabled `
-MetadataOptions_HttpProtocolIpv6 enabled
インスタンスを起動するときに IMDS を無効にすることで、インスタンスのメタデータへのアクセスを無効にできます。IMDS を再度有効にすると、その後でアクセスを有効にできます。詳細については、「インスタンスメタデータへのアクセスを有効にする」を参照してください。
IMDS は起動時または起動後に無効化できます。起動時に IMDS を無効にすると、以下が機能しなくなる可能性があります。
-
インスタンスへの SSH アクセスがない可能性があります。キーは通常 EC2 インスタンスのメタデータから提供され、アクセスされるため、インスタンスのパブリック SSH キーである public-keys/0/openssh-key
にはアクセスできません。
-
EC2 ユーザーデータは利用できず、インスタンスの起動時には実行されません。EC2 ユーザーデータは IMDS でホストされます。IMDS を無効にすると、ユーザーデータへのアクセスは事実上無効になります。
この機能にアクセスするには、起動後に IMDS を再度有効にします。
- Console
-
起動時にインスタンスメタデータへのアクセスを無効にするには
詳細については、「高度な詳細」を参照してください。
- AWS CLI
-
起動時にインスタンスメタデータへのアクセスを無効にするには
--metadata-options
に HttpEndpoint=disabled
を設定し、インスタンスを起動します。
aws ec2 run-instances \
--image-id ami-0abcdef1234567890
\
--instance-type c6i.large
\
...
--metadata-options "HttpEndpoint=disabled"
- PowerShell
-
起動時にインスタンスメタデータへのアクセスを無効にするには
次の New-EC2Instance コマンドレットの例では、MetadataOptions_HttpEndpoint
を disabled
に設定してインスタンスを起動します。
New-EC2Instance `
-ImageId ami-0abcdef1234567890
`
-InstanceType c6i.large
`
-MetadataOptions_HttpEndpoint disabled
- AWS CloudFormation
-
AWS CloudFormation を使用してインスタンスのメタデータオプションを指定するには、「AWS CloudFormation ユーザーガイド」の「AWS::EC2::LaunchTemplate MetadataOptions」プロパティを参照してください。