

# インスタンスメタデータサービスのオプションを設定する
<a name="configuring-instance-metadata-options"></a>

インスタンスメタデータサービス (IMDS) はすべての EC2 インスタンスでローカルに実行されます。*インスタンスメタデータオプション*はEC2 インスタンス上の IMDS のアクセシビリティと動作を制御する一連の設定を参照してください。

各インスタンスで、以下のインスタンスメタデータオプションを設定できます。

**[インスタンスメタデータサービス (IMDS)]**: `enabled` \| `disabled`  
インスタンスで IMDS を有効または無効にすることができます。無効にすると、ユーザーまたはコードはインスタンスのインスタンスメタデータにアクセスできなくなります。  
IMDS のインスタンスにはIPv4 (`169.254.169.254`) と IPv6 (`[fd00:ec2::254]`) という 2 つのエンドポイントがあります。IMDS を有効にすると、IPv4 エンドポイントが自動的に有効になります。IPv6 エンドポイントを有効にする場合は明示的に有効にする必要があります。

**[IMDS IPv6 エンドポイント]**: `enabled` \| `disabled`  
インスタンスで IPv6 IMDS エンドポイントを明示的に有効にできます。IPv6 エンドポイントが有効になっている場合、IPv4 エンドポイントは有効なままになります。IPv6 エンドポイントは[Nitro ベースのインスタンス](instance-types.md#instance-hypervisor-type)と [IPv6 対応サブネット](https://docs.aws.amazon.com/vpc/latest/userguide/configure-subnets.html#subnet-ip-address-range) (デュアルスタックまたは IPv6 のみ) でのみサポートされています。

**[メタデータのバージョン]**: `IMDSv1 or IMDSv2 (token optional)` \| `IMDSv2 only (token required)`  
インスタンスメタデータをリクエストするとき、IMDSv2 呼び出しはトークンを要求します。IMDSv1 呼び出はトークンを要求しません。IMDSv1 または IMDSv2 呼び出しを許可する (トークンがオプションの場合) か、IMDSv2 呼び出しのみを許可する (トークンが必須の場合) ように、インスタンスを設定できます。

**[メタデータレスポンスのホップ制限]**: `1`～`64`  
ホップ制限はPUT レスポンスが実行できるネットワークホップの数です。ホップ制限は最小 `1`、最大 `64` に設定できます。コンテナ環境では、`1` のホップ制限によって問題が発生する可能性があります。これらの問題を軽減する方法については、[インスタンスメタデータアクセス考慮事項](instancedata-data-retrieval.md#imds-considerations) でコンテナ環境に関する情報を参照してください。

**[インスタンスメタデータ内のタグにアクセスする]**: `enabled` \| `disabled`  
インスタンスのメタデータからインスタンスのタグへのアクセスを有効または無効にすることができます。詳細については[インスタンスメタデータを使用して EC2 インスタンスのタグを表示する](work-with-tags-in-IMDS.md) を参照してください。

インスタンスの現在の設定を確認するには、「[既存インスタンスのインスタンスメタデータオプションのクエリ](instancedata-data-retrieval.md#query-IMDS-existing-instances)」を参照してください。

## インスタンスメタデータオプションを設定する場所
<a name="where-to-configure-instance-metadata-options"></a>

インスタンスメタデータオプションは次のようにさまざまなレベルで設定できます。
+ **アカウント** – 各 AWS リージョンのアカウントレベルで、インスタンスメタデータオプションのデフォルト値を設定できます。インスタンスが起動すると、インスタンスメタデータオプションは自動的にアカウントレベルの値に設定されます。これらの値は起動時に変更できます。アカウントレベルのデフォルト値は既存のインスタンスには影響しません。
+ **AMI** – AMI を登録または変更するときに、`imds-support` パラメータを `v2.0` に設定できます。この AMI でインスタンスを起動すると、インスタンスメタデータバージョンは自動的に「IMDSv2」に設定され、ホップ制限は「2」に設定されます。
+ **インスタンス** – 起動時にインスタンスのすべてのインスタンスメタデータオプションを変更し、デフォルト設定を上書きできます。実行中または停止中のインスタンスで起動した後に、インスタンスメタデータオプションを変更することもできます。変更は IAM または SCP ポリシーによって制限される可能性があることに注意してください。

詳細については[新規インスタンスのインスタンスメタデータオプションの設定](configuring-IMDS-new-instances.md)および[既存インスタンスのインスタンスメタデータオプションの変更](configuring-IMDS-existing-instances.md)を参照してください。

## インスタンスメタデータオプションの優先順位
<a name="instance-metadata-options-order-of-precedence"></a>

各インスタンスメタデータオプションの値はインスタンスの起動時に優先順位に従って決定されます。最上位の優先順位を持つ階層は次のとおりです。
+ **優先順位 1: 起動時のインスタンス設定** – 値は起動テンプレートまたはインスタンス設定のいずれかで指定できます。ここで指定された値はアカウントレベルまたは AMI で指定された値を上書きします。
+ **優先順位 2: アカウント設定** – インスタンスの起動時に値が指定されていない場合はアカウントレベルの設定 (AWS リージョンごとに設定) によって値が決まります。アカウントレベルの設定では各メタデータオプションの値が含まれているか、まったく指定がないことが示されるかのどちらかです。
+ **優先順位 3: AMI 設定** – インスタンスの起動時に、またはアカウントレベルで値が指定されていない場合はAMI 設定によって値が決まります。これは`HttpTokens` と `HttpPutResponseHopLimit` にのみ該当します。

各メタデータオプションは個別に評価されます。インスタンスは直接インスタンス設定、アカウントレベルのデフォルト、および AMI からの設定を組み合わせて設定できます。

IAM または SCP ポリシーによって変更が制限されていない限り、実行中または停止中のインスタンスで起動した後に、任意のメタデータオプションの値を変更できます。

**注記**  
アカウントレベルでの IMDSv2 の強制適用設定の評価は、優先順位によってインスタンスの IMDS 設定が判断された後で行われます。IMDSv2 の強制適用を有効にすると、IMDSv1 が有効化されているインスタンスは失敗します。強制適用に関する詳細については、「[アカウントレベルで IMDSv2 を強制適用する](configuring-IMDS-new-instances.md#enforce-imdsv2-at-the-account-level)」を参照してください。

**警告**  
IMDSv2 の強制適用が有効になっており、`httpTokens` が起動時のインスタンス設定、アカウント設定、または AMI 構成のいずれかで `required` に設定されていない場合、起動は失敗します。

**例 1 – メタデータオプションの値を判断する**

この例ではEC2 インスタンスはアカウントレベルで `HttpPutResponseHopLimit` が `1` に設定されているリージョンで起動されます。指定された AMI では`ImdsSupport` が `v2.0` に設定されています。起動時に、インスタンスでメタデータオプションが直接指定されることはありません。インスタンスは次のメタデータオプションを使用して起動されます。

```
"MetadataOptions": {
    ...
    "HttpTokens": "required",
    "HttpPutResponseHopLimit": 1,
    ...
```

これらの値は次のように決定されました。
+ **起動時にメタデータオプションが指定されていない:** インスタンスの起動時に、メタデータオプションの特定の値が、インスタンス起動パラメータにも、起動テンプレートにも指定されていませんでした。
+ **アカウント設定が次に優先される:** 起動時に特定の値が指定されていない場合はリージョン内のアカウントレベルの設定が優先されます。つまり、アカウントレベルで設定されたデフォルト値が適用されます。この場合は`HttpPutResponseHopLimit` が `1` に設定されました。
+ **AMI 設定が最後に優先される:** 起動時またはアカウントレベルで `HttpTokens` (インスタンスメタデータバージョン) に特定の値が指定されていない場合はAMI 設定が適用されます。この場合はAMI 設定 `ImdsSupport: v2.0` により、`HttpTokens` が `required` に設定されました。AMI 設定 `ImdsSupport: v2.0` は `HttpPutResponseHopLimit: 2` 設定するように設計されていますが、優先順位の高いアカウントレベルの設定 `HttpPutResponseHopLimit: 1` によって上書きれることに注意してください。

**例 2 – メタデータオプションの値を判断する**

この例ではEC2 インスタンスは前の例 1 と同じ設定で起動されますが、起動時にインスタンスで直接 `HttpTokens` が `optional` に設定されています。インスタンスは次のメタデータオプションを使用して起動されます。

```
"MetadataOptions": {
    ...
    "HttpTokens": "optional",
    "HttpPutResponseHopLimit": 1,
    ...
```

`HttpPutResponseHopLimit` の値は例 1 と同じ方法で決定されます。ただし、`HttpTokens` の値は次のように決定されます。起動時にインスタンスで設定されているメタデータオプションが最優先されます。AMI が `ImdsSupport: v2.0` で設定されている (つまり、`HttpTokens` が `required` に設定されている) 場合でも、起動時にインスタンスで指定されている値 (`HttpTokens` が `optional` に設定されている) が優先されます。

**例 3 – HttpTokensEnforced が有効化されているメタデータオプションの値を判断する**

この例では、リージョン内のアカウントに `HttpTokens = required` と `HttpTokensEnforced = enabled` があります。

次の EC2 インスタンス起動試行を検討します。
+ `HttpTokens` を `optional` に設定した起動試行 – アカウントレベルでの強制適用が有効 (`HttpTokensEnforced = enabled`) になっており、アカウントのデフォルトよりも起動パラメータが優先されるため、起動が失敗します。
+ `HttpTokens` を `required` に設定した起動試行 — アカウントレベルの強制適用に従っているため、起動は正常に行われます。
+ `HttpTokens` 値が指定されていない起動試行 – 値はアカウント設定に基づいてデフォルトの `required` になるため、起動は正常に行われます。

### インスタンスのメタデータバージョンを設定する
<a name="metadata-version-order-of-precedence"></a>

インスタンスの起動時におけるインスタンス*メタデータバージョン*の値は、**[IMDSv1 または IMDSv2 (トークンはオプション)]** (`httpTokens=optional`) か **[IMDSv2 のみ (トークンは必須)]** (`httpTokens=required`) のいずれかになります。

インスタンスの起動時に、メタデータバージョンの値を手動で指定するか、デフォルト値を使用できます。値を手動で指定すると、すべてのデフォルト値が上書きされます。値を手動で指定しないことを選択した場合は、デフォルト設定の組み合わせによって判断されます。

次のフローチャートは、起動時におけるインスタンスメタデータバージョンが、構成の異なるレベルでの設定と、強制適用が評価される場所によって判断される仕組みを示しています。次の表は、各レベル固有の設定を示しています。

![インスタンスメタデータバージョンと IMDSv2 の強制適用の評価ポイントを示すフローチャート。](http://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/images/imds-defaults-launch-flow.png)


この表は起動時のインスタンスのメタデータバージョン (列 4 の **[結果として生じるインスタンス設定]** で示される) が、さまざまなレベルの設定によってどのように決定されるかを示しています。優先順位は左から右で、次のように最初の列が最も優先されます。
+ 列 1: **[起動パラメータ]** - 起動時に手動で指定するインスタンスの設定を表します。
+ 列 2: **[アカウントレベルのデフォルト]** - アカウントの設定を表します。
+ 列 3: **[AMI のデフォルト]** - AMI の設定を表します。


| 起動パラメータ | アカウントレベルのデフォルト | AMI のデフォルト | 結果として生じるインスタンス設定 | 
| --- | --- | --- | --- | 
| V2 のみ (トークンが必要) | 指定なし | V2 のみ | V2 のみ | 
| V2 のみ (トークンが必要) | V2 のみ | V2 のみ | V2 のみ | 
| V2 のみ (トークンが必要) | V1 または V2 | V2 のみ | V2 のみ | 
| V1 または V2 (トークンはオプション) | 指定なし | V2 のみ | V1 または V2 | 
| V1 または V2 (トークンはオプション) | V2 のみ | V2 のみ | V1 または V2 | 
| V1 または V2 (トークンはオプション) | V1 または V2 | V2 のみ | V1 または V2 | 
| 未設定 | 指定なし | V2 のみ | V2 のみ | 
| 未設定 | V2 のみ | V2 のみ | V2 のみ | 
| 未設定 | V1 または V2 | V2 のみ | V1 または V2 | 
| V2 のみ (トークンが必要) | 指定なし | null | V2 のみ | 
| V2 のみ (トークンが必要) | V2 のみ | null | V2 のみ | 
| V2 のみ (トークンが必要) | V1 または V2 | null | V2 のみ | 
| V1 または V2 (トークンはオプション) | 指定なし | null | V1 または V2 | 
| V1 または V2 (トークンはオプション) | V2 のみ | null | V1 または V2 | 
| V1 または V2 (トークンはオプション) | V1 または V2 | null | V1 または V2 | 
| 未設定 | 指定なし | null | V1 または V2 | 
| 未設定 | V2 のみ | null | V2 のみ | 
| 未設定 | V1 または V2 | null | V1 または V2 | 

## IAM 条件キーを使用してインスタンスメタデータオプションを制限する
<a name="iam-condition-keys-and-imds"></a>

IAM ポリシーまたは SCP で IAM 条件キーを次のように使用できます。
+ IMDSv2 の使用を要求するようにインスタンスが設定されている場合にのみ、インスタンスの起動を許可する
+ ホップの許可数を制限する
+ インスタンスメタデータへのアクセスを無効にする

**Topics**
+ [インスタンスメタデータオプションを設定する場所](#where-to-configure-instance-metadata-options)
+ [インスタンスメタデータオプションの優先順位](#instance-metadata-options-order-of-precedence)
+ [IAM 条件キーを使用してインスタンスメタデータオプションを制限する](#iam-condition-keys-and-imds)
+ [新規インスタンスのインスタンスメタデータオプションの設定](configuring-IMDS-new-instances.md)
+ [既存インスタンスのインスタンスメタデータオプションの変更](configuring-IMDS-existing-instances.md)

**注記**  
注意深く実行し、変更を行う前に慎重なテストを実施する必要があります。以下の情報を記録します。  
IMDSv2の使用を強制する場合、インスタンスメタデータアクセスのためにIMDSv1を使用するアプリケーションまたはエージェントは休憩します。
インスタンスメタデータへのアクセスをすべてオフにする場合、インスタンスメタデータアクセスに依存して機能するアプリケーションまたはエージェントは休憩します。
IMDSv2 でトークンを取得する際には`/latest/api/token` を使用する必要があります｡
(Windows のみ) PowerShell のバージョンが 4.0 より前の場合はIMDSv2 の使用を要求するために [Windows Management Framework 4.0 に更新](https://devblogs.microsoft.com/powershell/windows-management-framework-wmf-4-0-update-now-available-for-windows-server-2012-windows-server-2008-r2-sp1-and-windows-7-sp1/)する必要があります。