实例元数据服务版本 2 的工作原理 - Amazon Elastic Compute Cloud
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

实例元数据服务版本 2 的工作原理

IMDSv2 使用面向会话的请求。对于面向会话的请求,您创建一个会话令牌以定义会话持续时间,该时间最少为 1 秒,最多为 6 小时。在指定的持续时间内,您可以将相同的会话令牌用于后续请求。在指定的持续时间到期后,您必须创建新的会话令牌以用于将来的请求。

注意

本部分中的示例使用实例元数据服务(IMDS)的 IPv4 地址:169.254.169.254。如果要通过 IPv6 地址检索 EC2 实例的实例元数据,请确保启用并改用 IPv6 地址:[fd00:ec2::254]。IMDS 的 IPv6 地址与 IMDSv2 命令兼容。IPv6 地址只能在基于 Amazon Nitro System 构建的实例上访问。

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

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

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

  • 使用令牌请求顶级元数据项

您可以运行两个单独的命令,也可以将它们组合使用。

单独的命令

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

[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" 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" http://169.254.169.254/latest/meta-data/

在创建令牌后,您可以重复使用令牌,直到令牌过期。在以下示例命令(获取用于启动实例的 AMI 的 ID)中,将重复使用上一示例中的令牌(存储在 $TOKEN 中)。

[ec2-user ~]$ curl -H "X-aws-ec2-metadata-token: $TOKEN" http://169.254.169.254/latest/meta-data/ami-id

在使用 IMDSv2 请求实例元数据时,请求必须包含以下内容:

  1. 使用 PUT 请求启动到实例元数据服务的会话。PUT 请求返回一个令牌,该令牌必须包含在对实例元数据服务的后续 GET 请求中。需要具有该令牌才能使用 IMDSv2 访问元数据。

  2. 将该令牌包含在对 IMDS 的所有 GET 请求中。如果将令牌使用设置为 required,没有有效令牌或令牌过期的请求将显示 401 - Unauthorized HTTP 错误代码。

    • 令牌是实例特定的密钥。令牌在其他 EC2 实例上无效,如果尝试在生成令牌的实例外部使用,令牌将会被拒绝。

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

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

    • 您可以选择在每个请求中重复使用令牌或创建新的令牌。对于少量请求,每次需要访问 IMDS 时生成令牌并立即使用可能会更容易。但为了提高效率,您可以为令牌指定更长的持续时间并重复使用令牌,而不必在每次需要请求实例元数据时都编写 PUT 请求。对并发令牌数量没有实际限制,每个令牌表示自己的会话。不过,IMDSv2 仍然受到正常 IMDS 连接和节流限制的制约。有关更多信息,请参阅 查询限制

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

默认情况下,PUT 请求的响应在 IP 协议级别的响应跃点数限制(生存时间)为 1。如果需要更大的跃点数限制,可使用 modify-instance-metadata-options Amazon CLI 命令进行调整。例如,您可能需要使用更大的跃点数限制,以便与实例上运行的容器服务保持向后兼容。有关更多信息,请参阅 为现有实例修改实例元数据选项