View a markdown version of this page

Snowball Edge 上的 IMDS 版本 - Amazon Snowball Edge 开发人员指南
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)。

Amazon Snowball Edge 不再向新客户提供。新客户应探索Amazon DataSync在线传输、用于安全物理传输Amazon 的数据传输终端或 Amazon 合作伙伴解决方案。对于边缘计算,请浏览 Amazon Out posts。

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

Snowball Edge 上的 IMDS 版本

您可以使用 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 漏洞的防御。 EC2

IMDSv2 在 Snowball Edge 上

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

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

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

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

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

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

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

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

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

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

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

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

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

使用两个命令生成 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 的变量中。

例组合命令
[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 中。

例重复使用令牌
[ec2-user ~]$ curl -H "X-aws-ec2-metadata-token: $TOKEN" -v http://169.254.169.254/latest/meta-data/ami-id

IMDSv1 在 Snowball Edge 上

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

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

您的实例元数据可从正在运行的实例中获取,因此您无需使用 Amazon EC2 控制台或 Amazon CLI 即可访问它。这在您编写脚本以实现从实例运行时非常有用。例如,您可从实例元数据访问您的实例的本地 IP 地址来以管理与外部应用程序的连接。实例元数据可划分成不同类别。有关每个实例元数据类别的描述,请参阅本指南中的支持的实例元数据和用户数据。

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

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

IP 地址是链路本地地址,仅从该实例访问时有效。有关更多信息,请参阅 Wikipedia 上的链路本地地址。

所有实例元数据以文本形式返回(HTTP 内容类型 text/plain)。

特定元数据资源的请求返回相应的值;如果资源不可用,则返回 404 - 未找到 HTTP 错误代码。

对通用元数据资源的请求(URI 以 / 字符结尾)会返回一个可用资源列表,如果此类资源不存在,则会返回 404 - 未找到 HTTP 错误代码。列表中的各个项目位于被换行符(ASCII 字符代码 10)终止的不同的行上。

对于使用发出的请求 IMDSv1,可以返回以下 HTTP 错误代码:

  • 400 ‐ 缺少参数或参数无效:PUT 请求无效。

  • 401 ‐ 未授权:GET 请求使用的令牌无效。建议的措施是生成新的令牌。

  • 403 ‐ 禁止访问:不允许该请求,或禁用了实例元数据服务。