

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

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

您可以使用 IMDS 版本 2 或 IMDS 版本 1 从正在运行的实例中访问实例元数据：
+ 实例元数据服务版本 2 (IMDSv2)，一种面向会话的方法
+ 实例元数据服务版本 1 (IMDSv1)，一种请求响应方法

根据您的 Snow 软件版本，您可以使用 IMDSv1 IMDSv2、或两者兼而有之。这还取决于 EC2兼容实例中运行的 AMI 类型。有些则 AMIs需要，例如运行 Ubuntu 20.04 的版本。 IMDSv2实例元数据服务根据`PUT`或`GET`标头的存在来区分 IMDSv1 和 IMDSv2 请求。 IMDSv2同时使用这两个标头。 IMDSv1 仅使用标`GET`题。

Amazon 鼓励使用 IMDSv2 而不是 IMDSv1 因为 IMDSv2 包括更高的安全性。有关更多信息，请参阅通过增强[实例元数据服务，进一步增强针对开放防火墙、反向代理和 SSRF 漏洞的防御](https://www.amazonaws.cn/blogs/security/defense-in-depth-open-firewalls-reverse-proxies-ssrf-vulnerabilities-ec2-instance-metadata-service/)。 EC2 

## IMDSv2 在 Snowball Edge 上
<a name="imdsv2"></a>

当您使用 IMDSv2 请求实例元数据时，请求必须遵循以下规则：

1. 使用 `PUT` 请求启动到实例元数据服务的会话。`PUT` 请求返回一个会话令牌，该令牌必须包括在向实例元数据服务发出的后续 `GET` 请求中。定义会话持续时间的会话令牌。会话持续时间最少可以为 1 秒，最多为 6 小时。在这段时间内，您可以将相同的会话令牌用于后续请求。在这段时间到期后，您必须为将来的请求创建新的会话令牌。使用访问元数据需要使用令牌 IMDSv2。

1. 将该令牌包含在对实例元数据服务的所有 `GET` 请求中。

   1. 令牌是实例特定的密钥。该令牌在其他 EC2兼容实例上无效，如果您尝试在生成令牌的实例之外使用该令牌，则该令牌将被拒绝。

   1. `PUT` 请求必须包含一个标头，它以秒为单位指定令牌的生存时间（TTL），最多为 6 小时（21600 秒）。令牌表示一个逻辑会话。TTL 指定令牌的有效时间长度，因而指定会话的持续时间。

   1. 在令牌过期后，要继续访问实例元数据，您必须使用另一个 `PUT` 请求创建新会话。

   1. 您可以选择在每个请求中重复使用令牌或创建新的令牌。对于少量请求，在每次需要访问实例元数据服务时生成并立即使用令牌可能更方便。但为了提高效率，您可以为令牌指定更长的持续时间并重复使用令牌，而不必在每次需要请求实例元数据时都编写 `PUT` 请求。对并发令牌数量没有实际限制，每个令牌表示自己的会话。

允许在 IMDSv2 实例元数据请求中使用 HTTP `GET` 和`HEAD`方法。 `PUT`如果请求包含`X-Forwarded-For`标头，则会被拒绝。

默认情况下，`PUT` 请求的响应在 IP 协议级别的响应跃点数限制（生存时间）为 1。适用于 Snow 的 IMDS 无法修改 `PUT` 响应的跃点数限制。

以下示例使用 Linux shell 脚本和 IMDSv2 来检索顶级实例元数据项。此示例：

1. 使用 `PUT` 请求创建持续 6 小时（21600 秒）的会话令牌。

1. 将会话令牌标头存储在名为 `TOKEN` 的变量中。

1. 使用令牌请求顶级元数据项。

使用两个命令生成 EC2兼容令牌。您可以单独运行这些命令，也可以作为一个命令运行。

首先，使用以下命令生成令牌。

**注意**  
`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                        
```

## IMDSv1 在 Snowball Edge 上
<a name="imdsv1"></a>

IMDSv1 使用请求-响应模型。要请求实例元数据，您需要向实例元数据服务发送 `GET` 请求。

```
    [ec2-user ~]$ curl http://169.254.169.254/latest/meta-data/                   
```

您的实例元数据可从正在运行的实例中获取，因此您无需使用 Amazon EC2 控制台或 Amazon CLI 即可访问它。这在您编写脚本以实现从实例运行时非常有用。例如，您可从实例元数据访问您的实例的本地 IP 地址来以管理与外部应用程序的连接。实例元数据可划分成不同类别。有关每个实例元数据类别的描述，请参阅本指南中的[支持的实例元数据和用户数据](https://docs.amazonaws.cn/snowball/latest/developer-guide/edge-compute-instance-metadata.html)。

要从正在运行的实例中查看所有类别的实例元数据，请使用以下 IPv4 URI：

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

IP 地址是链路本地地址，仅从该实例访问时有效。有关更多信息，请参阅 Wikipedia 上的[链路本地地址](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 ‐ 禁止访问**：不允许该请求，或禁用了实例元数据服务。