

# インスタンスメタデータサービスバージョン 2 の使用への移行
<a name="instance-metadata-transition-to-version-2"></a>

インスタンスメタデータサービスバージョン 2 (IMDSv2) 呼び出しのみを許可するようにインスタンスを設定する場合は、次のツールと移行パスを使用することをお勧めします。

**Topics**
+ [IMDSv2 に移行するためのツール](#tools-for-transitioning-to-imdsv2)
+ [IMDSv2 を必要とする推奨パス](#recommended-path-for-requiring-imdsv2)

## IMDSv2 に移行するためのツール
<a name="tools-for-transitioning-to-imdsv2"></a>

次のツールは、IMDSv1 から IMDSv2 へのソフトウェアの移行を特定、モニタリング、管理するのに役立ちます。これらのツールの使用方法については、「[IMDSv2 を必要とする推奨パス](#recommended-path-for-requiring-imdsv2)」を参照してください。

**AWS ソフトウェア**  
最新バージョンの AWS CLI および AWS SDK ではIMDSv2 をサポートしています。IMDSv2 を使用するには、EC2 インスタンスを更新して最新バージョンを使用してください。IMDSv2 をサポートする最低限の AWS SDK バージョンについては「[サポートされる AWS SDK を使用する](configuring-instance-metadata-service.md#use-a-supported-sdk-version-for-imdsv2)」を参照してください。  
すべての Amazon Linux 2 と Amazon Linux 2023 ソフトウェアパッケージが IMDSv2 をサポートしています。Amazon Linux 2023 では、IMDSv1 はデフォルトで無効になっています。

**IMDS パケットアナライザー**  
IMDS パケットアナライザーは、インスタンスの起動フェーズおよびランタイムオペレーション時の IMDSv1 呼び出しを特定してログに記録する、オープンソースツールです。これらのログを解析すると、お使いのインスタンスで IMDSv1 呼び出しを行うソフトウェアを正確に特定し、お使いのインスタンスでのみ IMDSv2 をサポートするために更新する必要があるものを特定できます。IMDS パケットアナライザーはコマンドラインから実行することも、サービスとしてインストールすることもできます。詳細については*GitHub* の [AWS ImdsPacketAnalyzer](https://github.com/aws/aws-imds-packet-analyzer) のページを参照してください

**CloudWatch**  
CloudWatch では、インスタンスのモニタリング用に次の 2 つのメトリクスが用意されています。  
`MetadataNoToken` – IMDSv2 はトークンベースのセッションを使用します。ただし、IMDSv1 はこれを使用しません。`MetadataNoToken` メトリクスは IMDSv1 を使用しているインスタンスメタデータサービス (IMDS) への呼び出しの数を追跡します。このメトリクスをゼロまでトラッキングすることにより、すべてのソフトウェアが IMDSv2 を使用するようアップグレードされたかどうか、およびいつアップデートが行われたかを測定できます。  
`MetadataNoTokenRejected` – IMDSv1 を無効にした後、`MetadataNoTokenRejected` メトリクスを使用して、IMDSv1 呼び出しが試行および拒否された回数を追跡できます。このメトリクスを追跡することで、IMDSv2 を使用するようにソフトウェアを更新する必要があるかどうかを確認できます。  
各 EC2 インスタンスのこれらのメトリクスは相互排他的です。IMDSv1 が有効になっている場合 (`httpTokens = optional`) は、`MetadataNoToken` のみが出力されます。IMDSv1 が無効になっている場合 (`httpTokens = required`) は、`MetadataNoTokenRejected` のみが出力されます。これらのメトリクスをいつ使用すべきかについては、「[IMDSv2 を必要とする推奨パス](#recommended-path-for-requiring-imdsv2)」を参照してください。  
詳細については「[インスタンスメトリクス](viewing_metrics_with_cloudwatch.md#ec2-cloudwatch-metrics)」を参照してください。

**API の起動**  
**新しいインスタンス:** [RunInstances](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_RunInstances.html) API を使用して、IMDSv2 の使用を必須とする新しいインスタンスを起動します。詳細については「[新規インスタンスのインスタンスメタデータオプションの設定](configuring-IMDS-new-instances.md)」を参照してください。  
**既存のインスタンス:** [ModifyInstanceMetadataOptions](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_ModifyInstanceMetadataOptions.html) API を使用して、既存のインスタンスでの IMDSv2 の使用を必須にします。詳細については「[既存インスタンスのインスタンスメタデータオプションの変更](configuring-IMDS-existing-instances.md)」を参照してください。  
**Auto Scaling グループによって起動された新しいインスタンス:** Auto Scaling グループによって起動されたすべての新しいインスタンスで IMDSv2 の使用を必須とするには、Auto Scaling グループで起動テンプレートまたは起動設定を使用できます。[起動テンプレートの作成](https://docs.aws.amazon.com/cli/latest/reference/ec2/create-launch-template.html)時や[起動設定の作成](https://docs.aws.amazon.com/cli/latest/reference/autoscaling/create-launch-configuration.html)時に、IMDSv2 の使用が必須となるように `MetadataOptions` パラメータを設定する必要があります。Auto Scaling グループは新しい起動テンプレートまたは起動設定を使用して新しいインスタンスは新しいインスタンスを起動しますが、既存のインスタンスは影響を受けません。  
**Auto Scaling グループ内の既存のインスタンス**: [ModifyInstanceMetadataOptions](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_ModifyInstanceMetadataOptions.html) API を使用して、既存のインスタンスで IMDSv2 の使用を必須にします。または、インスタンスを終了すると、Auto Scaling グループが新しい起動テンプレートまたは起動設定で定義されているインスタンスメタデータオプション設定を使用して新しい代替インスタンスを起動します。

**AMI**  
`ImdsSupport` パラメータを `v2.0` に設定して構成された AMI は、デフォルトで IMDSv2 を必要とするインスタンスを起動します。Amazon Linux 2023 は `ImdsSupport = v2.0` を使用して設定されます。  
**新しい AMI:** 新しい AMI を作成するときは、[register-image](https://docs.aws.amazon.com/cli/latest/reference/ec2/register-image.html) CLI コマンドを使用して `ImdsSupport` パラメータを `v2.0` に設定します。  
**既存の AMI:** 既存の AMI を変更するときは、[modify-image-attribute](https://docs.aws.amazon.com/cli/latest/reference/ec2/modify-image-attribute.html) CLI コマンドを使用して `ImdsSupport` パラメータを `v2.0` に設定しますい。  
詳細については「[AMI を設定する](configuring-IMDS-new-instances.md#configure-IMDS-new-instances-ami-configuration)」を参照してください。

**アカウントレベルのコントロール**  
すべてのインスタンスメタデータオプションのデフォルト値をアカウントレベルで設定できます。デフォルト値は、インスタンスの起動時に自動的に適用されます。詳細については、「[IMDSv2 をアカウントのデフォルトとして設定する](configuring-IMDS-new-instances.md#set-imdsv2-account-defaults)」を参照してください。  
IMDSv2 を使用する要件をアカウントレベルで強制適用することもできます。IMDSv2 の強制適用が有効になっている場合:  
+ **新しいインスタンス:** IMDSv1 が有効化された状態で起動するように設定されたインスタンスは起動が失敗します
+ **IMDSv1 が無効になっている既存のインスタンス:** 既存のインスタンスで IMDSv1 を有効にする試みは阻止されます。
+ **IMDSv1 が有効になっている既存のインスタンス:** IMDSv1 が既に有効になっている既存のインスタンスは影響を受けません。
詳細については「[アカウントレベルで IMDSv2 を強制適用する](configuring-IMDS-new-instances.md#enforce-imdsv2-at-the-account-level)」を参照してください。

**IAM ポリシーおよび SCP**  
以下に示すように、ユーザーの管理にはIAM ポリシーを使用することも、AWS Organizations サービスコントロールポリシー (SCP) を使用することもできます。  
+ インスタンスが IMDSv2 を使用するように設定されていない限り、[RunInstances](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_RunInstances.html) API を使用してそのインスタンスを起動することはできません。
+ [ModifyInstanceMetadataOptions](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_ModifyInstanceMetadataOptions.html) API を使用して実行中のインスタンスを変更し、IMDSv1 を再度有効にすることはできません。
IAM ポリシーまたは SCP には次の IAM 条件キーを含める必要があります。  
+ `ec2:MetadataHttpEndpoint`
+ `ec2:MetadataHttpPutResponseHopLimit`
+ `ec2:MetadataHttpTokens`
API および CLI 呼び出し時のパラメータが、条件キーが含まれているポリシーで指定した状態と一致しない場合、これらの API または CLI の呼び出しは失敗し `UnauthorizedOperation` レスポンスが返されます。  
さらに、追加の保護レイヤーを選択して、IMDSv1からIMDSv2の変更を強制することもできます。EC2 ロールの認証情報経由で呼び出された各 API に関するアクセス管理レイヤーでは、IAM ポリシーまたは AWS Organizations サービスコントロールポリシー (SCP) で条件キーを使用できます。具体的にはIAM ポリシーで値 `2.0` を設定した条件キー `ec2:RoleDelivery` を使用していると、IMDSv1 から取得した EC2 ロールの認証情報を使用した API コールに対して、`UnauthorizedOperation` レスポンスが返されます。同じことはSCP によって義務付けられる条件を使ってより広く達成できます。これにより、指定した条件と一致しない API コールに対しては `UnauthorizedOperation` エラーが返されるため、実際に IMDSv1 から取得した認証情報を使用して API を呼び出すことはできなくなります。  
IAM ポリシーの例は[インスタンスメタデータの使用](ExamplePolicies_EC2.md#iam-example-instance-metadata)を参照してください。SCP の詳細については「*AWS Organizations ユーザーガイド 」の「サービスコントロ*ールポリシー [(SCPs)](https://docs.aws.amazon.com/organizations/latest/userguide/orgs_manage_policies_scps.html)」を参照してください。

**宣言型ポリシー**  
宣言型ポリシー (AWS Organizations の機能) を使用して、組織全体の IMDS アカウントデフォルト (IMDSv2 の強制適用を含む) を一元的に設定します。ポリシーの例については、「*AWS Organizations ユーザーガイド*」の「[サポートされている宣言型ポリシー](https://docs.aws.amazon.com/organizations/latest/userguide/orgs_manage_policies_declarative_syntax.html#declarative-policy-examples)」セクションにある「**インスタンスメタデータ**」タブを参照してください。

## IMDSv2 を必要とする推奨パス
<a name="recommended-path-for-requiring-imdsv2"></a>

**Topics**
+ [ステップ 1: IMDSv2=optional を使用するインスタンスを特定し、IMDSv1 の使用状況を監査する](#path-step-1)
+ [ステップ 2: ソフトウェアを IMDSv2 に更新する](#path-step-2)
+ [ステップ 3: インスタンスで IMDSv2 を要求する](#path-step-3)
+ [ステップ 4: IMDSv2=required をデフォルトとして設定する](#path-step-4)
+ [ステップ 5: インスタンスに IMDSv2 を要求するように強制する](#path-step-5)

### ステップ 1: IMDSv2=optional を使用するインスタンスを特定し、IMDSv1 の使用状況を監査する
<a name="path-step-1"></a>

IMDSv2 移行の範囲を評価するには、IMDSv1 または IMDSv2 のいずれかを許可するように設定されたインスタンスを特定し、IMDSv1 呼び出しを監査します。

1. **IMDSv1 または IMDSv2 のいずれかを許可するように設定されたインスタンスを特定する:**

------
#### [ Amazon EC2 console ]

   1. Amazon EC2 コンソールの [https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/) を開いてください。

   1. ナビゲーションペインで、**[Instances]** (インスタンス) を選択してください。

   1. IMDSv1 または IMDSv2 を許可するように設定されたインスタンスのみを表示するには、フィルター「**IMDSv2 = optional**」を追加します。

   1. または、IMDSv2 がすべてのインスタンスで**オプション**か**必須**かを確認するには、**[設定]** ウィンドウ (歯車アイコン) を開き、**[IMDSv2]** をオンにして **[確認]** を選択します。これにより **IMDSv2** 列が**インスタンス**テーブルに追加されます。

------
#### [ AWS CLI ]

   [describe-instances](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/ec2/modify-instance-metadata-options.html) コマンドを使用して、次のように `metadata-options.http-tokens = optional` でフィルタリングします。

   ```
   aws ec2 describe-instances --filters "Name=metadata-options.http-tokens,Values=optional" --query "Reservations[*].Instances[*].[InstanceId]" --output text
   ```

------

1. **各インスタンスで IMDSv1 呼び出しを監査する:**

   CloudWatch メトリクス `MetadataNoToken` を使用します。このメトリクスはインスタンスの IMDS に対する IMDSv1 呼び出しの数を示します。詳細については、「[インスタンスのメトリクス](https://docs.aws.amazon.com/en_us/AWSEC2/latest/UserGuide/viewing_metrics_with_cloudwatch.html#ec2-cloudwatch-metrics)」を参照してください。

1. **IMDSv1 呼び出しを行うインスタンス上のソフトウェアを特定する:**

   オープンソースの [IMDS パケットアナライザー](https://github.com/aws/aws-imds-packet-analyzer)を使用して、インスタンスの起動フェーズおよびランタイムオペレーション中に IMDSv1 呼び出しを特定し、ログに記録します。この情報を使用して、更新するソフトウェアを特定し、インスタンスが IMDSv2 のみを使用する準備を行います。IMDS パケットアナライザーはコマンドラインから実行することも、サービスとしてインストールすることもできます。

### ステップ 2: ソフトウェアを IMDSv2 に更新する
<a name="path-step-2"></a>

インスタンスでロール認証情報を使用するすべてのSDK、CLI、ソフトウェアを IMDSv2 対応バージョンに更新します。詳細については *AWS Command Line Interface ユーザーガイド」の「[AWS CLI の最新バージョンをインストールまたは更新](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html)」を参照してください*。

### ステップ 3: インスタンスで IMDSv2 を要求する
<a name="path-step-3"></a>

`MetadataNoToken` メトリクスを通じて IMDSv1 呼び出しがゼロになったことを確認したら、IMDSv2 を要求するように既存のインスタンスを設定します。また、IMDSv2 を要求するようにすべての新しいインスタンスを設定します。つまり、すべての既存のインスタンスと新しいインスタンスで IMDSv1 を無効にします。

1. **IMDSv2 を要求するように既存のインスタンスを設定する:**

------
#### [ Amazon EC2 console ]

   1. Amazon EC2 コンソールの [https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/) を開いてください。

   1. ナビゲーションペインで、**[Instances]** (インスタンス) を選択してください。

   1. インスタンスを選択してください。

   1. **[アクション]**、**[インスタンスの設定]**、**[インスタンスメタデータのオプションを変更]** の順に選択してください。

   1. **[IMDSv2]** の場合は**[必須]** を選択してください。

   1. [**Save**] を選択してください。

------
#### [ AWS CLI ]

   IMDSv2 のみを使用するように指定するには、[modify-instance-metadata-options](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/ec2/modify-instance-metadata-options.html) CLI コマンドを使用します。

------
**注記**  
この設定は、実行中のインスタンスで変更できます。変更は、インスタンスを再起動しなくてもすぐに有効になります。

   詳細については「[IMDSv2 の使用を要求する](configuring-IMDS-existing-instances.md#modify-require-IMDSv2)」を参照してください。

1. **IMDSv1 を無効にした後の問題を監視する:**

   1. `MetadataNoTokenRejected` CloudWatch メトリクスを使用して、IMDSv1 呼び出しが試行および拒否された回数を追跡できます。

   1. ソフトウェアの問題が発生しているインスタンスで `MetadataNoTokenRejected` メトリクスが IMDSv1 呼び出しを記録する場合、これは IMDSv2 を使用するためにソフトウェアを更新する必要があることを示します。

1. **IMDSv2 を要求するように新しいインスタンスを設定する:**

------
#### [ Amazon EC2 console ]

   1. Amazon EC2 コンソールの [https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/) を開いてください。

   1. [インスタンスを起動](ec2-launch-instance-wizard.md)するには、次のステップに沿って操作します。

   1. **[高度な詳細]** を展開し、**[メタデータバージョン]** で **[V2 のみ (トークンが必要)]** を選択します。

   1. **[Summary]** (概要) パネルでインスタンスの設定を確認し、**[Launch instance]** (インスタンスを起動) を選択してください。

      詳細については「[起動時にインスタンスを設定する](configuring-IMDS-new-instances.md#configure-IMDS-new-instances-instance-settings)」を参照してください。

------
#### [ AWS CLI ]

   AWS CLI: [run-instances](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/ec2/run-instances.html) CLI コマンドを使用して、IMDSv2 が必須となるように指定します。

------

### ステップ 4: IMDSv2=required をデフォルトとして設定する
<a name="path-step-4"></a>

IMDSv2=required は、アカウントレベルまたは組織レベルのいずれかでデフォルト設定として設定できます。これにより、新しく起動されたすべてのインスタンスが IMDSv2 を要求するように自動的に設定されます。

1. **アカウントレベルのデフォルトを設定する:**

------
#### [ Amazon EC2 console ]

   1. Amazon EC2 コンソールの [https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/) を開いてください。

   1. ナビゲーションペインで、**ダッシュボード**を選択してください。

   1. **[アカウント属性]** カードの **[設定]** で、**[データ保護とセキュリティ]** を選択します。

   1. **[IMDS のデフォルト]** で **[管理]** を選択します。

   1. **[インスタンスメタデータサービス]** で、**[有効にする]** を選択します。

   1. **[メタデータバージョン]** で、**[V2 のみ (トークンが必要)]** を選択します。

   1. **[Update]** (更新) を選択してください。

------
#### [ AWS CLI ]

   [modify-instance-metadata-defaults](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/ec2/modify-instance-metadata-defaults.html) CLI コマンドを使用して、`--http-tokens required` と `--http-put-response-hop-limit 2` を指定します。

------

   詳細については「[IMDSv2 をアカウントのデフォルトとして設定する](configuring-IMDS-new-instances.md#set-imdsv2-account-defaults)」を参照してください。

1. **または、宣言型ポリシーを使用して組織レベルのデフォルトを設定します。**

   宣言型ポリシーを使用して、IMDSv2 の組織のデフォルトを必須に設定します。ポリシーの例については、「*AWS Organizations ユーザーガイド*」の「[サポートされている宣言型ポリシー](https://docs.aws.amazon.com/organizations/latest/userguide/orgs_manage_policies_declarative_syntax.html#declarative-policy-examples)」セクションにある「**インスタンスメタデータ**」タブを参照してください。

### ステップ 5: インスタンスに IMDSv2 を要求するように強制する
<a name="path-step-5"></a>

どのインスタンスにも IMDSv1 への依存がないことを確認したら、すべての新しいインスタンスに IMDSv2 を強制適用することが推奨されます。

次の 2 つのオプションのいずれかを使用して IMDSv2 を強制適用します。

1. **アカウントプロパティを使用して IMDSv2 を強制適用する**

   各 AWS リージョンに対し、アカウントレベルで IMDSv2 の使用を強制できます。使用が強制されると、インスタンスを起動できるのは IMDSv2 が必須として設定されている場合のみになります。この強制は、インスタンスまたは AMI の設定方法を問わずに適用されます。詳細については「[アカウントレベルで IMDSv2 を強制適用する](configuring-IMDS-new-instances.md#enforce-imdsv2-at-the-account-level)」を参照してください。この設定を組織レベルで適用するには、宣言型ポリシーを設定します。ポリシーの例については、「*AWS Organizations ユーザーガイド*」の「[サポートされている宣言型ポリシー](https://docs.aws.amazon.com/organizations/latest/userguide/orgs_manage_policies_declarative_syntax.html#declarative-policy-examples)」セクションにある「**インスタンスメタデータ**」タブを参照してください。

   強制適用が取り消されないようにするため、IAM ポリシーを使用して [ModifyInstanceMetadataDefaults](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_ModifyInstanceMetadataDefaults.html) API へのアクセスを防ぐ必要があります。詳細については「[IAM ポリシーを使用する](configuring-IMDS-new-instances.md#configure-IMDS-new-instances-iam-policy)」を参照してください。
**注記**  
この設定は既存のインスタンスの IMDS バージョンを変更しませんが、IMDSv1 が現在無効になっている既存のインスタンスでの IMDSv1 の有効化が阻止されます。
**警告**  
IMDSv2 の強制適用が有効になっており、`httpTokens` が起動時のインスタンス設定、アカウント設定、または AMI 構成のいずれかで `required` に設定されていない場合、インスタンスの起動は失敗します。トラブルシューティング情報については、「[IMDSv1 が有効化されたインスタンスの起動が失敗する](troubleshooting-launch.md#launching-an-imdsv1-enabled-instance-fails)」を参照してください。

1. **別の手段として、次の IAM または SCP 条件キーを用いて IMDSv2 を強制適用します。**
   + `ec2:MetadataHttpTokens`
   + `ec2:MetadataHttpPutResponseHopLimit`
   + `ec2:MetadataHttpEndpoint`

   これらの条件キーは [RunInstances](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_RunInstances.html) API と [ModifyInstanceMetadataOptions](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_ModifyInstanceMetadataOptions.html) API、および対応する CLI の使用を制御します。ポリシーを作成し、条件キーを使用してポリシーに指定した状態と API コールのパラメータが一致しない場合、API コールまたは CLI コールは失敗して `UnauthorizedOperation` レスポンスが返されます。

   IAM ポリシーの例は[インスタンスメタデータの使用](ExamplePolicies_EC2.md#iam-example-instance-metadata)を参照してください。