实例元数据服务版本 2 的工作原理
IMDSv2 使用面向会话的请求。对于面向会话的请求,您创建一个会话令牌以定义会话持续时间,该时间最少为 1 秒,最多为 6 小时。在指定的持续时间内,您可以将相同的会话令牌用于后续请求。在指定的持续时间到期后,您必须创建新的会话令牌以用于将来的请求。
注意
本部分中的示例使用实例元数据服务(IMDS)的 IPv4 地址:169.254.169.254
。如果要通过 IPv6 地址检索 EC2 实例的实例元数据,请确保启用并改用 IPv6 地址:[fd00:ec2::254]
。IMDS 的 IPv6 地址与 IMDSv2 命令兼容。IPv6 地址只能在基于 Amazon Nitro System 构建的实例上和支持 IPv6 的子网(仅限双堆栈或 IPv6)中访问。
以下示例使用 Shell 脚本和 IMDSv2 检索顶级实例元数据项。每个示例:
-
使用
PUT
请求创建持续 6 小时(21600 秒)的会话令牌 -
将会话令牌标头存储在名为
TOKEN
(Linux 实例)或token
(Windows 实例)的变量中 -
使用令牌请求顶级元数据项
您可以运行两个单独的命令,也可以将它们组合使用。
单独的命令
首先,使用以下命令生成令牌。
[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
PS C:\>
[string]$token = Invoke-RestMethod -Headers @{"X-aws-ec2-metadata-token-ttl-seconds" = "21600"} -Method PUT -Uri http://169.254.169.254/latest/api/token
PS C:\>
Invoke-RestMethod -Headers @{"X-aws-ec2-metadata-token" = $token} -Method GET -Uri http://169.254.169.254/latest/meta-data/
在创建令牌后,您可以重复使用令牌,直到令牌过期。在以下示例命令(获取用于启动实例的 AMI 的 ID)中,将重复使用上一示例中的令牌(存储在 $token
中)。
PS C:\>
Invoke-RestMethod -Headers @{"X-aws-ec2-metadata-token" = $token} ` -Method GET -uri http://169.254.169.254/latest/meta-data/ami-id
在使用 IMDSv2 请求实例元数据时,请求必须包含以下内容:
-
使用
PUT
请求启动到实例元数据服务的会话。PUT
请求返回一个令牌,该令牌必须包含在对实例元数据服务的后续GET
请求中。需要具有该令牌才能使用 IMDSv2 访问元数据。 -
将该令牌包含在对 IMDS 的所有
GET
请求中。如果将令牌使用设置为required
,没有有效令牌或令牌过期的请求将显示401 - Unauthorized
HTTP 错误代码。-
令牌是实例特定的密钥。令牌在其他 EC2 实例上无效,如果尝试在生成令牌的实例外部使用,令牌将会被拒绝。
-
PUT
请求必须包含一个标头,它以秒为单位指定令牌的生存时间 (TTL),最多为 6 小时(21600 秒)。令牌表示一个逻辑会话。TTL 指定令牌的有效时间长度,因而指定会话的持续时间。 -
在令牌过期后,要继续访问实例元数据,您必须使用另一
PUT
创建新会话。 -
您可以选择在每个请求中重复使用令牌或创建新的令牌。对于少量请求,每次需要访问 IMDS 时生成令牌并立即使用可能会更容易。但为了提高效率,您可以为令牌指定更长的持续时间并重复使用令牌,而不必在每次需要请求实例元数据时都编写
PUT
请求。对并发令牌数量没有实际限制,每个令牌表示自己的会话。不过,IMDSv2 仍然受到正常 IMDS 连接和节流限制的制约。有关更多信息,请参阅 查询限制。
-
允许在 IMDSv2 实例元数据请求中使用 HTTP GET
和 HEAD
方法。如果 PUT
请求包含 X-Forwarded-For 标头,则会被拒绝。
默认情况下,PUT
请求的响应在 IP 协议级别的响应跃点数限制(生存时间)为 1
。如果需要更大的跃点数限制,可使用 modify-instance-metadata-options Amazon CLI 命令进行调整。例如,您可能需要使用更大的跃点数限制,以便与实例上运行的容器服务保持向后兼容。有关更多信息,请参阅 为现有实例修改实例元数据选项。