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

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

IMDS 版本

您可以使用 IMDS 版本 2 或 IMDS 版本 1 从正在运行的实例中访问实例元数据:

  • 实例元数据服务版本 2(IMDSv2),一种面向会话的方法

  • 实例元数据服务版本 1(IMDSv1),一种请求响应的方法

根据您的 Snow 软件版本,您可以使用 IMDSv1 和 IMDSv2 或二者均使用。这还取决于在与 EC2 兼容的实例中运行的 AMI 类型。某些 AMI(如运行 Ubuntu 20.04 的 AMI)需要 IMDSv2。实例元数据服务会根据 PUTGET 标头的使用情况区分 IMDSv1 和 IMDSv2 请求。IMDSv2 同时使用这两个标头。IMDSv1 仅使用 GET 标头。

Amazon 鼓励使用 imdsv2 而不是 imdsv1,因为 imdsv2 包含更高的安全性。有关更多信息,请参阅借助 EC2 实例元数据服务的增强功能,为开放式防火墙、反向代理和 SSRF 漏洞增加深度防御

IMDSv2

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

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

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

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

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

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

单独的命令

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

注意

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

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

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

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

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

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

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

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

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

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

IMDSv1

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 ‐ 禁止访问:不允许该请求,或禁用了实例元数据服务。