

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

# 設定執行個體中繼資料服務選項
<a name="configuring-instance-metadata-options"></a>

執行個體中繼資料服務 (IMDS) 會在每個 EC2 執行個體本機上執行。*執行個體中繼資料選項*是指一組能控制 IMDS 在 EC2 執行個體上的可存取性和行為的祖態。

您可以在每個執行個體上設定下列執行個體中繼資料選項：

**執行個體中繼資料服務 (IMDS)**：`enabled` \$1 `disabled`  
您可以在執行個體上啟用或停用 IMDS。停用時，您或任何程式碼都無法在執行個體上存取執行個體中繼資料。  
IMDS 在執行個體上有兩個端點：IPv4 (`169.254.169.254`) 和 IPv6 (`[fd00:ec2::254]`)。當您啟用 IMDS 時，IPv4 端點會自動啟用。如果您想要啟用 IPv6 端點，則需要明確啟用。

**IMDS IPv6 端點**：`enabled` \$1 `disabled`  
您可以在執行個體上明確啟用 IPv6 IMDS 端點。啟用 IPv6 端點時，IPv4 端點會保持啟用狀態。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)受到支援。

**中繼資料版本**：`IMDSv1 or IMDSv2 (token optional)` \$1 `IMDSv2 only (token required)`  
要求執行個體中繼資料時，IMDSv2 呼叫需要字符。IMDSv1 呼叫不需要字符。您可以設定執行個體以允許 IMDSv1 或 IMDSv2 呼叫 (其中字符為選用項目)，或者僅允許 IMDSv2 呼叫 (其中字符為必要項目)。

**中繼資料回應跳轉限制**：`1`–`64`  
跳轉限制是允許 PUT 回應進行的網路跳轉數量。您可以將跳轉限制設定為最小 `1`及最大 `64`。在容器環境中，`1` 的跳轉限制可能會導致問題。如需如何緩解這些問題的資訊，請參閱 [執行個體中繼資料存取考量](instancedata-data-retrieval.md#imds-considerations) 下容器環境的相關資訊。

**存取執行個體中繼資料中的標籤**：`enabled` \$1 `disabled`  
您可以從執行個體中繼資料啟用或停用執行個體標籤的存取權。如需詳細資訊，請參閱[使用執行個體中繼資料檢視 EC2 執行個體的標籤](work-with-tags-in-IMDS.md)。

若要檢視執行個體的目前組態，請參閱 [查詢現有執行個體的執行個體中繼資料選項](instancedata-data-retrieval.md#query-IMDS-existing-instances)。

## 設定執行個體中繼資料選項的位置
<a name="where-to-configure-instance-metadata-options"></a>

執行個體中繼資料選項可以在不同層級設定，如下所示：
+ **帳戶**：您可以在帳戶層級為每個 AWS 區域設定執行個體中繼資料選項的預設值。啟動執行個體時，執行個體中繼資料選項會自動設定為帳戶層級值。您可以在啟動時變更這些值。帳戶層級預設值不會影響現有的執行個體。
+ **AMI**：註冊或修改 AMI 時，可以將 `imds-support` 參數設定為 `v2.0`。使用此 AMI 啟動執行個體時，執行個體中繼資料版本會自動設定為 IMDSv2 且跳轉限制設定為 2。
+ **執行個體**：您可以在啟動時變更所有在執行個體上的執行個體中繼資料選項，並覆寫預設設定。您也可以在執行中或已停止的執行個體啟動後，變更執行個體中繼資料選項。請注意，IAM 或 SCP 政策可能會限制變更。

如需詳細資訊，請參閱[設定新執行個體的執行個體中繼資料選項](configuring-IMDS-new-instances.md)及[修改現有執行個體的執行個體中繼資料選項](configuring-IMDS-existing-instances.md)。

## 執行個體中繼資料選項的優先順序
<a name="instance-metadata-options-order-of-precedence"></a>

每個執行個體中繼資料選項的值都是在執行個體啟動時，依照階層優先順序來決定。階層結構如下，從最上方的最高優先權開始：
+ **優先順序 1：啟動時的執行個體組態**：值可以在啟動範本或執行個體組態中指定。此處指定的任何值都會覆寫在帳戶層級或 AMI 中指定的值。
+ **優先順序 2：帳戶設定** – 如果在執行個體啟動時未指定值，則由帳戶層級設定 （針對每個設定 AWS 區域) 決定。帳戶層級設定會包括每個中繼資料選項的值，或完全不表示任何偏好設定。
+ **優先順序 3：AMI 組態**：如果未在執行個體啟動或帳戶層級指定值，則由 AMI 組態決定。這僅會套用到 `HttpTokens` 和 `HttpPutResponseHopLimit`。

每個中繼資料選項都會分別進行評估。執行個體可以混合使用直接執行個體組態、帳戶層級預設值，以及來自 AMI 的組態加以設定。

您可以在執行中或已停止的執行個體啟動後，變更任何中繼資料選項的值，除非變更內容受限於 IAM 或 SCP 政策。

**注意**  
帳戶層級 IMDSv2 強制執行設定會在優先順序決定執行個體的 IMDS 設定之後進行評估。啟用 IMDSv2 強制執行時，使用 IMDSv1 啟用的執行個體將會失敗。如需強制執行的詳細資訊，請參閱 [在帳戶層級強制執行 IMDSv2](configuring-IMDS-new-instances.md#enforce-imdsv2-at-the-account-level)。

**警告**  
如果已啟用 IMDSv2 強制執行，且未在啟動時執行個體組態、帳戶設定或 AMI 組態`required`中`httpTokens`設定為 ，則您的啟動將會失敗。

**範例 1 – 判斷中繼資料選項的值**

在此範例中，EC2 執行個體會在將 `HttpPutResponseHopLimit` 以帳戶層級設定為 `1` 的區域中啟動。指定的 AMI 已將 `ImdsSupport` 設定為 `v2.0`。啟動時，不會直接在執行個體上指定中繼資料選項。執行個體會使用下列中繼資料選項啟動：

```
"MetadataOptions": {
    ...
    "HttpTokens": "required",
    "HttpPutResponseHopLimit": 1,
    ...
```

這些值的判斷方式如下所示：
+ **啟動時未指定中繼資料選項：**在執行個體啟動期間，未在執行個體啟動參數或啟動範本中提供中繼資料選項的特定值。
+ **帳戶設定的優先順序為次要：**如果啟動時未指定特定值，則以區域內帳戶層級的設定為準。這表示會套用在帳戶層級設定的預設值。在此情況下，已將 `HttpPutResponseHopLimit` 設定為 `1`。
+ **AMI 設定的優先順序為最後：**如果沒有在啟動時或 `HttpTokens` (執行個體中繼資料版本) 之帳戶層級指定的特定值，則套用 AMI 設定。在此情況下，AMI 設定 `ImdsSupport: v2.0` 決定 `HttpTokens` 設定為 `required`。請注意，雖然 AMI 設定 `ImdsSupport: v2.0` 旨在設定 `HttpPutResponseHopLimit: 2`，但優先順序較高的帳戶層級設定 `HttpPutResponseHopLimit: 1` 已將其覆寫。

**範例 2 – 判斷中繼資料選項的值**

在此範例中，EC2 執行個體的啟動設定與範例 1 相同，但 `HttpTokens` 在啟動時執行在執行個體上設定為 `optional`。執行個體會使用下列中繼資料選項啟動：

```
"MetadataOptions": {
    ...
    "HttpTokens": "optional",
    "HttpPutResponseHopLimit": 1,
    ...
```

`HttpPutResponseHopLimit` 的值採用與範例 1 相同的決定方法。但是，`HttpTokens` 的值決定方法如下：啟動時，在執行個體上設定的中繼資料選項為優先。即使 AMI 使用 `ImdsSupport: v2.0` 設定 (也就是，將 `HttpTokens` 設定為 `required`)，啟動時在執行個體上指定的值 (將 `HttpTokens` 設定為 `optional`) 仍為優先。

**範例 3 – 判斷啟用 HttpTokensEnforced 的中繼資料選項的值**

在此範例中， 區域中的帳戶具有 `HttpTokens = required`和 `HttpTokensEnforced = enabled`。

請考慮下列 EC2 執行個體啟動嘗試：
+ 啟動嘗試`HttpTokens`設定為 `optional` – 啟動失敗，因為已啟用帳戶層級強制執行 (`HttpTokensEnforced = enabled`)，且啟動參數優先於帳戶預設值。
+ `HttpTokens` 將 設定為 的啟動嘗試 `required` – 啟動成功，因為它符合帳戶層級強制執行。
+ 未指定`HttpTokens`值的啟動嘗試 – 啟動會成功，因為該值`required`會根據帳戶設定預設為 。

### 設定執行個體中繼資料版本
<a name="metadata-version-order-of-precedence"></a>

啟動執行個體時，執行個體*中繼資料版本的*值為 **IMDSv1 或 IMDSv2 （金鑰選用）** (`httpTokens=optional`) 或**僅限 IMDSv2 （需要金鑰） (`httpTokens=required`) **。

在執行個體啟動時，您可以手動指定中繼資料版本的值，或使用預設值。如果您手動指定值，即會覆寫任何預設值。如果您選擇不手動指定值，則會由預設設定的組合決定。

下列流程圖顯示啟動時執行個體的中繼資料版本如何取決於不同組態層級的設定，以及強制執行的評估位置。以下資料表提供每個層級的特定設定。

![\[流程圖，顯示執行個體中繼資料版本和 IMDSv2 強制執行的評估點。\]](http://docs.aws.amazon.com/zh_tw/AWSEC2/latest/UserGuide/images/imds-defaults-launch-flow.png)


此表格顯示啟動時的執行個體中繼資料版本 (如欄 4 中**產生的執行個體組態**所示) 如何由不同組態層級的設定決定。優先順序從左到右，其中第一欄採用最高優先順序，如下所示：
+ 欄 1：**啟動參數**：代表您在啟動時手動指定之執行個體上的設定。
+ 欄 2：**帳戶層級預設值**：代表帳戶的設定。
+ 欄 3：**AMI 預設值**：代表 AMI 上的設定。


| 啟動參數 | 帳戶層級預設值 | AMI 預設值 | 產生的執行個體組態 | 
| --- | --- | --- | --- | 
| 僅限 V2 (需要字符) | 無偏好設定 | 僅限 V2 | 僅限 V2 | 
| 僅限 V2 (需要字符) | 僅限 V2 | 僅限 V2 | 僅限 V2 | 
| 僅限 V2 (需要字符) | V1 或 V2 | 僅限 V2 | 僅限 V2 | 
| V1 或 V2 (字符為選用項目) | 無偏好設定 | 僅限 V2 | V1 或 V2 | 
| V1 或 V2 (字符為選用項目) | 僅限 V2 | 僅限 V2 | V1 或 V2 | 
| V1 或 V2 (字符為選用項目) | V1 或 V2 | 僅限 V2 | V1 或 V2 | 
| 未設定 | 無偏好設定 | 僅限 V2 | 僅限 V2 | 
| 未設定 | 僅限 V2 | 僅限 V2 | 僅限 V2 | 
| 未設定 | V1 或 V2 | 僅限 V2 | V1 或 V2 | 
| 僅限 V2 (需要字符) | 無偏好設定 | null | 僅限 V2 | 
| 僅限 V2 (需要字符) | 僅限 V2 | null | 僅限 V2 | 
| 僅限 V2 (需要字符) | V1 或 V2 | null | 僅限 V2 | 
| V1 或 V2 (字符為選用項目) | 無偏好設定 | null | V1 或 V2 | 
| V1 或 V2 (字符為選用項目) | 僅限 V2 | null | V1 或 V2 | 
| V1 或 V2 (字符為選用項目) | V1 或 V2 | null | V1 或 V2 | 
| 未設定 | 無偏好設定 | null | V1 或 V2 | 
| 未設定 | 僅限 V2 | null | 僅限 V2 | 
| 未設定 | V1 或 V2 | null | V1 或 V2 | 

## 使用 IAM 條件索引鍵限制執行個體中繼資料選項
<a name="iam-condition-keys-and-imds"></a>

您可以在 IAM 政策或 SCP 中使用 IAM 條件索引鍵，如下所示：
+ 只有在執行個體設定為需要使用 IMDSv2 時才允許啟動該執行個體
+ 限制允許的轉跳數目
+ 關閉對執行個體中繼資料的存取

**Topics**
+ [設定執行個體中繼資料選項的位置](#where-to-configure-instance-metadata-options)
+ [執行個體中繼資料選項的優先順序](#instance-metadata-options-order-of-precedence)
+ [使用 IAM 條件索引鍵限制執行個體中繼資料選項](#iam-condition-keys-and-imds)
+ [設定新執行個體的執行個體中繼資料選項](configuring-IMDS-new-instances.md)
+ [修改現有執行個體的執行個體中繼資料選項](configuring-IMDS-existing-instances.md)

**注意**  
您應該謹慎繼續執行和仔細進行測試，然後再進行任何變更。請記得下列事項：  
如果您強制使用 IMDSv2，使用 IMDSv1 來存取執行個體中繼資料的應用程式或代理程式便會中斷。
如果您關閉對執行個體中繼資料的所有存取，則需要存取執行個體中繼資料才能正常運作的應用程式或代理程式便會中斷。
對於 IMDSv2，在檢索字符時必須使用 `/latest/api/token`。
(僅限 Windows) 如果您的 PowerShell 版本早於 4.0，您必須[更新至 Windows Management Framework 4.0](https://devblogs.microsoft.com/powershell/windows-management-framework-wmf-4-0-update-now-available-for-windows-server-2012-windows-server-2008-r2-sp1-and-windows-7-sp1/)，才能使用 IMDSv2。

# 設定新執行個體的執行個體中繼資料選項
<a name="configuring-IMDS-new-instances"></a>

您可以為新執行個體設定下列執行個體中繼資料選項。

**Topics**
+ [需要使用 IMDSv2](#configure-IMDS-new-instances)
+ [啟用 IMDS IPv4 和 IPv6 端點](#configure-IMDS-new-instances-ipv4-ipv6-endpoints)
+ [關閉對執行個體中繼資料的存取](#configure-IMDS-new-instances--turn-off-instance-metadata)
+ [允許存取執行個體中繼資料中的標籤](#configure-IMDS-new-instances-tags-in-instance-metadata)

**注意**  
這些選項的設定是在帳戶層級所設定，可直接在帳戶中設定，或使用宣告式政策來設定。它們必須在每個您要設定執行個體中繼資料選項的 AWS 區域 中設定。您可使用宣告式政策同時在多個區域及多個帳戶套用設定。使用宣告式政策時，您無法直接在帳戶中修改設定。本主題說明如何直接在帳戶內配置設定。如需使用宣告式政策的相關資訊，請參閱「AWS Organizations 使用者指南」**中的[宣告式政策](https://docs.aws.amazon.com/organizations/latest/userguide/orgs_manage_policies_declarative.html)。

## 需要使用 IMDSv2
<a name="configure-IMDS-new-instances"></a>

您可以使用下列方法來要求在新執行個體上使用 IMDSv2。

**Topics**
+ [將 IMDSv2 設定為帳戶的預設值](#set-imdsv2-account-defaults)
+ [在帳戶層級強制執行 IMDSv2](#enforce-imdsv2-at-the-account-level)
+ [啟動時設定執行個體](#configure-IMDS-new-instances-instance-settings)
+ [設定 AMI](#configure-IMDS-new-instances-ami-configuration)
+ [使用 IAM 政策](#configure-IMDS-new-instances-iam-policy)

### 將 IMDSv2 設定為帳戶的預設值
<a name="set-imdsv2-account-defaults"></a>

您可以在帳戶層級為每個執行個體中繼資料服務 (IMDS) 設定預設版本 AWS 區域。這表示在啟動*新的*執行個體時，執行個體中繼資料版本會自動設定為帳戶層級的預設值。但是，您可以在啟動時或啟動後手動覆寫該值。如需有關帳戶層級設定和手動覆寫如何影響執行個體的詳細資訊，請參閱 [執行個體中繼資料選項的優先順序](configuring-instance-metadata-options.md#instance-metadata-options-order-of-precedence)。

**注意**  
設定帳戶層級預設值不會重設*現有的*執行個體。例如，如果您將帳戶層級預設值設定為 IMDSv2，則任何設為 IMDSv1 的現有執行個體都不會受到影響。若要變更現有執行個體的值，您必須手動變更執行個體本身的值。

您可以將執行個體中繼資料版本的帳戶預設值設定為 IMDSv2，因此所有在帳戶啟動中的*新*執行個體都需要 IMDSv2，且 IMDSv1 會停用。當您使用此帳戶預設值啟動執行個體時，下列是執行個體的預設值：
+ 主控台：**中繼資料版本**僅設定為 **V2 (需要字符)**，且**中繼資料回應跳轉限制**設定為 **2**。
+ AWS CLI：將 `HttpTokens` 設定為 `required`，並將 `HttpPutResponseHopLimit` 設定為 `2`。

**注意**  
在將帳戶預設值設定為 IMDSv2 之前，請確定您的執行個體不依賴於 IMDSv1。如需詳細資訊，請參閱[需要 IMDSv2 的建議路徑](instance-metadata-transition-to-version-2.md#recommended-path-for-requiring-imdsv2)。

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

**將 IMDSv2 設定為指定區域的帳戶預設值**

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

1. 若要變更 AWS 區域，請使用頁面右上角的區域選擇器。

1. 在導覽窗格中，選擇 **Dashboard (儀表板)**。

1. 在**帳戶屬性**卡片**的設定**下，選擇**資料保護和安全性**。

1. 在 **IMDS 預設值**旁邊，選擇**管理**。

1. 在**管理 IMDS 預設值**頁面上，執行下列操作：

   1. 在**執行個體中繼資料服務**中，選擇**啟用**。

   1. 針對 **Metadata version** (中繼資料版本)，選擇 **V2 only (token required)** (僅限 V2 (需要權杖))。

   1. 在**中繼資料回應跳轉限制**中，如果您的執行個體將託管容器，請指定 **2**。否則，請選取**無偏好設定**。如果未指定偏好設定，則在啟動時，AMI 具有設定 `ImdsSupport: v2.0` 的情況下預設值為 **2**；否則，預設值為 **1**。

   1. 選擇**更新**。

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

**將 IMDSv2 設定為指定區域的帳戶預設值**  
使用 [modify-instance-metadata-defaults](https://docs.aws.amazon.com/cli/latest/reference/ec2/modify-instance-metadata-defaults.html) 命令，並指定要在其中修改 IMDS 帳戶層級設定的區域。如果您的執行個體將託管容器，請將 `--http-tokens` 設定為 `required` 並將 `--http-put-response-hop-limit` 設定為 `2`。否則，請指定 `-1` 以表示沒有偏好設定。如果指定 `-1` (無偏好設定)，則在啟動時，AMI 具有設定 `ImdsSupport: v2.0` 的情況下預設值為 `2`；否則，預設值為 `1`。

```
aws ec2 modify-instance-metadata-defaults \
    --region us-east-1 \
    --http-tokens required \
    --http-put-response-hop-limit 2
```

以下為範例輸出。

```
{
    "Return": true
}
```

**針對指定區域檢視執行個體中繼資料選項的預設帳戶設定**  
使用 [get-instance-metadata-defaults](https://docs.aws.amazon.com/cli/latest/reference/ec2/get-instance-metadata-defaults.html) 命令並指定區域。

```
aws ec2 get-instance-metadata-defaults --region us-east-1
```

以下為範例輸出。

```
{
    "AccountLevel": {
        "HttpTokens": "required",
        "HttpPutResponseHopLimit": 2
    },
    "ManagedBy": "account"
}
```

`ManagedBy` 欄位會指出進行相關設定的實體。在此範例中，`account` 會指出直接在帳戶中進行的設定。值為 `declarative-policy` 表示設定是透過宣告式政策來配置。如需詳細資訊，請參閱「AWS Organizations 使用者指南」**中的[宣告式政策](https://docs.aws.amazon.com/organizations/latest/userguide/orgs_manage_policies_declarative.html)。

**將 IMDSv2 設定為所有區域的帳戶預設值**  
使用 [modify-instance-metadata-defaults](https://docs.aws.amazon.com/cli/latest/reference/ec2/modify-instance-metadata-defaults.html) 命令，以修改所有區域的 IMDS 帳戶層級設定。如果您的執行個體將託管容器，請將 `--http-tokens` 設定為 `required` 並將 `--http-put-response-hop-limit` 設定為 `2`。否則，請指定 `-1` 以表示沒有偏好設定。如果指定 `-1` (無偏好設定)，則在啟動時，AMI 具有設定 `ImdsSupport: v2.0` 的情況下預設值為 `2`；否則，預設值為 `1`。

```
echo -e "Region          \t Modified" ; \
echo -e "--------------  \t ---------" ; \
for region in $(
    aws ec2 describe-regions \
        --region us-east-1 \
        --query "Regions[*].[RegionName]" \
        --output text
    ); 
    do (output=$(
        aws ec2 modify-instance-metadata-defaults \
            --region $region \
            --http-tokens required \
            --http-put-response-hop-limit 2 \
            --output text)
        echo -e "$region        \t $output"
    );
done
```

以下為範例輸出。

```
Region                   Modified
--------------           ---------
ap-south-1               True
eu-north-1               True
eu-west-3                True
...
```

**針對所有區域檢視執行個體中繼資料選項的預設帳戶設定**  
使用 [get-instance-metadata-defaults](https://docs.aws.amazon.com/cli/latest/reference/ec2/get-instance-metadata-defaults.html) 命令。

```
echo -e "Region   \t Level          Hops    HttpTokens" ; \
echo -e "-------------- \t ------------   ----    ----------" ; \
for region in $(
    aws ec2 describe-regions \
        --region us-east-1 \
        --query "Regions[*].[RegionName]" \
        --output text
    ); 
    do (output=$(
        aws ec2 get-instance-metadata-defaults \
            --region $region \
            --output text)
        echo -e "$region \t $output" 
    );
done
```

以下為範例輸出。

```
Region           Level          Hops    HttpTokens
--------------   ------------   ----    ----------
ap-south-1       ACCOUNTLEVEL   2       required
eu-north-1       ACCOUNTLEVEL   2       required
eu-west-3        ACCOUNTLEVEL   2       required
...
```

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

**將 IMDSv2 設定為指定區域的帳戶預設值**  
使用 [Edit-EC2InstanceMetadataDefault](https://docs.aws.amazon.com/powershell/latest/reference/items/Edit-EC2InstanceMetadataDefault.html) cmdlet，並指定要在其中修改 IMDS 帳戶層級設定的區域。如果您的執行個體將託管容器，請將 `-HttpToken` 設定為 `required` 並將 `-HttpPutResponseHopLimit` 設定為 `2`。否則，請指定 `-1` 以表示沒有偏好設定。如果指定 `-1` (無偏好設定)，則在啟動時，AMI 具有設定 `ImdsSupport: v2.0` 的情況下預設值為 `2`；否則，預設值為 `1`。

```
Edit-EC2InstanceMetadataDefault `
    -Region us-east-1 `
    -HttpToken required `
    -HttpPutResponseHopLimit 2
```

以下為範例輸出。

```
True
```

**針對指定區域檢視執行個體中繼資料選項的預設帳戶設定**  
使用 [Get-EC2InstanceMetadataDefault](https://docs.aws.amazon.com/powershell/latest/reference/items/Get-EC2InstanceMetadataDefault.html) cmdlet 並指定區域。

```
Get-EC2InstanceMetadataDefault -Region us-east-1 | Format-List
```

以下為範例輸出。

```
HttpEndpoint            : 
HttpPutResponseHopLimit : 2
HttpTokens              : required
InstanceMetadataTags    :
```

**將 IMDSv2 設定為所有區域的帳戶預設值**  
使用 [Edit-EC2InstanceMetadataDefault](https://docs.aws.amazon.com/powershell/latest/reference/items/Edit-EC2InstanceMetadataDefault.html) cmdlet 修改所有區域的 IMDS 帳戶層級設定。如果您的執行個體將託管容器，請將 `-HttpToken` 設定為 `required` 並將 `-HttpPutResponseHopLimit` 設定為 `2`。否則，請指定 `-1` 以表示沒有偏好設定。如果指定 `-1` (無偏好設定)，則在啟動時，AMI 具有設定 `ImdsSupport: v2.0` 的情況下預設值為 `2`；否則，預設值為 `1`。

```
(Get-EC2Region).RegionName | `
    ForEach-Object {
    [PSCustomObject]@{
        Region   = $_
        Modified = (Edit-EC2InstanceMetadataDefault `
                -Region $_ `
                -HttpToken required `
                -HttpPutResponseHopLimit 2)
    } 
} | `
Format-Table Region, Modified -AutoSize
```

預期的輸出結果

```
Region         Modified
------         --------
ap-south-1         True
eu-north-1         True
eu-west-3          True
...
```

**針對所有區域檢視執行個體中繼資料選項的預設帳戶設定**  
使用 [Get-EC2InstanceMetadataDefault](https://docs.aws.amazon.com/powershell/latest/reference/items/Get-EC2InstanceMetadataDefault.html) cmdlet。

```
(Get-EC2Region).RegionName | `
    ForEach-Object {
    [PSCustomObject]@{
        Region = $_
        HttpPutResponseHopLimit = (Get-EC2InstanceMetadataDefault -Region $_).HttpPutResponseHopLimit
        HttpTokens              = (Get-EC2InstanceMetadataDefault -Region $_).HttpTokens
    }
} | `
Format-Table -AutoSize
```

範例輸出

```
Region         HttpPutResponseHopLimit HttpTokens
------         ----------------------- ----------
ap-south-1                           2 required
eu-north-1                           2 required
eu-west-3                            2 required                    
...
```

------

### 在帳戶層級強制執行 IMDSv2
<a name="enforce-imdsv2-at-the-account-level"></a>

您可以在每個帳戶層級強制使用 IMDSv2 AWS 區域。強制執行時，執行個體只能在設定為需要 IMDSv2 時啟動。無論執行個體或 AMI 的設定方式為何，此強制執行都適用。

**注意**  
在帳戶層級啟用 IMDSv2 強制執行之前，請確定您的應用程式和 AMIs 支援 IMDSv2。如需詳細資訊，請參閱[需要 IMDSv2 的建議路徑](instance-metadata-transition-to-version-2.md#recommended-path-for-requiring-imdsv2)。如果已啟用 IMDSv2 強制執行`httpTokens`，且在啟動時執行個體組態、帳戶設定或 AMI 組態`required`中未設定為 ，則執行個體啟動將會失敗。如需故障診斷資訊，請參閱[啟動IMDSv1-enabled的執行個體失敗](troubleshooting-launch.md#launching-an-imdsv1-enabled-instance-fails)。

**注意**  
此設定不會變更現有執行個體的 IMDS 版本，而是封鎖在目前已停用 IMDSv1 的現有執行個體上啟用 IMDSv1。

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

**為指定區域中的帳戶強制執行 IMDSv2**

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

1. 若要變更 AWS 區域，請使用頁面右上角的區域選擇器。

1. 在導覽窗格中，選擇 **Dashboard (儀表板)**。

1. 在**帳戶屬性**卡片**的設定**下，選擇**資料保護和安全性**。

1. 在 **IMDS 預設值**旁邊，選擇**管理**。

1. 在**管理 IMDS 預設值**頁面上，執行下列操作：

   1. 針對 **Metadata version** (中繼資料版本)，選擇 **V2 only (token required)** (僅限 V2 (需要權杖))。

   1. 針對**強制執行 IMDSv2**，選擇**已啟用**。

   1. 選擇**更新**。

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

**為指定區域中的帳戶強制執行 IMDSv2**  
 使用 [modify-instance-metadata-defaults](https://docs.aws.amazon.com/cli/latest/reference/ec2/modify-instance-metadata-defaults.html) 命令，並指定要在其中強制執行 IMDSv2 的區域。

```
aws ec2 modify-instance-metadata-defaults \
    --region us-east-1 \
    --http-tokens required \
    --http-tokens-enforced enabled
```

以下為範例輸出。

```
{
"Return": true
}
```

**檢視特定區域中帳戶的 IMDSv2 強制執行設定**  
使用 [get-instance-metadata-defaults](https://docs.aws.amazon.com/cli/latest/reference/ec2/get-instance-metadata-defaults.html) 命令並指定區域。

```
aws ec2 get-instance-metadata-defaults --region us-east-1
```

以下為範例輸出。

```
{
    "AccountLevel": {
        "HttpTokens": "required",
        "HttpTokensEnforced": "enabled"
    },
    "ManagedBy": "account"
}
```

`ManagedBy` 欄位會指出進行相關設定的實體。在此範例中，`account` 會指出直接在帳戶中進行的設定。值為 `declarative-policy` 表示設定是透過宣告式政策來配置。如需詳細資訊，請參閱 *AWS Organizations 使用者指南*中的[宣告政策](https://docs.aws.amazon.com/organizations/latest/userguide/orgs_manage_policies_declarative.html)。

**為所有區域強制執行帳戶的 IMDSv2**  
使用 [modify-instance-metadata-defaults](https://docs.aws.amazon.com/cli/latest/reference/ec2/modify-instance-metadata-defaults.html) 命令，在所有區域中強制執行 IMDSv2。

```
echo -e "Region          \t Modified" ; \
echo -e "--------------  \t ---------" ; \
for region in $(
    aws ec2 describe-regions \
        --region us-east-1 \
        --query "Regions[*].[RegionName]" \
        --output text
    ); 
    do (output=$(
        aws ec2 modify-instance-metadata-defaults \
            --region $region \
            --http-tokens-enforced enabled \
            --output text)
        echo -e "$region        \t $output"
    );
done
```

以下為範例輸出。

```
Region                   Modified
--------------           ---------
ap-south-1               True
eu-north-1               True
eu-west-3                True
...
```

**檢視所有區域中帳戶的 IMDSv2 強制執行設定**  
使用 [get-instance-metadata-defaults](https://docs.aws.amazon.com/cli/latest/reference/ec2/get-instance-metadata-defaults.html) 命令。

```
echo -e "Region   \t Level           HttpTokensEnforced" ; \
echo -e "-------------- \t ------------   ----------------" ; \
for region in $(
    aws ec2 describe-regions \
        --region us-east-1 \
        --query "Regions[*].[RegionName]" \
        --output text
    ); 
    do (output=$(
        aws ec2 get-instance-metadata-defaults \
            --region $region \
            --query 'AccountLevel.HttpTokensEnforced' \           
            --output text)
        echo -e "$region \t ACCOUNTLEVEL $output" 
    );
done
```

以下為範例輸出。

```
Region           Level          HttpTokensEnforced
--------------   ------------   ------------------
ap-south-1       ACCOUNTLEVEL   enabled
eu-north-1       ACCOUNTLEVEL   enabled
eu-west-3        ACCOUNTLEVEL   enabled
...
```

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

**為指定區域中的帳戶強制執行 IMDSv2**  
使用 [Edit-EC2InstanceMetadataDefault](https://docs.aws.amazon.com/powershell/latest/reference/items/Edit-EC2InstanceMetadataDefault.html) cmdlet，並指定要在其中強制執行 IMDSv2 的區域。

```
Edit-EC2InstanceMetadataDefault `
    -Region us-east-1 `
    -HttpToken required `
    -HttpPutResponseHopLimit 2
```

以下為範例輸出。

```
@{
    Return = $true
}
```

**檢視特定區域中帳戶的 IMDSv2 強制執行設定**  
使用 Get-EC2InstanceMetadataDefault 命令並指定區域。

```
Get-EC2InstanceMetadataDefault -Region us-east-1
```

以下為範例輸出。

```
@{
    AccountLevel = @{
        HttpTokens = "required"
        HttpTokensEnforced = "enabled"
    }
    ManagedBy = "account"
}
```

`ManagedBy` 欄位會指出進行相關設定的實體。在此範例中，`account` 會指出直接在帳戶中進行的設定。值為 `declarative-policy` 表示設定是透過宣告式政策來配置。如需詳細資訊，請參閱 *AWS Organizations 使用者指南*中的[宣告政策](https://docs.aws.amazon.com/organizations/latest/userguide/orgs_manage_policies_declarative.html)。

**為所有區域強制執行帳戶的 IMDSv2**  
使用 [modify-instance-metadata-defaults](https://docs.aws.amazon.com/cli/latest/reference/ec2/modify-instance-metadata-defaults.html) 命令，在所有區域中強制執行 IMDSv2。

```
echo -e "Region          \t Modified" ; \
echo -e "--------------  \t ---------" ; \
for region in $(
    aws ec2 describe-regions \
        --region us-east-1 \
        --query "Regions[*].[RegionName]" \
        --output text
    ); 
    do (output=$(
        aws ec2 modify-instance-metadata-defaults \
            --region $region \
            --http-tokens-enforced enabled \
            --output text)
        echo -e "$region        \t $output"
    );
done
```

以下為範例輸出。

```
Region                   Modified
--------------           ---------
ap-south-1               True
eu-north-1               True
eu-west-3                True
...
```

**將 IMDSv2 設定為所有區域的帳戶預設值**  
使用 [Edit-EC2InstanceMetadataDefault](https://docs.aws.amazon.com/powershell/latest/reference/items/Edit-EC2InstanceMetadataDefault.html) cmdlet 修改所有區域的 IMDS 帳戶層級設定。如果您的執行個體將託管容器，請將 `-HttpToken` 設定為 `required` 並將 `-HttpPutResponseHopLimit` 設定為 `2`。否則，請指定 `-1` 以表示沒有偏好設定。如果指定 `-1` (無偏好設定)，則在啟動時，AMI 具有設定 `ImdsSupport: v2.0` 的情況下預設值為 `2`；否則，預設值為 `1`。

```
(Get-EC2Region).RegionName | `
    ForEach-Object {
    [PSCustomObject]@{
        Region   = $_
        Modified = (Edit-EC2InstanceMetadataDefault `
                -Region $_ `
                -HttpToken required `
                -HttpPutResponseHopLimit 2)
    } 
} | `
Format-Table Region, Modified -AutoSize
```

預期的輸出結果

```
Region         Modified
------         --------
ap-south-1         True
eu-north-1         True
eu-west-3          True
...
```

**針對所有區域檢視執行個體中繼資料選項的預設帳戶設定**  
使用 [Get-EC2InstanceMetadataDefault](https://docs.aws.amazon.com/powershell/latest/reference/items/Get-EC2InstanceMetadataDefault.html) cmdlet。

```
(Get-EC2Region).RegionName | `
    ForEach-Object {
    [PSCustomObject]@{
        Region = $_
        HttpPutResponseHopLimit = (Get-EC2InstanceMetadataDefault -Region $_).HttpPutResponseHopLimit
        HttpTokens              = (Get-EC2InstanceMetadataDefault -Region $_).HttpTokens
    }
} | `
Format-Table -AutoSize
```

範例輸出

```
Region         HttpPutResponseHopLimit HttpTokens
------         ----------------------- ----------
ap-south-1                           2 required
eu-north-1                           2 required
eu-west-3                            2 required                    
...
```

------

### 啟動時設定執行個體
<a name="configure-IMDS-new-instances-instance-settings"></a>

[啟動執行個體](ec2-launch-instance-wizard.md)時，您可以設定下列欄位，將執行個體設定為需要使用 IMDSv2：
+ Amazon EC2 主控台：將 **Metadata version** (中繼資料版本) 設為 **V2 only (token required)** (僅 V2 (需要權杖))。
+ AWS CLI：將 `HttpTokens` 設為 `required`。

當您指定需要 IMDSv2 時，也必須透過將**可存取中繼資料**設定為**已啟用** (主控台) 或將 `HttpEndpoint` 設為 `enabled` (AWS CLI) 來啟用執行個體中繼資料服務 (IMDS) 端點。

在容器環境中，如果需要 IMDSv2，建議將跳轉限制設定為 `2`。如需詳細資訊，請參閱[執行個體中繼資料存取考量](instancedata-data-retrieval.md#imds-considerations)。

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

**要求在新執行個體上使用 IMDSv2**
+ 在 Amazon EC2 主控台中啟動新執行個體時，展開 **Advanced details** (進階詳細資訊)，並執行下列動作：
  + 針對 **Metadata accessible** (可存取中繼資料)，選擇 **Enabled** (已啟用)。
  + 針對 **Metadata version** (中繼資料版本)，選擇 **V2 only (token required)** (僅限 V2 (需要權杖))。
  + (容器環境) 在**中繼資料回應跳轉限制**中，選擇 **2**。

  如需詳細資訊，請參閱[進階詳細資訊](ec2-instance-launch-parameters.md#liw-advanced-details)。

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

**要求在新執行個體上使用 IMDSv2**  
下列 [run-instances](https://docs.aws.amazon.com/cli/latest/reference/ec2/run-instances.html) 範例會啟動 `c6i.large` 設定為 `--metadata-options` 的`HttpTokens=required` 執行個體。當您為 `HttpTokens` 指定值時，您也必須將 `HttpEndpoint` 設定為 `enabled`。由於中繼資料擷取請求的安全權杖標頭設定為 `required`，因此在要求執行個體中繼資料時需要執行個體使用 IMDSv2。

在容器環境中，如果需要 IMDSv2，建議使用 `HttpPutResponseHopLimit=2` 將跳轉限制設定為 `2`。

```
aws ec2 run-instances \
    --image-id ami-0abcdef1234567890 \
    --instance-type c6i.large \
	...
    --metadata-options "HttpEndpoint=enabled,HttpTokens=required,HttpPutResponseHopLimit=2"
```

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

**要求在新執行個體上使用 IMDSv2**  
下列 [New-EC2Instance](https://docs.aws.amazon.com/powershell/latest/reference/items/New-EC2Instance.html) cmdlet 範例會啟動`c6i.large`執行個體，並將 `MetadataOptions_HttpEndpoint` 設定為 `enabled`，並將 `MetadataOptions_HttpTokens` 參數設定為 `required`。當您為 `HttpTokens` 指定值時，您也必須將 `HttpEndpoint` 設定為 `enabled`。由於中繼資料擷取請求的安全權杖標頭設定為 `required`，因此在要求執行個體中繼資料時需要執行個體使用 IMDSv2。

```
New-EC2Instance `
    -ImageId ami-0abcdef1234567890 `
    -InstanceType c6i.large `
    -MetadataOptions_HttpEndpoint enabled `
    -MetadataOptions_HttpTokens required
```

------
#### [ CloudFormation ]

若要使用 指定執行個體的中繼資料選項 CloudFormation，請參閱*AWS CloudFormation 《 使用者指南*》中的 [AWS::EC2::LaunchTemplate MetadataOptions](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-metadataoptions.html) 屬性。

------

### 設定 AMI
<a name="configure-IMDS-new-instances-ami-configuration"></a>

註冊新 AMI 或修改現有 AMI 時，可以將 `imds-support` 參數設定為 `v2.0`。從此 AMI 啟動的執行個體會將**中繼資料版本**設定為**僅 V2 (需要權杖)** (主控台) 或將 `HttpTokens` 設為 `required` (AWS CLI)。透過這些設定，執行個體要求在請求執行個體中繼資料時使用 IMDSv2。

請注意，當您將 `imds-support` 設為 `v2.0` 時，從這個 AMI 啟動的執行個體也將有 **Metadata response hop limit** (中繼資料回應跳轉限制) (主控台) 或將 `http-put-response-hop-limit` (AWS CLI) 設為 **2**。

**重要**  
除非 AMI 軟體支援 IMDSv2，否則請勿使用此參數。將值設為 `v2.0` 後，將無法復原。「重設」AMI 的唯一方法是從基礎快照中建立一個新的 AMI。

**設定適用於 IMDSv2 的新 AMI**  
使用下列其中一種方法來為 IMDSv2 設定新的 AMI。

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

以下 [register-image](https://docs.aws.amazon.com/cli/latest/reference/ec2/register-image.html) 範例使用指定的 EBS 根磁碟區快照作為裝置 `/dev/xvda` 來註冊 AMI。為 `imds-support` 參數指定 `v2.0`，以便從此 AMI 啟動的執行個體在請求執行個體中繼資料時要求使用 IMDSv2。

```
aws ec2 register-image \
    --name my-image \
    --root-device-name /dev/xvda \
    --block-device-mappings DeviceName=/dev/xvda,Ebs={SnapshotId=snap-0123456789example} \
    --architecture x86_64 \
    --imds-support v2.0
```

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

下列 [Register-EC2Image](https://docs.aws.amazon.com/powershell/latest/reference/items/Register-EC2Image.html) cmdlet 範例會使用 EBS 根磁碟區的指定快照，將 AMI 註冊為裝置 `/dev/xvda`。為 `ImdsSupport` 參數指定 `v2.0`，以便從此 AMI 啟動的執行個體在請求執行個體中繼資料時要求使用 IMDSv2。

```
Register-EC2Image `
    -Name 'my-image' `
    -RootDeviceName /dev/xvda `
    -BlockDeviceMapping  ( 
    New-Object `
        -TypeName Amazon.EC2.Model.BlockDeviceMapping `
        -Property @{ 
        DeviceName = '/dev/xvda'; 
        EBS        = (New-Object -TypeName Amazon.EC2.Model.EbsBlockDevice -Property @{ 
                SnapshotId = 'snap-0123456789example'
                VolumeType = 'gp3' 
                } )      
        }  ) `
    -Architecture X86_64 `
    -ImdsSupport v2.0
```

------

**設定適用於 IMDSv2 的現有 AMI**  
使用下列其中一種方法來為 IMDSv2 設定現有的 AMI。

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

下列 [modify-image-attribute](https://docs.aws.amazon.com/cli/latest/reference/ec2/modify-image-attribute.html) 範例只會修改 IMDSv2 的現有 AMI。為 `imds-support` 參數指定 `v2.0`，以便從此 AMI 啟動的執行個體在請求執行個體中繼資料時要求使用 IMDSv2。

```
aws ec2 modify-image-attribute \
    --image-id ami-0abcdef1234567890 \
    --imds-support v2.0
```

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

下列 [Edit-EC2ImageAttribute](https://docs.aws.amazon.com/powershell/latest/reference/items/Edit-EC2ImageAttribute.html) cmdlet 範例只會修改 IMDSv2 的現有 AMI。為 `imds-support` 參數指定 `v2.0`，以便從此 AMI 啟動的執行個體在請求執行個體中繼資料時要求使用 IMDSv2。

```
Edit-EC2ImageAttribute `
    -ImageId ami-0abcdef1234567890 `
    -ImdsSupport 'v2.0'
```

------

### 使用 IAM 政策
<a name="configure-IMDS-new-instances-iam-policy"></a>

您可以建立執行下列其中一項動作的 IAM 政策：
+ 防止使用者啟動新執行個體，除非使用者在新執行個體上需要 IMDSv2。
+ 防止使用者呼叫 ModifyInstanceMetadataOptions API 來變更執行中執行個體的中繼資料選項。限制對 ModifyInstanceMetadataOptions httpTokens 屬性的存取，以防止執行中執行個體的意外更新。
+ 防止使用者呼叫 ModifyInstanceMetadataDefaults API 來變更 httpTokens 和 httpTokensEnforced 的帳戶預設設定。限制存取這兩個屬性可確保只有授權的角色才能修改帳戶預設值。

**透過使用 IAM 政策，在所有新執行個體上強制使用 IMDSv2**  
若要確保使用者在請求執行個體中繼資料時只能啟動需要使用 IMDSv2 的執行個體，請執行下列動作：
+ 限制對 `ModifyInstanceMetadataOptions`和 `ModifyInstanceMetadataDefaults` API 的存取，特別是 `httpTokens`和 `httpTokensEnforced` 屬性。
+ 然後，將帳戶預設為 `httpTokens = required`和 `httpTokensEnforced = enabled`。

  如需 IAM 政策範例，請參閱[使用執行個體中繼資料](ExamplePolicies_EC2.md#iam-example-instance-metadata)。

## 啟用 IMDS IPv4 和 IPv6 端點
<a name="configure-IMDS-new-instances-ipv4-ipv6-endpoints"></a>

IMDS 在執行個體上有兩個端點：IPv4 (`169.254.169.254`) 和 IPv6 (`[fd00:ec2::254]`)。當您啟用 IMDS 時，IPv4 端點會自動啟用。即使您在僅限 IPv6 的子網路中啟動執行個體，IPv6 端點仍會保持停用狀態。若要啟用 IPv6 端點，則需要明確啟用。當您啟用 IPv6 端點時，IPv4 端點會保持啟用狀態。

您可以在執行個體啟動時或啟動之後啟用 IPv6 端點。

**啟用 IPv6 端點的需求**
+ 選取的執行個體類型是 [Nitro 型執行個體](instance-types.md#instance-hypervisor-type)。
+ 選取的子網路支援 IPv6，其中子網路[僅支援雙重堆疊或 IPv6](https://docs.aws.amazon.com/vpc/latest/userguide/configure-subnets.html#subnet-ip-address-range)。

使用下列任一種方法來啟動已啟用 IMDS IPv6 端點的執行個體。

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

**在執行個體啟動時啟用 IMDS IPv6 端點**
+ 在 Amazon EC2 主控台中[啟動執行個體](ec2-launch-instance-wizard.md)，並在 **Advanced details** (進階詳細資訊) 下指定以下內容：
  + 在**中繼資料 IPv6 端點**中，選擇**已啟用**。

如需詳細資訊，請參閱[進階詳細資訊](ec2-instance-launch-parameters.md#liw-advanced-details)。

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

**在執行個體啟動時啟用 IMDS IPv6 端點**  
以下 [run-instances](https://docs.aws.amazon.com/cli/latest/reference/ec2/run-instances.html) 範例會啟動已啟用執行個體中繼資料服務 IPv6 端點的 `c6i.large` 執行個體。若要啟用 IPv6 端點，對於 `--metadata-options` 參數，請指定 `HttpProtocolIpv6=enabled`。當您為 `HttpProtocolIpv6` 指定值時，您也必須將 `HttpEndpoint` 設定為 `enabled`。

```
aws ec2 run-instances \
    --image-id ami-0abcdef1234567890 \
    --instance-type c6i.large \
    ...
    --metadata-options "HttpEndpoint=enabled,HttpProtocolIpv6=enabled"
```

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

**在執行個體啟動時啟用 IMDS IPv6 端點**  
下列 [New-EC2Instance](https://docs.aws.amazon.com/powershell/latest/reference/items/New-EC2Instance.html) cmdlet 範例會啟動`c6i.large`執行個體，並為 IMDS 啟用 IPv6 端點。若要啟用 IPv6 端點，請將 `MetadataOptions_HttpProtocolIpv6` 指定為 `enabled`。當您為 `MetadataOptions_HttpProtocolIpv6` 指定值時，您也必須將 `MetadataOptions_HttpEndpoint` 設定為 `enabled`。

```
New-EC2Instance `
    -ImageId ami-0abcdef1234567890 `
    -InstanceType c6i.large `
    -MetadataOptions_HttpEndpoint enabled `
    -MetadataOptions_HttpProtocolIpv6 enabled
```

------

## 關閉對執行個體中繼資料的存取
<a name="configure-IMDS-new-instances--turn-off-instance-metadata"></a>

可以在啟動執行個體時停用 IMDS 來關閉對執行個體中繼資料的存取。稍後透過重新啟用 IMDS 可以開啟存取。如需詳細資訊，請參閱[開啟對執行個體中繼資料的存取](configuring-IMDS-existing-instances.md#enable-instance-metadata-on-existing-instances)。

**重要**  
可以選擇在啟動時或啟動後停用 IMDS。如果*在啟動時*停用 IMDS，下列項目可能無法運作：  
您可能沒有執行個體的 SSH 存取權。`public-keys/0/openssh-key` 是執行個體的公有 SSH 金鑰，它將不可存取，因為通常會從 EC2 執行個體中繼資料中提供並存取該金鑰。
EC2 使用者資料將無法使用，且不會在執行個體啟動時執行。EC2 使用者資料託管於 IMDS。如果停用 IMDS，可以有效地關閉對使用者資料的存取。
若要存取此功能，可以在啟動後重新啟用 IMDS。

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

**啟動時關閉對執行個體中繼資料的存取**
+ 在 Amazon EC2 主控台中[啟動執行個體](ec2-launch-instance-wizard.md)，並在 **Advanced details** (進階詳細資訊) 下指定以下內容：
  + 針對 **Metadata accessible** (可存取中繼資料)，選擇 **Disabled** (已停用)。

如需詳細資訊，請參閱[進階詳細資訊](ec2-instance-launch-parameters.md#liw-advanced-details)。

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

**啟動時關閉對執行個體中繼資料的存取**  
將 `--metadata-options` 設為 `HttpEndpoint=disabled` 來啟動執行個體。

```
aws ec2 run-instances \
    --image-id ami-0abcdef1234567890 \
    --instance-type c6i.large \
    ... 
    --metadata-options "HttpEndpoint=disabled"
```

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

**啟動時關閉對執行個體中繼資料的存取**  
下列 [New-EC2Instance](https://docs.aws.amazon.com/powershell/latest/reference/items/New-EC2Instance.html) cmdlet 範例會啟動將 `MetadataOptions_HttpEndpoint` 設為 的執行個體`disabled`。

```
New-EC2Instance `
    -ImageId ami-0abcdef1234567890 `
    -InstanceType c6i.large `
    -MetadataOptions_HttpEndpoint disabled
```

------
#### [ CloudFormation ]

若要使用 指定執行個體的中繼資料選項 CloudFormation，請參閱*CloudFormation 《 使用者指南*》中的 [AWS::EC2::LaunchTemplate MetadataOptions](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-launchtemplate-metadataoptions.html) 屬性。

------

## 允許存取執行個體中繼資料中的標籤
<a name="configure-IMDS-new-instances-tags-in-instance-metadata"></a>

根據預設，無法存取執行個體中繼資料中的執行個體標籤。對於每個執行個體，您必須明確允許存取。如果允許存取，則執行個體標籤*金鑰*必須符合特定字元限制，否則執行個體將無法啟動。如需詳細資訊，請參閱[在執行個體中繼資料中啟用標籤存取權](work-with-tags-in-IMDS.md#allow-access-to-tags-in-IMDS)。

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

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

您也可以建立 IAM 政策，以防止使用者修改現有執行個體上的執行個體中繼資料選項。若要控制哪些使用者可以修改執行個體中繼資料選項，請指定一個政策，以防止具有指定角色的使用者以外的所有使用者使用 [ModifyInstanceMetadataOptions](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_ModifyInstanceMetadataOptions.html) API。如需 IAM 政策範例，請參閱[使用執行個體中繼資料](ExamplePolicies_EC2.md#iam-example-instance-metadata)。

**注意**  
如果使用宣告式政策來設定執行個體中繼資料選項，則您無法直接在帳戶內進行修改。如需詳細資訊，請參閱「AWS Organizations 使用者指南」**中的[宣告式政策](https://docs.aws.amazon.com/organizations/latest/userguide/orgs_manage_policies_declarative.html)。

## 需要使用 IMDSv2
<a name="modify-require-IMDSv2"></a>

使用下列其中一種方法來修改現有執行個體上的執行個體中繼資料選項，以便在請求執行個體中繼資料時要求 IMDSv2。當要求 IMDSv2 時，就無法使用 IMDSv1。

**注意**  
在要求使用 IMDSv2 之前，請確定執行個體並未進行 IMDSv1 呼叫。`MetadataNoToken` CloudWatch 指標會追蹤 IMDSv1 呼叫。當 `MetadataNoToken` 將執行個體的 IMDSv1 使用量記錄為零時，則執行個體準備好需要 IMDSv2。

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

**要求在現有執行個體上使用 IMDSv2**

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

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

1. 選取執行個體。

1. 選擇**動作**、**執行個體設定**、**修改執行個體中繼資料選項**。

1. 在**修改執行個體中繼資料選項**對話方塊中，執行下列動作：

   1. 針對**執行個體中繼資料服務**，請選取**啟用**。

   1. 針對 **IMDSv2**，請選擇**必要**。

   1. 選擇**儲存**。

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

**要求在現有執行個體上使用 IMDSv2**  
使用 [modify-instance-metadata-options](https://docs.aws.amazon.com/cli/latest/reference/ec2/modify-instance-metadata-options.html) CLI 命令，並將 `http-tokens` 參數設定為 `required`。當您為 `http-tokens` 指定值時，您也必須將 `http-endpoint` 設定為 `enabled`。

```
aws ec2 modify-instance-metadata-options \
    --instance-id i-1234567890abcdef0 \
    --http-tokens required \
    --http-endpoint enabled
```

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

**要求在現有執行個體上使用 IMDSv2**  
使用 [Edit-EC2InstanceMetadataOption](https://docs.aws.amazon.com/powershell/latest/reference/items/Edit-EC2InstanceMetadataOption.html) cmdlet，並將 `HttpTokens` 參數設定為 `required`。當您為 `HttpTokens` 指定值時，您也必須將 `HttpEndpoint` 設定為 `enabled`。

```
(Edit-EC2InstanceMetadataOption `
    -InstanceId i-1234567890abcdef0 `
    -HttpTokens required `
    -HttpEndpoint enabled).InstanceMetadataOptions
```

------

## 還原使用 IMDSv1
<a name="modify-restore-IMDSv1"></a>

當執行個體需要 IMDSv2 時，使用 IMDSv1 請求將會失敗。當 IMDSv2 為選用時，IMDSv2 和 IMDSv1 都可以運作。因此，若要還原 IMDSv1，請使用下列其中一種方法將 IMDSv2 設定為選用 (`httpTokens = optional`)。

`httpTokensEnforced` IMDS 屬性也會防止嘗試在現有執行個體上啟用 IMDSv1。為區域中的帳戶啟用 時，嘗試`httpTokens`將 設定為 `optional`會導致`UnsupportedOperation`例外狀況。如需詳細資訊，請參閱 [疑難排解](#troubleshoot-modifying-an-imdsv1-enabled-instance-fails)。

**重要**  
如果您的執行個體啟動因 IMDSv2 強制執行而失敗，您有兩個選項可以讓啟動成功：  
將**執行個體啟動為IMDSv2-only** – 如果在執行個體上執行的軟體僅使用 IMDSv2 （不依賴 IMDSv1)，則您只能將執行個體啟動為僅限 IMDSv2。若要執行此作業，請在啟動參數`httpTokens = required`中設定 IMDSv2，或在區域中帳戶的中繼資料預設值中設定 IMDSv2。
**停用強制執行** – 如果您的軟體仍然依賴 IMDSv1，`disabled`請將 區域中帳戶的 `httpTokensEnforced`設為 。如需詳細資訊，請參閱[在帳戶層級強制執行 IMDSv2](configuring-IMDS-new-instances.md#enforce-imdsv2-at-the-account-level)。

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

**在執行個體上還原使用 IMDSv1**

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

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

1. 選取執行個體。

1. 選擇**動作**、**執行個體設定**、**修改執行個體中繼資料選項**。

1. 在**修改執行個體中繼資料選項**對話方塊中，執行下列動作：

   1. 針對**執行個體中繼資料服務**，請確定已選取**啟用**。

   1. 針對 **IMDSv2**，請選擇**選用**。

   1. 選擇**儲存**。

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

**在執行個體上還原使用 IMDSv1**  
您可使用 [modify-instance-metadata-options](https://docs.aws.amazon.com/cli/latest/reference/ec2/modify-instance-metadata-options.html) CLI 命令並將 `http-tokens` 設定為 `optional`，以在要求執行個體中繼資料時還原使用 IMDSv1。

```
aws ec2 modify-instance-metadata-options \
    --instance-id i-1234567890abcdef0 \
    --http-tokens optional \
    --http-endpoint enabled
```

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

**在執行個體上還原使用 IMDSv1**  
您可以將 [Edit-EC2InstanceMetadataOption](https://docs.aws.amazon.com/powershell/latest/reference/items/Edit-EC2InstanceMetadataOption.html) cmdlet 與 `HttpTokens` 設定為 搭配使用，`optional`以在請求執行個體中繼資料時還原 IMDSv1 的使用。

```
(Edit-EC2InstanceMetadataOption `
    -InstanceId i-1234567890abcdef0 `
    -HttpTokens optional `
    -HttpEndpoint enabled).InstanceMetadataOptions
```

------

## 變更 PUT 回應跳轉限制
<a name="modify-PUT-response-hop-limit"></a>

對於現有執行個體，您可以變更 `PUT` 回應跳轉限制的設定。

目前只有 AWS CLI 和 AWS SDKs 支援變更 PUT 回應跳轉限制。

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

**如何變更 PUT 回應跳轉限制**  
使用 [modify-instance-metadata-options](https://docs.aws.amazon.com/cli/latest/reference/ec2/modify-instance-metadata-options.html) CLI 命令，並將 `http-put-response-hop-limit` 參數設定為必要的跳轉數目。在下列範例中，跳轉限制設定為 `3`。請注意，為 `http-put-response-hop-limit` 指定數值時，您還必須將 `http-endpoint` 設定為 `enabled`。

```
aws ec2 modify-instance-metadata-options \
    --instance-id i-1234567890abcdef0 \
    --http-put-response-hop-limit 3 \
    --http-endpoint enabled
```

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

**如何變更 PUT 回應跳轉限制**  
使用 [Edit-EC2InstanceMetadataOption](https://docs.aws.amazon.com/powershell/latest/reference/items/Edit-EC2InstanceMetadataOption.html) cmdlet，並將 `HttpPutResponseHopLimit` 參數設定為所需的跳轉次數。在下列範例中，跳轉限制設定為 `3`。請注意，為 `HttpPutResponseHopLimit` 指定數值時，您還必須將 `HttpEndpoint` 設定為 `enabled`。

```
(Edit-EC2InstanceMetadataOption `
    -InstanceId i-1234567890abcdef0 `
    -HttpPutResponseHopLimit 3 `
    -HttpEndpoint enabled).InstanceMetadataOptions
```

------

## 啟用 IMDS IPv4 和 IPv6 端點
<a name="enable-ipv6-endpoint-for-existing-instances"></a>

IMDS 在執行個體上有兩個端點：IPv4 (`169.254.169.254`) 和 IPv6 (`[fd00:ec2::254]`)。當您啟用 IMDS 時，IPv4 端點會自動啟用。即使您在僅限 IPv6 的子網路中啟動執行個體，IPv6 端點仍會保持停用狀態。若要啟用 IPv6 端點，則需要明確啟用。當您啟用 IPv6 端點時，IPv4 端點會保持啟用狀態。

您可以在執行個體啟動時或啟動之後啟用 IPv6 端點。

**啟用 IPv6 端點的需求**
+ 選取的執行個體類型是 [Nitro 型執行個體](instance-types.md#instance-hypervisor-type)。
+ 選取的子網路支援 IPv6，其中子網路[僅支援雙重堆疊或 IPv6](https://docs.aws.amazon.com/vpc/latest/userguide/configure-subnets.html#subnet-ip-address-range)。

目前只有 AWS CLI 和 AWS SDKs 支援在執行個體啟動後啟用 IMDS IPv6 端點。

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

**為您的執行個體啟用 IMDS IPv6 端點**  
使用 [modify-instance-metadata-options](https://docs.aws.amazon.com/cli/latest/reference/ec2/modify-instance-metadata-options.html) CLI 命令，並將 `http-protocol-ipv6` 參數設定為 `enabled`。請注意，為 `http-protocol-ipv6` 指定數值時，您還必須將 `http-endpoint` 設定為 `enabled`。

```
aws ec2 modify-instance-metadata-options \
	--instance-id i-1234567890abcdef0 \
	--http-protocol-ipv6 enabled \
	--http-endpoint enabled
```

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

**為您的執行個體啟用 IMDS IPv6 端點**  
使用 [Edit-EC2InstanceMetadataOption](https://docs.aws.amazon.com/powershell/latest/reference/items/Edit-EC2InstanceMetadataOption.html) cmdlet，並將 `HttpProtocolIpv6` 參數設定為 `enabled`。請注意，為 `HttpProtocolIpv6` 指定數值時，您還必須將 `HttpEndpoint` 設定為 `enabled`。

```
(Edit-EC2InstanceMetadataOption `
    -InstanceId i-1234567890abcdef0 `
    -HttpProtocolIpv6 enabled `
    -HttpEndpoint enabled).InstanceMetadataOptions
```

------

## 開啟對執行個體中繼資料的存取
<a name="enable-instance-metadata-on-existing-instances"></a>

無論使用哪個版本的 IMDS，都可以啟用執行個體上 IMDS 的 HTTP 端點，來開啟對執行個體中繼資料的存取。您可以停用 HTTP 端點，以隨時反轉這項變更。

使用下列其中一種方法來開啟對執行個體上執行個體中繼資料的存取。

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

**開啟對執行個體中繼資料的存取**

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

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

1. 選取執行個體。

1. 選擇**動作**、**執行個體設定**、**修改執行個體中繼資料選項**。

1. 在**修改執行個體中繼資料選項**對話方塊中，執行下列動作：

   1. 針對**執行個體中繼資料服務**，請選取**啟用**。

   1. 選擇**儲存**。

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

**開啟對執行個體中繼資料的存取**  
使用 [modify-instance-metadata-options](https://docs.aws.amazon.com/cli/latest/reference/ec2/modify-instance-metadata-options.html) CLI 命令，並將 `http-endpoint` 參數設定為 `enabled`。

```
aws ec2 modify-instance-metadata-options \
    --instance-id i-1234567890abcdef0 \
    --http-endpoint enabled
```

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

**開啟對執行個體中繼資料的存取**  
使用 [Edit-EC2InstanceMetadataOption](https://docs.aws.amazon.com/powershell/latest/reference/items/Edit-EC2InstanceMetadataOption.html) cmdlet，並將 `HttpEndpoint` 參數設定為 `enabled`。

```
(Edit-EC2InstanceMetadataOption `
    -InstanceId i-1234567890abcdef0 `
    -HttpEndpoint enabled).InstanceMetadataOptions
```

------

## 關閉對執行個體中繼資料的存取
<a name="disable-instance-metadata-on-existing-instances"></a>

無論使用哪個版本的 IMDS，都可以停用執行個體上 IMDS 的 HTTP 端點，來關閉對執行個體中繼資料的存取。您可以啟用 HTTP 端點，以隨時反轉這項變更。

使用下列其中一種方法來關閉對執行個體上執行個體中繼資料的存取。

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

**關閉對執行個體中繼資料的存取**

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

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

1. 選取執行個體。

1. 選擇**動作**、**執行個體設定**、**修改執行個體中繼資料選項**。

1. 在**修改執行個體中繼資料選項**對話方塊中，執行下列動作：

   1. 針對**執行個體中繼資料服務**，清除**啟用**。

   1. 選擇**儲存**。

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

**關閉對執行個體中繼資料的存取**  
使用 [modify-instance-metadata-options](https://docs.aws.amazon.com/cli/latest/reference/ec2/modify-instance-metadata-options.html) CLI 命令，並將 `http-endpoint` 參數設定為 `disabled`。

```
aws ec2 modify-instance-metadata-options \
    --instance-id i-1234567890abcdef0 \
    --http-endpoint disabled
```

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

**關閉對執行個體中繼資料的存取**  
使用 [Edit-EC2InstanceMetadataOption](https://docs.aws.amazon.com/powershell/latest/reference/items/Edit-EC2InstanceMetadataOption.html) cmdlet，並將 `HttpEndpoint` 參數設定為 `disabled`。

```
(Edit-EC2InstanceMetadataOption `
    -InstanceId i-1234567890abcdef0 `
    -HttpEndpoint disabled).InstanceMetadataOptions
```

------

## 允許存取執行個體中繼資料中的標籤
<a name="modify-access-to-tags-in-instance-metadata-on-existing-instances"></a>

您可以允許存取執行中或已停止執行個體上執行個體中繼資料中的標籤。對於每個執行個體，您必須明確允許存取。如果允許存取，則執行個體標籤*金鑰*必須符合特定字元限制，否則將收到錯誤訊息。如需詳細資訊，請參閱[在執行個體中繼資料中啟用標籤存取權](work-with-tags-in-IMDS.md#allow-access-to-tags-in-IMDS)。

## 疑難排解
<a name="troubleshoot-modifying-an-imdsv1-enabled-instance-fails"></a>

### 修改IMDSv1-enabled的執行個體失敗
<a name="modifying-an-imdsv1-enabled-instance-fails"></a>

#### Description
<a name="modifying-an-imdsv1-enabled-instance-fails-description"></a>

您會收到下列錯誤訊息：

`You can't launch instances with IMDSv1 because httpTokensEnforced is enabled for this account. Either launch the instance with httpTokens=required or contact your account owner to disable httpTokensEnforced using the ModifyInstanceMetadataDefaults API or the account settings in the EC2 console.`

#### 原因
<a name="modifying-an-imdsv1-enabled-instance-fails-cause"></a>

當您嘗試在 EC2 帳戶設定或 AWS 組織宣告政策強制使用 IMDSv2 () 的帳戶中將現有執行個體修改為啟用 IMDSv1 () 時，就會擲出此錯誤`httpTokensEnforced = enabled`。`httpTokens = optional` IMDSv2 

#### 解決方案
<a name="modifying-an-imdsv1-enabled-instance-fails-solution"></a>

如果您需要現有執行個體的 IMDSv1 支援，則需要停用 區域中帳戶的 IMDSv2 強制執行。若要停用 IMDSv2 強制執行，請將 `HttpTokensEnforced`設定為 `disabled`。如需詳細資訊，請參閱《Amazon EC2 API 參考》中的 [ModifyInstanceMetadataDefaults](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_ModifyInstanceMetadataDefaults.html)。如果您偏好使用主控台設定此設定，請參閱 [在帳戶層級強制執行 IMDSv2](configuring-IMDS-new-instances.md#enforce-imdsv2-at-the-account-level)。

我們建議您僅使用 IMDSv2 (`httpTokens=required`)。如需詳細資訊，請參閱[轉換為使用 執行個體中繼資料服務第 2 版](instance-metadata-transition-to-version-2.md)。

 