

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 識別在單一請求中啟動的每個執行個體
<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 地址僅在 [IPv6 支援的子網路](https://docs.aws.amazon.com/vpc/latest/userguide/configure-subnets.html#subnet-ip-address-range) (僅支援雙重堆疊或 IPv6) 中的 [Nitro 型執行個體](instance-types.md#instance-hypervisor-type)可存取。

Alice 想要啟動四個她最愛的資料庫 AMI 的執行個體，其中第一個為原始執行個體，其餘三個則為複本。當她啟動這些執行個體時，她想要為每個複本新增關於複寫策略的使用者資料。她知道資料將會在四個執行個體上可用，因此她需要使用允許每個執行個體識別其適用部分的方式架構使用者資料。她可以使用 `ami-launch-index` 執行個體中繼資料值執行此作業，每一個執行個體的該值都是唯一的。如果您同時啟動一個以上的執行個體，`ami-launch-index` 表示執行個體的啟動順序。第一個啟動的執行個體的值為 `0`。

下列是 Alice 建構的使用者資料。

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

`replicate-every=1min` 資料定義第一個複本的組態，`replicate-every=5min` 定義第二個複本的組態，以此類推。Alice 決定以 ASCII 字串提供此資料，其中以直立線符號 (`|`) 分隔不同執行個體的資料。

Alice 使用 [run-instances](https://docs.aws.amazon.com/cli/latest/reference/ec2/run-instances.html) 命令啟動四個執行個體，指定使用者資料。

```
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
+ 公有金鑰：無 
+ 安全群組名稱：預設
+ 執行個體類型：t2.micro

但是，每個執行個體都有唯一的中繼資料，如下表所示。


| 中繼資料 | Value | 
| --- | --- | 
| 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 | 


| 中繼資料 | Value | 
| --- | --- | 
| 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 | 


| 中繼資料 | Value | 
| --- | --- | 
| 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 | 


| 中繼資料 | Value | 
| --- | --- | 
| 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`，確保它是其中一個複本：

------
#### [ 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
   ```

------