

# 配置实例元数据服务选项
<a name="configuring-instance-metadata-options"></a>

实例元数据服务（IMDS）在每个 EC2 实例上本地运行。*实例元数据选项*是一组配置，可用于控制 EC2 实例上 IMDS 的可访问性和行为。

可在每个实例上配置以下实例元数据选项：

**实例元数据服务（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 策略的限制。

**注意**  
首先需要根据优先顺序确定好实例的 IMDS 设置之后，才会评估账户级别 IMDSv2 强制使用设置。启用 IMDSv2 强制使用后，使用 IMDSv1 启用的实例将会失败。有关强制使用的更多信息，请参阅[在账户级别强制使用 IMDSv2](configuring-IMDS-new-instances.md#enforce-imdsv2-at-the-account-level)。

**警告**  
如果启用了 IMDSv2 强制使用，但未在启动时的实例配置中或在账户设置或 AMI 配置中将 `httpTokens` 设置为 `required`，则启动将会失败。

**示例 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 – 确定元数据选项的值**

在此示例中，使用与前面示例 1 中相同的设置启动 EC2 实例，不过启动时直接在实例上将 `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_cn/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 User Guide》**中的 [Declarative policies](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 policy
](#configure-IMDS-new-instances-iam-policy)

### 将 IMDSv2 设置为账户默认设置
<a name="set-imdsv2-account-defaults"></a>

可以在账户级别为每个 AWS 区域 设置实例元数据服务（IMDS）的默认版本。这意味着在启动*新*实例后，实例元数据版本会自动设置为该账户级别的默认值。但是，您可以在启动实例时或启动实例后手动覆盖该值。有关账户级别设置和手动覆盖会如何影响实例的更多信息，请参阅 [实例元数据选项的优先顺序](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. 通过以下网址打开 Amazon EC2 控制台：[https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/)。

1. 要更改 AWS 区域，请使用页面右上角的区域选择器。

1. 在导航窗格中，选择**控制面板**。

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 User Guide》**中的 [Declarative policies](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>

可以在账户级别为每个 AWS 区域强制要求使用 IMDSv2。强制使用后，实例只有配置为必须使用 IMDSv2 时才能启动。无论实例配置或 AMI 配置如何，都必须遵守此强制使用要求。

**注意**  
在账户级别启用 IMDSv2 强制使用之前，请确保您的应用程序和 AMI 支持 IMDSv2。有关更多信息，请参阅 [要求 IMDSv2 的建议途径](instance-metadata-transition-to-version-2.md#recommended-path-for-requiring-imdsv2)。如果启用了 IMDSv2 强制使用，但未在启动时的实例配置中或在账户设置或 AMI 配置中将 `httpTokens` 设置为 `required`，则实例启动将会失败。有关问题排查信息，请参阅[启动启用 IMDSv1 的实例时失败](troubleshooting-launch.md#launching-an-imdsv1-enabled-instance-fails)。

**注意**  
此设置不会更改现有实例的 IMDS 版本，但会阻止在当前已禁用 IMDSv1 的现有实例上启用 IMDSv1。

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

**在指定区域中为账户强制使用 IMDSv2**

1. 通过以下网址打开 Amazon EC2 控制台：[https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/)。

1. 要更改 AWS 区域，请使用页面右上角的区域选择器。

1. 在导航窗格中，选择**控制面板**。

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 用户指南》中的 [Declarative policies](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 用户指南》中的 [Declarative policies](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 用户指南*中的 [亚马逊云科技::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**  
使用以下方法之一将新 AMI 配置为 IMDSv2。

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

下面的 [register-image](https://docs.aws.amazon.com/cli/latest/reference/ec2/register-image.html) 示例将使用某个 EBS 根卷的指定快照的 AMI 注册为设备 `/dev/xvda`。为 `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 根卷的指定快照作为设备 `/dev/xvda` 来注册了一个 AMI。为 `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 policy
<a name="configure-IMDS-new-instances-iam-policy"></a>

您可以创建一个将执行以下操作之一的 IAM 策略：
+ 除非要求必须在新实例上使用 IMDSv2，否则阻止用户启动新实例。
+ 阻止用户调用 ModifyInstanceMetadataOptions API 来更改正在运行的实例的元数据选项。限制对 ModifyInstanceMetadataOptions httpTokens 属性的访问，以防止对正在运行的实例进行意外的更新。
+ 阻止用户调用 ModifyInstanceMetadataDefaults API 来更改 httpTokens 和 httpTokensEnforced 的账户默认设置。限制对这两个属性的访问，将确保只有获得授权的角色才能修改账户默认值。

**使用 IAM policy 强制要求在所有新实例上使用 IMDSv2**  
要确保用户只能启动要求在请求实例元数据时使用 IMDSv2 的实例，请执行以下操作：
+ 限制对 `ModifyInstanceMetadataOptions` 和 `ModifyInstanceMetadataDefaults` API 的访问，更具体而言是限制对 `httpTokens` 和 `httpTokensEnforced` 属性的访问。
+ 然后将账户默认值设置为 `httpTokens = required` 和 `httpTokensEnforced = enabled`。

  有关示例 IAM policy，请参阅 [使用实例元数据](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) 示例会启动一个为 IMDS 启用了 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 示例启动了一个为 IMDS 启用了 IPv6 端点的 `c6i.large` 实例。要启用 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 用户指南*中的 [亚马逊云科技::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 policy，以阻止用户修改现有实例上的实例元数据选项。要控制哪些用户可以修改实例元数据选项，请指定一个策略，阻止除具有指定角色的用户以外的所有用户使用 [ModifyInstanceMetadataOptions](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_ModifyInstanceMetadataOptions.html) API。有关示例 IAM policy，请参阅 [使用实例元数据](ExamplePolicies_EC2.md#iam-example-instance-metadata)。

**注意**  
如果使用了声明式策略来配置实例元数据选项，则无法在账户中直接对选项进行修改。有关更多信息，请参阅《AWS Organizations User Guide》**中的 [Declarative policies](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. 通过以下网址打开 Amazon EC2 控制台：[https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/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**：如果在实例上运行的软件仅使用 IMDSv2（不依赖 IMDSv1），则可以将实例启动为仅限 IMDSv2。要执行此操作，请通过在启动参数或账户在该区域的元数据默认值中设置 `httpTokens = required`，从而配置仅限 IMDSv2。
**禁用强制使用**：如果您的软件仍依赖于 IMDSv1，则在该区域将账户的 `httpTokensEnforced` 设置为 `disabled`。有关更多信息，请参阅 [在账户级别强制使用 IMDSv2](configuring-IMDS-new-instances.md#enforce-imdsv2-at-the-account-level)。

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

**恢复在实例上使用 IMDSv1**

1. 通过以下网址打开 Amazon EC2 控制台：[https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/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 SDK 支持更改 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 SDK 支持在启动实例后启用 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 的 HTTP 端点来开启对实例元数据的访问权限，无论您使用的是哪个版本的 IMDS。您可以随时通过禁用 HTTP 端点来撤消该更改。

使用以下方法之一，即可开启对实例上实例元数据的访问权限。

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

**开启对实例元数据的访问权限**

1. 通过以下网址打开 Amazon EC2 控制台：[https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/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 的 HTTP 端点来关闭对实例元数据的访问权限，无论您使用的是哪个版本的 IMDS。您可以随时启用 HTTP 终端节点以撤消该更改。

使用以下方法之一，即可关闭对实例上实例元数据的访问权限。

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

**关闭对实例元数据的访问**

1. 通过以下网址打开 Amazon EC2 控制台：[https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/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 的实例时失败
<a name="modifying-an-imdsv1-enabled-instance-fails"></a>

#### 说明
<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 (`httpTokensEnforced = enabled`) 的账户中，尝试将现有实例修改为启用 IMDSv1 (`httpTokens = optional`) 时，将会引发此错误。

#### 解决方案
<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)。

 