

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

# Snowball Edge の IMDS バージョン
<a name="imds-versions"></a>

IMDS バージョン 2 または IMDS バージョン 1 を使用して、実行中のインスタンスからインスタンスメタデータにアクセスできます。
+ インスタンスメタデータサービスバージョン 2 (IMDSv2) – セッション指向メソッド
+ インスタンスメタデータサービスバージョン 1 (IMDSv1) – リクエスト/レスポンス方式

Snow ソフトウェアのバージョンによって、IMDSv1 または IMDSv2、あるいは両方を使用できます。これは、EC2 互換インスタンスで実行されている AMI の種類によっても異なります。Ubuntu 20.04 を実行している AMI など、一部の AMI では IMDSv2 が必要です。インスタンスメタデータサービスは、`PUT` または `GET` ヘッダーの有無によって IMDSv1 と IMDSv2 リクエストを区別します。IMDSv2 はこれら両方のヘッダーを使用します。IMDSv1 は `GET` ヘッダーのみを使用します。

AWS では、IMDSv2 のセキュリティが高いため、IMDSv1 ではなく IMDSv2 の使用を推奨しています。詳細については、[EC2 Instance Metadata Service の拡張により、オープンファイアウォール、リバースプロキシ、および SSRF の脆弱性に対して多層防御を追加](https://aws.amazon.com/blogs/security/defense-in-depth-open-firewalls-reverse-proxies-ssrf-vulnerabilities-ec2-instance-metadata-service/)を参照してください。

## Snowball Edge の IMDSv2
<a name="imdsv2"></a>

IMDSv2 を使用してインスタンスメタデータをリクエストする場合、リクエストは次のルールに従う必要があります。

1. `PUT` リクエストを使って、インスタンスメタデータサービスに対してセッションを開始します。`PUT` リクエストは、インスタンスメタデータサービスに対する後続の `GET` リクエストに含める必要のあるセッショントークンを返します。セッション期間を定義するセッショントークン。セッション期間は、最短で 1 秒、最長で 6 時間に設定可能です。この期間中、以降のリクエストで同じセッショントークンを使用できます。この期間の期限が切れたら、将来のリクエストに使用する新しいセッショントークンを作成する必要があります。このトークンは、IMDSv2を使ってメタデータにアクセスするのに必要です。

1. トークンを、インスタンスメタデータサービスに対するすべての`GET`リクエストに含めます。

   1. トークンはインスタンス固有のキーです。トークンは他の EC2 互換インスタンスでは有効ではなく、生成されたインスタンスの外部で使用しようとすると拒否されます。

   1. `PUT`リクエストにはトークンの有効期限 (TTL) を最大 6 時間 (21,600 秒) まで秒単位で指定するヘッダーが含まれている必要があります。トークンは論理的セッションを表します。TTL はトークンが有効な時間の長さ、つまりセッションの期間を指定します。

   1. トークンの期限が切れた後、インスタンスメタデータにアクセスし続けるためには、別の `PUT` リクエストを使用して新しいセッションを作成する必要があります。

   1. 各リクエストについてトークンを再使用するか、あるいは新しいトークンを作成することを選択できます。少数のリクエストでは、インスタンスメタデータサービスにアクセスする必要があるたびに、トークンを生成してすぐに使用するほうが簡単かもしれません。ただし、効率を重視するなら、インスタンスメタデータをリクエストする必要があるたびに`PUT`リクエストを書くより、トークン期間を長く指定して再使用することができます。それぞれが独自のセッションを表すトークンを同時に使用できる数については実際的に制限がありません。

HTTP `GET` および `HEAD` メソッドは IMDSv2 インスタンスメタデータリクエストで許可されています。`PUT` リクエストは、`X-Forwarded-For` ヘッダーが含まれている場合、拒否されます。

デフォルトで、`PUT` リクエストに対するレスポンスのホップ制限 (有効期限) は IP プロトコルレベルで 1 です。IMDS for Snow には、`PUT` レスポンスのホップ制限を変更する機能はありません。

次の例では、Linux シェルスクリプトと IMDSv2 を使って、最上位インスタンスメタデータ項目を取得します。この例では以下を行います。

1. `PUT` リクエストを使って、6 時間 (21,600 秒) 持続するセッショントークンを作成する

1. セッショントークンヘッダーを `TOKEN` という変数に格納する

1. トークンを使って最上位のメタデータ項目をリクエストする

EC2 互換トークンを生成するには、2 つのコマンドを使用します。コマンドは個別に実行することも、1 つのコマンドとして実行することもできます。

最初に、次のコマンドを使用してトークンを生成します。

**注記**  
`X-aws-ec2-metadata-token-ttl-seconds` は必須ヘッダーです。このヘッダーが含まれていない場合は、「**400 - Missing or Invalid Parameters**」エラーコードが表示されます。

```
    [ec2-user ~]$ TOKEN=curl -X PUT "http://169.254.169.254/latest/api/token" -H "X-aws-ec2-metadata-token-ttl-seconds: 21600"
```

その後、次のコマンドを使用して、トークンを使用して最上位のメタデータ項目を生成します。

```
    [ec2-user ~]$ curl -H "X-aws-ec2-metadata-token: $TOKEN" -v http://169.254.169.254/latest/meta-data/
```

**注記**  
トークンの作成時にエラーが発生した場合は、有効なトークンではなくエラーメッセージが変数に格納され、コマンドは機能しません。

トークンを保存し、コマンドを組み合わせることができます。次の例では、上記の 2 つのコマンドを組み合わせて、セッショントークンヘッダーを `TOKEN` という変数に格納します。

**Example 組み合わされたコマンド**  

```
    [ec2-user ~]$ TOKEN=curl -X PUT "http://169.254.169.254/latest/api/token" -H "X-aws-ec2-metadata-token-ttl-seconds: 21600" \
    && curl -H "X-aws-ec2-metadata-token: $TOKEN" -v http://169.254.169.254/latest/meta-data/
```

トークンを作成した後、期限切れになるまで再使用することができます。次のコマンド例では、インスタンスの起動に使用される AMI の ID を取得し、前の例で `$TOKEN` で作成されたトークンに格納します。

**Example トークンの再利用**  

```
    [ec2-user ~]$ curl -H "X-aws-ec2-metadata-token: $TOKEN" -v http://169.254.169.254/latest/meta-data/ami-id                        
```

## Snowball Edge の IMDSv1
<a name="imdsv1"></a>

IMDSv1 はリクエスト/レスポンスモデルを使用します。インスタンスメタデータをリクエストするには、`GET` リクエストをインスタンスメタデータサービスに送信します。

```
    [ec2-user ~]$ curl http://169.254.169.254/latest/meta-data/                   
```

インスタンスメタデータは実行中のインスタンスから利用できるため、Amazon EC2 コンソールや AWS CLI を使用してアクセスする必要はありません。これはインスタンスから実行するスクリプトを記述しているときに便利です。例えば、インスタンスメタデータからインスタンスのローカル IP アドレスにアクセスして、外部アプリケーションへの接続を管理できます。インスタンスメタデータはいくつかのカテゴリに分けられます。各インスタンスメタデータカテゴリの説明については、本ガイドの「[サポートされているインスタンスメタデータとユーザーデータ](https://docs.aws.amazon.com/snowball/latest/developer-guide/edge-compute-instance-metadata.html)」を参照してください。

実行中のインスタンス内からインスタンスメタデータのすべてのカテゴリを表示するには、次の IPv4 URI を使用します。

```
    http://169.254.169.254/latest/meta-data/
```

これらの IP アドレス は、リンクローカルアドレスであり、インスタンスからのみ使用することが可能です。詳細については、Wikipedia の[リンクローカルアドレス](https://en.wikipedia.org/wiki/Link-local_address)を参照してください。

すべてのインスタンスメタデータがテキスト (HTTP コンテンツタイプ `text/plain`) として返されます。

特定のメタデータリソースのリクエストでは、適切な値が返されます。リソースが使用できない場合は「**404 - Not Found**」HTTP エラーコードが返されます。

一般的なメタデータリソースに対するリクエスト (URI が `/` 文字で終わる場合) は、使用可能なリソースのリストを返すか、そのようなリソースがない場合は「**404 - Not Found**」HTTP エラーコードを返します。リスト項目は個別の行に表示され、各行の末尾には改行記号 (ASCII 文字コード 10) が付いています。

IMDSv1 を使って行われたリクエストでは、次の HTTP エラーコードが返されます。
+ **400 ‐ Missing or Invalid Parameters** – `PUT` リクエストは無効です。
+ **401 ‐ Unauthorized** – `GET`リクエストで無効なトークンが使用されています。推奨されるアクションは新しいトークンを生成することです。
+ **403 ‐ Forbidden** – リクエストが許可されていないか、インスタンスメタデータサービスがオフになっています。