

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

# 存取 EC2 執行個體的執行個體中繼資料
<a name="instancedata-data-retrieval"></a>

您可以從執行個體本身內部或 EC2 主控台、API、 SDK 或 AWS CLI，存取 EC2 執行個體中繼資料。若要從主控台或命令列取得執行個體目前的執行個體中繼資料設定，請參閱 [查詢現有執行個體的執行個體中繼資料選項](#query-IMDS-existing-instances)。

您也可以修改具有 EBS 根磁碟區之執行個體的使用者資料。執行個體必須處於停止狀態。如需主控台操作指示，請參閱[更新執行個體使用者資料](user-data.md#user-data-modify)。如需使用 的 Linux 範例 AWS CLI，請參閱 [modify-instance-attribute](https://docs.aws.amazon.com/cli/latest/reference/ec2/modify-instance-attribute.html)。如需使用 Tools for Windows PowerShell 的 Windows 範例，請參閱 [使用者資料與 Tools for Windows PowerShell](user-data.md#user-data-powershell)。

**注意**  
您無須為用來擷取執行個體中繼資料和使用者資料的 HTTP 請求支付費用。

## 執行個體中繼資料存取考量
<a name="imds-considerations"></a>

若要避免執行個體中繼資料的問題，請考慮下列事項。

**IMDSv2 強制執行導致執行個體啟動失敗 (`HttpTokensEnforced=enabled`)**  
在啟用 IMDSv2 強制執行之前，您需要執行個體上的所有軟體來支援 IMDSv2，之後您可以將預設值變更為停用 IMDSv1 (`httpTokens=required`)，之後即可啟用強制執行。如需詳細資訊，[轉換為使用 執行個體中繼資料服務第 2 版](instance-metadata-transition-to-version-2.md)。

**命令格式**  
命令格式不同，根據您使用的是執行個體中繼資料服務版本 1 (IMDSv1) 或執行個體中繼資料服務版本 2 (IMDSv2)，命令格式有所不同。根據預設，您可以同時使用兩個版本的執行個體中繼資料服務。欲要求使用 IMDSv2，請參閱 [使用執行個體中繼資料服務存取執行個體中繼資料](configuring-instance-metadata-service.md)。

**如果需要 IMDSv2，則 IMDSv1 將無法運作**  
如果您使用 IMDSv1 且未收到回應，則可能需要 IMDSv2。若要檢查是否需要 IMDSv2，請選取執行個體以檢視其詳細資訊。**IMDSv2** 值表示**必要** (您必須使用 IMDSv2) 或**選用** (您可以使用 IMDSv2 或 IMDSv1)。

**(IMDSv2) 使用 /latest/api/token 擷取字符**  
向任何版本特定的路徑發出 `PUT` 請求 (例如 `/2021-03-23/api/token`)，將導致中繼資料服務傳回 403 Forbidden 錯誤。這是預期行為。

**中繼資料版本**  
為避免每次 Amazon EC2 發佈新的執行個體中繼資料建置時都必須更新您的程式碼，我們建議您在路徑中使用 `latest`，而不是版本編號。

**IPv6 支援**  
若要使用 IPv6 地址擷取執行個體中繼資料，請確定啟用及使用 IMDS 的 IPv6 地址 `[fd00:ec2::254]`，而不是 IPv4 地址 `169.254.169.254`。執行個體必須是在[支援 IPv6 的子網路](https://docs.aws.amazon.com/vpc/latest/userguide/configure-subnets.html#subnet-ip-address-range)中啟動的 [Nitro 型執行個體](instance-types.md#instance-hypervisor-type)。

**(Windows) 使用 Windows Sysprep 建立自訂 AMIs**  
若要在您從自訂 Windows AMI 啟動執行個體確保 IMDS 正常運作，AMI 必須是使用 Windows Sysprep 建立的標準化映像。否則，IMDS 將無法運作。如需詳細資訊，請參閱[使用 Windows Sysprep 建立 Amazon EC2 AMI](ami-create-win-sysprep.md)。

**在容器環境中，考慮重新設定或將跳轉限制增加到 2**  
根據預設 AWS SDKs 會使用 IMDSv2 呼叫。如果 IMDSv2 呼叫未收到回應，則 AWS SDKs會重試呼叫，如果仍然失敗，請使用 IMDSv1。這可能會導致延遲，特別是在容器環境中。對於*需要* IMDSv2 AWS SDKs，如果跳轉限制在容器環境中為 1，則呼叫可能完全不會收到回應，因為前往容器會被視為額外的網路跳轉。  
若要緩解容器環境中的這些問題，請考慮將組態變更為將設定 （例如 AWS 區域) 直接傳遞至容器，或考慮將跳轉限制增加至 2。如需關於跳轉限制的資訊，請參閱[透過 EC2 執行個體中繼資料服務的增強功能，提高開放式防火牆、反向代理伺服器及 SSRF (伺服器端請求偽造) 弱點的防禦能力](https://aws.amazon.com/blogs/security/defense-in-depth-open-firewalls-reverse-proxies-ssrf-vulnerabilities-ec2-instance-metadata-service/)。如需變更跳轉限制的資訊，請參閱 [變更 PUT 回應跳轉限制](configuring-IMDS-existing-instances.md#modify-PUT-response-hop-limit)。

**每秒封包數 (PPS) 的限制**  
使用[連結本機](using-instance-addressing.md#link-local-addresses)位址的服務有每秒 1024 個封包 (PPS) 限制。此限制包括 [Route 53 Resolver DNS 查詢](https://docs.aws.amazon.com/vpc/latest/userguide/AmazonDNS-concepts.html#vpc-dns-limits)、執行個體中繼資料服務 (IMDS) 請求、[Amazon Time Service Network Time Protocol (NTP)](set-time.md) 請求和 [Windows Licensing Service (適用於 Microsoft Windows 型執行個體)](https://aws.amazon.com/windows/resources/licensing/) 請求的彙總。

**使用者資料存取的其他考量**
+ 使用者資料被視為不透明資料：您指定的內容在擷取時會依原樣傳回。由執行個體自行解讀使用者資料並對其採取行動。
+ 使用者資料必須為 base64 編碼形式。根據您使用的工具或 SDK，可能會自動為您執行 Base64 編碼。例如：
  + Amazon EC2 主控台可為您執行 base64 編碼，或是接受 base64 編碼輸入。
  + [AWS CLI 第 2](https://docs.aws.amazon.com/cli/latest/userguide/cliv2-migration-changes.html#cliv2-migration-binaryparam) 版預設會為您執行二進位參數的 base64 編碼。第 1 AWS CLI 版會為您執行`--user-data`參數的 base64 編碼。
  + 會為您 適用於 Python (Boto3) 的 AWS SDK 執行 `UserData` 參數的 base64 編碼。
+ 使用者資料在 base64 編碼之前限制為 16 KB (原始形式)。長度為 *n* 的字串在 base64 編碼之後的大小為 ceil(*n*/3)\$14。
+ 使用者資料在擷取時必須以 base64 解碼。如果您使用執行個體中繼資料或主控台擷取資料，將會自動為您解碼資料。
+ 若您停止執行個體，請修改其使用者資料，然後啟動執行個體，則更新後的使用者資料便不會在您啟動執行個體時自動執行。您可以透過 Windows 執行個體設定組態，使更新後的使用者資料指令碼在您啟動執行個體，或是每一次重新開機或啟動執行個體時執行一次。
+ 使用者資料是執行個體屬性。如果您從執行個體建立 AMI，執行個體使用者資料不會包含在 AMI 中。

## 從 EC2 執行個體存取執行個體中繼資料
<a name="instancedata-inside-access"></a>

因為您的執行個體中繼資料可從您執行中的執行個體取得，您無須使用 Amazon EC2 主控台或 AWS CLI。若您正在撰寫要從您的執行個體執行的指令碼，這將會很有幫助。例如，您可以存取從執行個體中繼資料存取您執行個體的本機 IP 地址，管理與外部應用程式的連線。

以下所有項目都被視為執行個體中繼資料，但存取方法各有不同。選擇代表要存取之執行個體中繼資料類型的標籤，以查看更多資訊。

------
#### [ Metadata ]

執行個體中繼資料屬性分為數種類別。對於每個執行個體中繼資料類別的說明，請參閱 [執行個體中繼資料分類](ec2-instance-metadata.md#instancedata-data-categories)。

若要從執行中的執行個體存取中繼資料屬性，請從下列 IPv4 或 IPv6 URI 取得資料。這些 IP 位址是連結本機位址且僅在執行個體中有效。如需詳細資訊，請參閱[Link-local 地址](using-instance-addressing.md#link-local-addresses)。

**IPv4**

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

**IPv6**

```
http://[fd00:ec2::254]/latest/meta-data/
```

------
#### [ Dynamic data ]

若要從執行中的執行個體擷取動態資料，請使用下列其中一個 URI。

**IPv4**

```
http://169.254.169.254/latest/dynamic/
```

**IPv6**

```
http://[fd00:ec2::254]/latest/dynamic/
```

**範例：使用 cURL 存取**  
下列範例使用 `cURL` 擷取高層級的執行個體身分類別。

*IMDSV2*

```
[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" http://169.254.169.254/latest/dynamic/instance-identity/
rsa2048
pkcs7
document
signature
dsa2048
```

*IMDSv1*

```
[ec2-user ~]$ curl http://169.254.169.254/latest/dynamic/instance-identity/
rsa2048
pkcs7
document
signature
dsa2048
```

**範例：使用 PowerShell 存取**  
下列範例使用 PowerShell 擷取高層級的執行個體身分類別。

*IMDSV2*

```
PS C:\> [string]$token = Invoke-RestMethod -Headers @{"X-aws-ec2-metadata-token-ttl-seconds" = "21600"} -Method PUT -Uri http://169.254.169.254/latest/api/token
```

```
PS C:\> Invoke-RestMethod -Headers @{"X-aws-ec2-metadata-token" = $token} -Method GET -Uri http://169.254.169.254/latest/dynamic/instance-identity/
document
rsa2048
pkcs7
signature
```

*IMDSv1*

```
PS C:\> Invoke-RestMethod -uri http://169.254.169.254/latest/dynamic/instance-identity/
document
rsa2048
pkcs7
signature
```

如需動態資料的詳細資訊及如何擷取它的範例，請參閱[Amazon EC2 執行個體的執行個體身分文件](instance-identity-documents.md)。

------
#### [ User data ]

若要從執行個體擷取使用者資料，請使用下列其中一個 URI。若要使用 IPv6 地址擷取使用者資料，您必須先啟用並確保該執行個體是 [Nitro 型執行個體](instance-types.md#instance-hypervisor-type)，且位於支援 IPv6 的子網路中。

**IPv4**

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

**IPv6**

```
http://[fd00:ec2::254]/latest/user-data
```

使用者資料的請求會直接傳回資料 (內容類型 `application/octet-stream`)。如果執行個體沒有任何使用者資料，則請求會傳回 `404 - Not Found`。

**範例：使用 cURL 存取以擷取逗號分隔文字**  
下列範例使用 `cURL` 擷取指定為逗號分隔文字的使用者資料。

*IMDSV2*

```
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" http://169.254.169.254/latest/user-data
1234,john,reboot,true | 4512,richard, | 173,,,
```

*IMDSv1*

```
curl http://169.254.169.254/latest/user-data
1234,john,reboot,true | 4512,richard, | 173,,,
```

**範例：使用 PowerShell 存取以擷取逗號分隔文字**  
下列範例使用 PowerShell 擷取指定為逗號分隔文字的使用者資料。

*IMDSV2*

```
[string]$token = Invoke-RestMethod -Headers @{"X-aws-ec2-metadata-token-ttl-seconds" = "21600"} -Method PUT -Uri http://169.254.169.254/latest/api/token
```

```
Invoke-RestMethod -Headers @{"X-aws-ec2-metadata-token" = $token} -Method GET -Uri http://169.254.169.254/latest/user-data
1234,john,reboot,true | 4512,richard, | 173,,,
```

*IMDSv1*

```
Invoke-RestMethod -Headers @{"X-aws-ec2-metadata-token" = Invoke-RestMethod -Headers @{"X-aws-ec2-metadata-token-ttl-seconds" = "21600"} `
-Method PUT -Uri http://169.254.169.254/latest/api/token} -Method GET -uri http://169.254.169.254/latest/user-data
1234,john,reboot,true | 4512,richard, | 173,,,
```

**範例：使用 cURL 存取以擷取指令碼**  
下列範例使用 `cURL` 擷取指定為指令碼的使用者資料。

*IMDSV2*

```
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" http://169.254.169.254/latest/user-data
#!/bin/bash
yum update -y
service httpd start
chkconfig httpd on
```

*IMDSv1*

```
curl http://169.254.169.254/latest/user-data
#!/bin/bash
yum update -y
service httpd start
chkconfig httpd on
```

**範例：使用 PowerShell 存取以擷取指令碼**  
下列範例使用 PowerShell 擷取指定為指令碼的使用者資料。

*IMDSV2*

```
[string]$token = Invoke-RestMethod -Headers @{"X-aws-ec2-metadata-token-ttl-seconds" = "21600"} -Method PUT -Uri http://169.254.169.254/latest/api/token
```

```
Invoke-RestMethod -Headers @{"X-aws-ec2-metadata-token" = $token} -Method GET -Uri http://169.254.169.254/latest/user-data
<powershell>
$file = $env:SystemRoot + "\Temp\" + (Get-Date).ToString("MM-dd-yy-hh-mm")
New-Item $file -ItemType file
</powershell>
<persist>true</persist>
```

*IMDSv1*

```
Invoke-RestMethod -uri http://169.254.169.254/latest/user-data
<powershell>
$file = $env:SystemRoot + "\Temp\" + (Get-Date).ToString("MM-dd-yy-hh-mm")
New-Item $file -ItemType file
</powershell>
<persist>true</persist>
```

------

## 查詢現有執行個體的執行個體中繼資料選項
<a name="query-IMDS-existing-instances"></a>

您可以查詢現有執行個體的執行個體中繼資料選項。

------
#### [ Console ]

**查詢現有執行個體的執行個體中繼資料選項**

1. 前往 [https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/) 開啟 Amazon EC2 主控台。

1. 在導覽窗格中，選擇**執行個體**。

1. 選取執行個體並檢查下列欄位：
   + **IMDSv2** – 值為**必要**或是**選用**。
   + **允許執行個體中繼資料中的標籤** – 值為**已啟用**或是**已停用**。

1. 在已選取執行個體的情況下，選擇**動作**、**執行個體設定**、**修改執行個體中繼資料選項**。

   此對話方塊會顯示所選執行個體的執行個體中繼資料服務是啟用還是停用。

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

**查詢現有執行個體的執行個體中繼資料選項**  
使用 [describe-instances](https://docs.aws.amazon.com/cli/latest/reference/ec2/describe-instances.html) 命令。

```
aws ec2 describe-instances \
    --instance-id i-1234567898abcdef0 \
    --query 'Reservations[].Instances[].MetadataOptions'
```

------
#### [ PowerShell ]

**若要查詢現有執行個體的執行個體中繼資料選項，請使用 Tools for PowerShell**  
使用 [Get-EC2Instance](https://docs.aws.amazon.com/powershell/latest/reference/items/Get-EC2Instance.html) cmdlet。

```
(Get-EC2Instance `
    -InstanceId i-1234567898abcdef0).Instances.MetadataOptions
```

------

## 回應及錯誤訊息
<a name="instance-metadata-returns"></a>

所有執行個體中繼資料都會以文字傳回 (HTTP 內容類型 `text/plain`)。

特定中繼資料資源的請求會傳回適當的值。若資源無法使用，則會傳回 `404 - Not Found` HTTP 錯誤碼。

一般中繼資料資源的請求 (URI 的結尾為 /) 會傳回可用資源的清單，或是 `404 - Not Found` HTTP 錯誤碼 (若沒有該資源的話)。清單項目會位於不同列，以換行字元 (ASCII 10) 終止。

如果 IMDSv1 請求未收到回應，則可能需要 IMDSv2。

對於使用 IMDSv2 提出的請求，可傳回下列 HTTP 錯誤碼：
+ `400 - Missing or Invalid Parameters` –`PUT` 請求無效。
+ `401 - Unauthorized` – `GET` 請求使用的字符無效。建議動作會產生新字符。
+ `403 - Forbidden` – 不允許請求，或 IMDS 已關閉。
+ `404 - Not Found` – 資源無法使用，或是沒有此類資源。
+ `503`：請求無法完成。重試 請求。

如果 IMDS 傳回錯誤，**curl** 會在輸出中列印錯誤訊息，並傳回成功狀態碼。錯誤訊息會儲存在 `TOKEN` 變數中，進而造成使用字符的 **curl** 命令失敗。如果您使用 **-f** 選項呼叫 **curl**，則會在 HTTP 伺服器出現錯誤時傳回錯誤狀態碼。如果您啟用錯誤處理，Shell 可能會攔截錯誤並停止指令碼。

## 查詢調節
<a name="instancedata-throttling"></a>

我們會根據每個執行個體來調整對 IMDS 的查詢，並且我們會限制從執行個體到 IMDS 的同時連線數。

如果您使用 IMDS 擷取 AWS 安全登入資料，請避免在每次交易期間或從大量執行緒或程序同時查詢登入資料，因為這可能會導致限流。相反的，我們建議您快取登入資料，直到其接近到期時間為止。如需有關 IAM 角色以及與該角色相關聯的安全憑證的詳細資訊，請參閱 [從執行個體中繼資料中擷取安全登入資料](instance-metadata-security-credentials.md)。

若您在存取 IMDS 時遭到限流，請使用指數退避策略重試您的查詢。