

# 1 つのリクエストで起動された各インスタンスを特定する
<a name="AMI-launch-index-examples"></a>

この例はユーザーデータおよびインスタンスメタデータの両方を使用して Amazon EC2 インスタンスを設定する方法を示しています。

**注記**  
このセクションの例ではIMDS の IPv4 アドレス `169.254.169.254` を使用します。IPv6 アドレスを使用して EC2 インスタンスのインスタンスメタデータを取得する場合はIPv6 アドレスを有効にして使用してください。`[fd00:ec2::254]`。IMDS の IPv6 アドレスはIMDSv2 コマンドと互換性があります。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 のみ) でのみアクセスできます。

この例で、Alice はお気に入りのデータベース AMI の 4 つのインスタンスを起動します。最初のインスタンスを元のインスタンスとし、残りの 3 つをレプリカとします。これらのインスタンスの起動時に、レプリケーション戦略に関するユーザーデータを各レプリカに追加します。このデータはすべての 4 つのインスタンスで使用可能となるので、どの部分が各インスタンスに該当するかをそれぞれが認識できるように、ユーザーデータを構築する必要があります。この構築は各インスタンスに対して一意となる `ami-launch-index` インスタンスメタデータ値を使用して行うことができます。同時に複数のインスタンスを起動する場合、`ami-launch-index` はインスタンスが起動された順序を示します。最初に起動されたインスタンスの値は `0` で示されます。

Alice が構築したユーザーデータを次に示します。

```
replicate-every=1min | replicate-every=5min | replicate-every=10min
```

`replicate-every=1min` データは最初のレプリカの設定を定義し、`replicate-every=5min` は 2 番目のレプリカの設定を定義します。以下、同様に設定を定義します。Alice は個別のインスタンスのデータをパイプシンボル (`|`) で区切って、このデータを ASCII 文字列として指定することにしました。

Alice は[run-instances](https://docs.aws.amazon.com/cli/latest/reference/ec2/run-instances.html)コマンドを使用して 4 つのインスタンスを起動します。このとき、次のユーザーデータを指定します。

```
aws ec2 run-instances \
    --image-id {{ami-0abcdef1234567890}} \
    --count 4 \
    --instance-type t2.micro \
    --user-data "replicate-every=1min | replicate-every=5min | replicate-every=10min"
```

起動したすべてのインスタンスに、ユーザーデータのコピーと次に示す一般的なメタデータが含まれています。
+ AMI ID: ami-0abcdef1234567890
+ 予約 ID: r-1234567890abcabc0
+ パブリックキー: none 
+ セキュリティグループ名: default
+ インスタンスタイプ: t2.micro

ただし、次の表に示すように、各インスタンスには一意のメタデータがあります。


| メタデータ | 値 | 
| --- | --- | 
| instance-id | i-1234567890abcdef0 | 
| ami-launch-index | 0 | 
| public-hostname | ec2-203-0-113-25.compute-1.amazonaws.com | 
| public-ipv4 | 67.202.51.223 | 
| local-hostname | ip-10-251-50-12.ec2.internal | 
| local-ipv4 | 10.251.50.35 | 


| メタデータ | 値 | 
| --- | --- | 
| instance-id | i-0598c7d356eba48d7 | 
| ami-launch-index | 1 | 
| public-hostname | ec2-67-202-51-224.compute-1.amazonaws.com | 
| public-ipv4 | 67.202.51.224 | 
| local-hostname | ip-10-251-50-36.ec2.internal | 
| local-ipv4 | 10.251.50.36 | 


| メタデータ | 値 | 
| --- | --- | 
| instance-id | i-0ee992212549ce0e7 | 
| ami-launch-index | 2 | 
| public-hostname | ec2-67-202-51-225.compute-1.amazonaws.com | 
| public-ipv4 | 67.202.51.225 | 
| local-hostname | ip-10-251-50-37.ec2.internal | 
| local-ipv4 | 10.251.50.37 | 


| メタデータ | 値 | 
| --- | --- | 
| instance-id | i-1234567890abcdef0 | 
| ami-launch-index | 3 | 
| public-hostname | ec2-67-202-51-226.compute-1.amazonaws.com | 
| public-ipv4 | 67.202.51.226 | 
| local-hostname | ip-10-251-50-38.ec2.internal | 
| local-ipv4 | 10.251.50.38 | 

Alice は `ami-launch-index` 値を使用して、ユーザーデータのどの部分が特定のインスタンスに該当するかを判断できます。

1. いずれかのインスタンスに接続し、そのインスタンスの `ami-launch-index` を取得して、それがレプリカの 1 つであることを確認します。

------
#### [ IMDSv2 ]

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

   次のステップではIMDSv2が前のIMDSv2コマンドからの保管済みトークン (期限内であると仮定) を使用するようリクエストします。

------
#### [ IMDSv1 ]

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

------

1. 変数として`ami-launch-index`を保存します。

------
#### [ IMDSv2 ]

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

------
#### [ IMDSv1 ]

   ```
   [ec2-user ~]$ ami_launch_index=`curl http://169.254.169.254/latest/meta-data/ami-launch-index`
   ```

------

1. ユーザーデータを変数として保存します。

------
#### [ IMDSv2 ]

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

------
#### [ IMDSv1 ]

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

------

1. 最後に、Alice は**cut**コマンドを使用して、そのインスタンスに該当するユーザーデータの部分を抽出します。

------
#### [ IMDSv2 ]

   ```
   [ec2-user ~]$ echo $user_data | cut -d"|" -f"$ami_launch_index"
   replicate-every=5min
   ```

------
#### [ IMDSv1 ]

   ```
   [ec2-user ~]$ echo $user_data | cut -d"|" -f"$ami_launch_index"
   replicate-every=5min
   ```

------