跳至内容

如何对我的 EC2 Linux 实例上的实例元数据问题进行故障排除?

3 分钟阅读
0

我无法从我的 Amazon Elastic Compute Cloud (Amazon EC2) Linux 实例检索实例元数据。

简短描述

Amazon EC2 通过向 169.254.169.254 IPv4 端点或 [fd00:ec2::254] IPv6 端点发出的 HTTP 请求在本地访问实例内的实例元数据。要访问实例元数据,必须使用实例元数据服务 (IMDS)。IMDSv1 不需要身份验证令牌,但是 IMDSv2 需要会话令牌以增强安全性。

当您检索实例元数据时,可能会遇到以下问题:

  • HTTP 请求错误,例如超时和 HTTP 400 或 404 错误
  • IMDSv2 令牌请求失败
  • 特定软件的处理问题
  • 网络接口或路由表配置不正确
  • 阻止元数据访问的代理或 NAT 网关配置
  • (仅限 IPv6)未激活的 IMDSv6 端点
  • AWS Identity and Access Management (IAM) 实例配置文件附件缺失或过时
  • 阻止访问 169.254.169.254 的本地防火墙,例如 iptablesfirewalld
  • 高请求量导致元数据请求受限

解决方法

**注意:**如果您在运行 AWS 命令行界面 (AWS CLI) 命令时收到错误,请参阅 AWS CLI 错误故障排除。此外,请确保您使用的是最新版本的 AWS CLI

解决 HTTP 请求错误

根据您收到的 HTTP 错误代码执行以下故障排除操作。

(仅限 IMDSv1)“404 - Not Found”错误

当您输入无效的 URL 或者更新了实例的 IAM 角色但未刷新角色时,就会出现 HTTP 404 错误。

要解决此错误,请验证您使用的是否为正确的 URL。此外,分离并重新连接您的实例的 IAM 角色

然后,启动和停止您的实例以应用更改。

(仅限 IMDSv2)“400 - Bad Request”错误

当您的 PUT 请求使用无效的令牌或软件发送错误的标头时,就会出现 HTTP 400 错误。例如,一些 FortiGate 或 Matillion 代理不缓存或重复使用 IMDSv2 令牌。

要解决此错误,请运行以下命令为您的 PUT 请求生成新令牌:

$ TOKEN=$(curl -X PUT "http://169.254.169.254/latest/api/token" -H "X-aws-ec2-metadata-token-ttl

此外,检查系统或应用程序日志中是否有需要刷新其令牌的长时间运行的进程。

(仅限 IMDSv2)“401 - Unauthorized”错误

当您的 GET 请求使用无效的令牌时,就会出现 HTTP 401 错误。

要解决此错误,请运行以下命令为您的 GET 请求生成新令牌:

$ curl -H "X-aws-ec2-metadata-token: $TOKEN" http://169.254.169.254/latest/meta-data/

此外,检查系统或应用程序日志中是否有需要刷新其令牌的长时间运行的进程。

“403 - Forbidden”错误

当您在实例级别停用 IMDS 时,或者当安全组、防火墙或路由表阻止实例访问时,就会出现 HTTP 403 错误。如果您必须使用 IMDSv2,但客户端使用 IMDSv1,也会出现该错误。

要解决此问题,请运行以下 describe-instances AWS CLI 命令来检查 IMDS 配置:

aws ec2 describe-instances --instance-ids your_instance_id --query 'Reservations[].Instances[].MetadataOptions'

**注意:**将 your_instance_id 替换为您的实例 ID。

如果 HttpEndpoint 设置为 disabled(禁用),请运行以下 modify-instance-metadata-options 命令来激活 IMDS:

aws ec2 modify-instance-metadata-options --instance-id your_instance_id --http-endpoint enabled

**注意:**将 your_instance_id 替换为您的实例 ID。

确保您的配置允许从实例对 169.254.169.254(适用于 IPv4)或 [fd00:ec2::254](适用于 IPv6)的出站 HTTP 访问。

如果您的实例使用代理、NAT 配置、负载均衡器或多个内部网络跃点,则最佳做法是将 HttpPutResponseHopLimit 配置为 2 或更高。配置一个足够高的跃点值,以允许令牌响应通过网络层。默认情况下,HttpPutResponseHopLimit 仅允许 1 个跃点。要增加此值,请运行以下 modify-instance-metadata-options 命令:

aws ec2 modify-instance-metadata-options --instance-id your_instance_id --http-put-response-hop-limit 2

**注意:**将 your_instance_id 替换为您的实例 ID。

检查代理配置问题

如果您的实例使用代理访问互联网,则必须从代理流量中排除 IMDS IP 地址。否则,您可能会遇到 HTTP 403 和 404 错误或连接超时。

要从代理中排除 IMDS IP 地址,请运行以下命令来设置 no_proxy 环境变量:

export no_proxy='169.254.169.254,[fd00:ec2::254]'

**注意:**某些应用程序(例如 Matillion、Fortigate 或自定义服务)可能不使用系统级的 no_proxy 设置。在这种情况下,请在应用程序中配置 no_proxy。对于双栈配置,请确保排除 IPv4 和 IPv6 元数据端点。

确保您已激活 IPv6 支持

如果您使用仅限 IPv6 的子网,请运行以下 modify-instance-metadata-options 命令来显式激活 IMDS 的 IPv6 支持:

aws ec2 modify-instance-metadata-options \
  --instance-id your_instance_id \
  --http-protocol-ipv6 enabled

**注意:**将 your_instance_id 替换为您的实例 ID。

如果您使用具有严格安全组规则的虚拟私有云 (VPC) 端点,请确保它们允许端口 80 (HTTP) 访问元数据 IP 地址。

对于 Fortigate 或 Matillion 应用程序,请确认该软件支持 IMDSv2 会话令牌。

对过时的网络配置、陈旧的 IAM 角色关联或内部软件问题进行故障排除

重启实例

检查您的本地防火墙规则

要检查本地防火墙封锁是否使用 iptables 来阻止对 IMDS 端点的访问,请运行以下命令:

sudo iptables -L

被封锁端点的输出示例:

Chain OUTPUT (policy ACCEPT)
target     prot opt source    destination
REJECT     tcp  --  anywhere  169.254.169.254  owner UID match 1000-10000 reject-with icmp-port-unreachable

要检查是否有阻止流向 169.254.169.254 的流量的规则,请运行以下命令:

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

如果规则阻止流量,则您将收到与以下示例类似的输出:

curl: (7) Failed to connect to 169.254.169.254 port 80 after 0 ms: Connection refused

要删除阻止规则,请运行以下命令:

sudo iptables -D OUTPUT -p tcp -d 169.254.169.254 -m owner --uid-owner 1000-10000 -j REJECT

如果您的实例是双栈的,请确保没有 IPv6 防火墙规则阻止 [fd00:ec2::254] IPv4 地址。如果您的 iptables 为空,但流量仍然被封锁,请检查操作系统 (OS) 防火墙进程守护程序,;例如 firewalldufw。此外,还要检查可能强制执行隐藏规则的安全代理,例如防病毒或防火墙软件。

检查 Amazon EC2 是否限制了您的请求

Amazon EC2 根据每秒数据包数 (PPS) 限制流向 IMDS 的流量。连接到实例的每个弹性网络接口对元数据相关流量的最大配额为 1024 PPS。如果您的 PPS 速率超过此配额,则会出现“HTTP 5xx”错误,元数据检索失败或应用程序超时。

要缓解限制问题,请执行以下操作:

  • 当您访问 IMDS 时,在应用程序中实现指数回退和重试逻辑
  • 请咨询您的供应商或将您的软件更新到最新版本,以确保其支持 IMDSv2。
  • 使用 IMDSv2 时,生成一次令牌,并在其生存时间 (TTL) 期间将其重复用于多个元数据查询。
  • 升级到最新的 IMDSv2 版本,以确保您的配置正确实现了令牌重用和指数回退。
  • 不要经常轮询实例元数据。
  • 尽可能在应用程序中使用实例缓存。

如果您的软件在紧密循环中无延迟地大量发送元数据请求,则可能会遇到节流或元数据故障。使用 tcpdumpstrace 或应用程序调试日志来检查是否经常重复调用 169.254.169.254。要监控节流事件,请运行以下命令来检查网络接口驱动程序中是否存在 linklocal_allowance_exceeded 指标:

ethtool -S eth0

**注意:**将 eth0 替换为您的网络接口名称。在输出中,检查 linklocal_allowance_exceeded 中是否存在非 0 的值以识别节流。

输出示例:

linklocal_allowance_exceeded: 245

前面的输出示例显示,由于超过了 PPS 配额,Amazon EC2 限制了发送到 IMDS 的 245 个数据包。

相关信息

在 Amazon EC2 实例上使用代理

访问 EC2 实例的实例元数据

限制访问实例元数据服务

查询节流

AWS 官方已更新 1 年前