如何解决我的 EC2 Linux 实例上的实例元数据问题?

2 分钟阅读
0

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

简短描述

实例元数据是有关 EC2 实例的信息,例如实例 ID、公有和私有 IP 地址、安全组、 AWS Identity and Access Management(IAM)角色等。实例元数据通过向 169.254.169.254 发出的 HTTP 请求向实例公开。

从实例元数据服务(IMDS)检索实例元数据时,您可能会遇到以下问题:

  • HTTP 请求错误
  • 代理配置
  • 本地防火墙规则
  • 请求节流

解决方法

HTTP 请求错误

发出 HTTP 请求以检索实例元数据时,可能会返回以下 HTTP 错误代码:

HTTP 404 - 未找到

HTTP 404 错误适用于 IMDS v1。当请求的资源不可用时,就会出现此错误。确认您使用的是正确的 URL。

400 - 错误的请求

400 - 错误的请求错误适用于 IMDS v2。如果 PUT 请求无效,则会出现此错误。

401 - 未授权

如果 GET 请求使用无效的令牌,则会出现 ** 401 - 未授权**错误。如果发生这种情况,则生成新令牌。

403 - 禁止访问

如果不允许请求或关闭 IMDS,则会出现 403 - 禁止访问错误。运行以下命令以检查 IMDS 状态。在以下示例命令中,将 your_instance_ID 替换为您的用例的正确值。

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

以下是前面命令的输出示例:

[
  {
    "State": "applied",
    "HttpTokens": "optional",
    "HttpPutResponseHopLimit": 1,
    "HttpEndpoint": "disabled",
    "HttpProtocolIpv6": "disabled",
    "InstanceMetadataTags": "disabled"
  }
]

如果命令选项显示 HttpEndpoint 已关闭,则运行以下命令:

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

代理配置

如果您使用代理访问互联网,则必须排除 IMDS IP 地址(169.254.169.254)。如果未排除 IMDS IP 地址,则可能无法检索实例元数据。

要将 IMDS IP 地址排除在代理使用范围之外,请使用以下地址设置 NO_PROXY 环境变量:

export NO_PROXY=169.254.169.254

本地防火墙规则

实例中的防火墙可能会阻止部分或所有进程访问 IMDS。

确保实例操作系统中的防火墙不会阻止到实例元数据 IP 地址的传出流量。防火墙包括 iptables、UFW(简单防火墙)等。

使用以下命令检查 iptables 的防火墙规则

sudo iptables -L
Chain INPUT (policy ACCEPT)
target prot opt source destination

Chain FORWARD (policy ACCEPT)
target prot opt source destination

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

如果 iptables 列表的结果显示元数据检索被拒绝,则您可能会收到以下错误:

$ 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 -proto tcp -destination 169.254.169.254 -match owner -uid-owner 1000-10000 -jump REJECT

请求节流

根据每秒的数据包数对到 IMDS 的流量进行节流。而且,连接到实例的每个弹性网络接口的限制为 1024 PPS。如果您的 IMDS 服务的 PPS 速率超过 1024 PPS,则会对请求进行节流。

如果出现节流,则使用指数回退策略重试您的请求

要查看 EC2 实例达到节流限制的频率,请在弹性网络接口驱动程序中查看 linklocal_allowance_exceeded 指标。该指标表明,因流向本地代理服务的流量而形成的数据包数量超过网络接口的最大值。

运行以下命令以查看 linklocal_allowance_exceeded 指标:

$ ethtool -S <Network-Interface>
eg: $ ethtool -S eth0

相关信息

在 Amazon EC2 实例上使用代理

检索实例元数据的示例

限制 IMDS 访问

查询节流

ENA 驱动程序的指标

AWS 官方
AWS 官方已更新 10 个月前