在 EC2 或 ECS 上的 docker 内使用带有令牌的 IMDS (v2)

Rob*_*rcd 12 networking amazon-ec2 amazon-web-services amazon-ecs docker

我想在 EC2 实例上运行的容器内使用 IMDSv2。

我想使用令牌,因为我的元数据选项需要它们:

metadata_options {
  http_tokens   = "required"
  http_endpoint = "enabled"
}
Run Code Online (Sandbox Code Playgroud)

从 EC2 实例调用 API 按预期返回我的令牌。

curl -s -X PUT "http://169.254.169.254/latest/api/token" -H "X-aws-ec2-metadata-token-ttl-seconds: 21600"

但是,如果我尝试从 docker 容器调用它:

docker run -it curlimages/curl sh
/ $ curl -X PUT "http://169.254.169.254/latest/api/token" -H "X-aws-ec2-metadata-token-ttl-seconds: 21600"
curl: (56) Recv failure: Connection reset by peer
Run Code Online (Sandbox Code Playgroud)

我只是有一个超时时间。

根据这个答案,它应该可以开箱即用,但事实并非如此。如果我添加一个--network=host标志,它会起作用,但这对我来说不是解决方案。

谢谢

jor*_*anm 30

我为了从 Docker 容器访问 IMDSv2 元数据,您必须在实例元数据配置中增加 IMDSv2 的跃点限制。来自AWS文档

在容器环境中,如果跃点限制为 1,则 IMDSv2 响应不会返回,因为前往容器被视为额外的网络跃点。为了避免回退到 IMDSv1 的过程以及由此产生的延迟,在容器环境中,我们建议您将跃点限制设置为 2

要更改跃点限制,您可以modify-instance-metadata-options在 awscli 中使用:

aws ec2 modify-instance-metadata-options \
    --instance-id <instance_id> \
    --http-put-response-hop-limit 2 \
    --http-endpoint enabled
Run Code Online (Sandbox Code Playgroud)

  • 非常感谢您的回答!我在 ECS 文档中搜索,我的错!为“http-put-response-hop-limit”设置较高的值是一种不好的做法,还是实际上并不重要? (2认同)