本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
IMDSSnow Family 设备上的版本
您可以使用IMDS版本 2 或IMDS版本 1 从正在运行的实例访问实例元数据:
实例元数据服务版本 2 (IMDSv2),一种面向会话的方法
实例元数据服务版本 1 (IMDSv1),一种请求响应方法
根据您的 Snow 软件版本,您可以使用IMDSv1IMDSv2、或两者兼而有之。这还取决于EC2兼容实例中的AMI运行类型。有些则AMIs需要,例如运行 Ubuntu 20.04 的版本。IMDSv2实例元数据服务根据PUT
或GET
标头的存在来区分IMDSv1和IMDSv2请求。IMDSv2同时使用这两个标头。IMDSv1仅使用标GET
题。
AWS 鼓励使用IMDSv2而不是IMDSv1因为IMDSv2包括更高的安全性。有关更多信息,请参阅通过增强EC2实例元数据服务,进一步增强针对开放防火墙、反向代理和SSRF漏洞的防御
IMDSv2在 Snow Family 设备上
当您使用IMDSv2请求实例元数据时,请求必须遵循以下规则:
使用
PUT
请求启动到实例元数据服务的会话。该PUT
请求返回一个会话令牌,该令牌必须包含在对实例元数据服务的后续GET
请求中。定义会话持续时间的会话令牌。会话持续时间最少可以为 1 秒,最多为 6 小时。在这段时间内,您可以将相同的会话令牌用于后续请求。在这段时间到期后,您必须为将来的请求创建新的会话令牌。使用访问元数据需要使用令牌IMDSv2。将该令牌包含在对实例元数据服务的所有
GET
请求中。令牌是实例特定的密钥。该令牌在其他EC2兼容实例上无效,如果您尝试在生成令牌的实例之外使用该令牌,则该令牌将被拒绝。
PUT
请求必须包含一个标头,该标头指定令牌的生存时间 (TTL),以秒为单位,最多不超过六小时(21,600 秒)。令牌表示一个逻辑会话。TTL指定令牌有效的时间长度,从而指定会话的持续时间。在令牌过期后,要继续访问实例元数据,您必须使用另一个
PUT
请求创建新会话。您可以选择在每个请求中重复使用令牌或创建新的令牌。对于少量请求,在每次需要访问实例元数据服务时生成并立即使用令牌可能更方便。但为了提高效率,您可以为令牌指定更长的持续时间并重复使用令牌,而不必在每次需要请求实例元数据时都编写
PUT
请求。对并发令牌数量没有实际限制,每个令牌表示自己的会话。
HTTPGET
并且允许在IMDSv2实例元数据请求中使用HEAD
方法。 PUT
如果请求包含X-Forwarded-For
标头,则会被拒绝。
默认情况下,PUT
请求的响应在 IP 协议级别的响应跃点数限制(生存时间)为 1。IMDSfor Snow 无法修改PUT
响应的跳跃限制。
以下示例使用 Linux shell 脚本和IMDSv2来检索顶级实例元数据项。此示例:
使用
PUT
请求创建持续 6 小时(21600 秒)的会话令牌。将会话令牌标头存储在名为
TOKEN
的变量中。使用令牌请求顶级元数据项。
使用两个命令生成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在 Snow Family 设备上
IMDSv1使用请求-响应模型。要请求实例元数据,您需要向实例元数据服务发送 GET
请求。
[ec2-user ~]$ curl http://169.254.169.254/latest/meta-data/
您的实例元数据可从正在运行的实例中获取,因此您无需使用 Amazon EC2 控制台或 AWS CLI 即可访问它。这在您编写脚本以实现从实例运行时非常有用。例如,您可从实例元数据访问您的实例的本地 IP 地址来以管理与外部应用程序的连接。实例元数据可划分成不同类别。有关每个实例元数据类别的描述,请参阅本指南中的支持的实例元数据和用户数据。
要从正在运行的实例中查看所有类别的实例元数据,请使用以下内容 IPv4URI:
http://169.254.169.254/latest/meta-data/
IP 地址是链路本地地址,仅从该实例访问时有效。有关更多信息,请参阅 Wikipedia 上的链路本地地址
所有实例元数据均以文本(HTTP内容类型text/plain
)形式返回。
对特定元数据资源的请求会返回相应的值,如果资源不可用,则返回 404- Not Found HTTP 错误代码。
请求常规元数据资源(当以/
字符URI结尾时)会返回可用资源列表,如果没有此类资源,则返回 404- Not Found HTTP 错误代码。列表项位于不同的行中,以换行符结尾(ASCII字符代码 10)。
对于使用发出的请求IMDSv1,可能会返回以下HTTP错误代码:
400 ‐ 缺少参数或参数无效:
PUT
请求无效。401 ‐ 未授权:
GET
请求使用的令牌无效。建议的措施是生成新的令牌。403 ‐ 禁止访问:不允许该请求,或禁用了实例元数据服务。