

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

# Snowball Edge 上的 IMDS 版本
<a name="imds-versions"></a>

您可以使用 IMDS 第 2 版或 IMDS 第 1 版，從執行中的執行個體存取執行個體中繼資料：
+ Instance Metadata Service 第 2 版 (IMDSv2)，一種工作階段導向的方法
+ 執行個體中繼資料服務第 1 版 (IMDSv1)，一種請求回應方法

根據您的 Snow 軟體版本，您可以使用 IMDSv1, IMDSv2 或兩者。這也取決於 EC2-compatible執行個體中執行的 AMI 類型。有些 AMIs，例如執行 Ubuntu 20.04 的 AMI，需要 IMDSv2。執行個體中繼資料服務會根據 `PUT`或 `GET`標頭的存在，區分 IMDSv1 和 IMDSv2 請求。IMDSv2 使用這兩個標頭。IMDSv1 僅使用 `GET`標頭。

AWS 鼓勵使用 IMDSv2 而非 IMDSv1，因為 IMDSv2 包含更高的安全性。如需詳細資訊，請參閱 [透過 EC2 執行個體中繼資料服務的增強功能，提高開放式防火牆、反向代理伺服器及 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-compatible執行個體上無效，如果您嘗試在產生權杖的執行個體之外使用權杖，則會遭到拒絕。

   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 shell 指令碼和 IMDSv2 來擷取最上層執行個體中繼資料項目。此範例：

1. 使用 `PUT`請求建立持續六個小時 (21，600 秒） 的工作階段字符。

1. 將工作階段字符標頭存放在名為 的變數中`TOKEN`。

1. 使用字符請求最上層中繼資料項目。

使用兩個命令來產生 EC2-compatible字符。您可以個別執行命令，或做為一個命令執行。

首先，使用以下命令產生字符。

**注意**  
`X-aws-ec2-metadata-token-ttl-seconds` 是必要的標頭。如果未包含此標頭，您將收到 **400 - 缺少或無效的參數**錯誤代碼。

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

**注意**  
如果建立字符時發生錯誤，則會在 變數中儲存錯誤訊息，而非有效的字符，且命令將無法運作。

您可以存放字符並組合命令。下列範例結合上述兩個命令，並將工作階段字符標頭存放在名為 的變數中`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 地址是 link-local 地址且僅在執行個體中有效。如需詳細資訊，請參閱維基百科上的 [Link-local address](https://en.wikipedia.org/wiki/Link-local_address)。

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

對特定中繼資料資源的請求會傳回適當的值，如果資源不可用，則傳回 **404 - 找不到** HTTP 錯誤代碼。

一般中繼資料資源的請求 （當 URI 以`/`字元結尾時） 會傳回可用資源的清單，如果沒有此類資源，則會傳回 **404 - 找不到** HTTP 錯誤碼。清單項目位於不同的行，以行饋送 (ASCII 字元碼 10) 終止。

對於使用 IMDSv1 提出的請求，可以傳回下列 HTTP 錯誤代碼：
+ **400 - 缺少參數或參數無效** - `PUT`請求無效。
+ **401 – 未授權** — `GET`請求使用無效的字符。建議動作會產生新字符。
+ **403 - 禁止** - 不允許請求或關閉執行個體中繼資料服務。