从Docker容器中获取AWS实例元数据?

use*_*508 20 amazon-ec2 amazon-web-services docker

是否有直接的方法从Docker容器中访问AWS实例元数据?

例如,在尝试获取EC2实例上的IAM角色的凭据时,这将适用于实例本身:

http://169.254.169.254/latest/meta-data/iam/security-credentials/my_role
Run Code Online (Sandbox Code Playgroud)

...但不是在该EC2实例上运行的Docker容器中.

Ben*_*ley 30

在容器和主机之间执行此操作应该没有区别.容器可以直接访问EC2元数据.

root@f1e5964e87e4:/# curl http://169.254.169.254/latest/meta-data/iam/security-credentials/myrole
{
  "Code" : "Success",
  "LastUpdated" : "2014-03-14T17:07:24Z",
  "Type" : "AWS-HMAC",
  "AccessKeyId" : "mykey",
  "SecretAccessKey" : "mysecret",
  "Token" : "mytoken",
  "Expiration" : "2014-03-14T23:09:39Z"
}
Run Code Online (Sandbox Code Playgroud)

当您从容器中尝试命令时,您看到了什么?是否分配了IAM角色?

  • 我刚刚对此进行了测试,并确认在AWS EC2实例上运行的Docker容器可以访问元数据服务. (3认同)
  • 我必须使用 `--net=host` 来启用对元数据服务的访问。 (3认同)
  • 没有。5年前,我说过http://169.254.169.254可以从docker容器访问。因此,您的代码可以检索其 EC2 实例主机元数据。如果您使用 AWS 开发工具包,则无需编写代码来检索临时凭证。我们的 SDK 会自动为您完成此操作。(并且 AWS CLI 使用 Python SDK) (2认同)
  • @SébastienStormacq 在 Windows 容器中这似乎不是真的。如果 jingpeng-wu 是正确的,那么这就可以解释它,因为 Windows docker 无法进行主机模式网络。你知道我如何在 Windows 中和/或没有主机网络的情况下执行此操作吗? (2认同)
  • @RichardPayne 查看此链接以从 Windows 容器访问元数据:https://docs.aws.amazon.com/AmazonECS/latest/developerguide/windows_task_IAM_roles.html (2认同)
  • 只是想指出,我在 Ubuntu 盒子中遇到了这个问题,并通过增加可以进行的最大 PUT“跳跃”来修复它。`aws ec2 修改实例元数据选项 --instance-id <instanceId> --http-put-response-hop-limit 3 --http-endpoint 已启用` https://docs.aws.amazon.com/AWSEC2 /latest/UserGuide/configuring-instance-metadata-service.html (2认同)

Gra*_*Lea 7

如果您已将实例迁移到IMDSv2 *,则获取元数据的默认跃点限制将设置为1。此跃点限制将阻止Docker 容器访问元数据(假设它们使用的是 Docker 网络,而不是主机网络)。

该答案描述了如何更改跃点限制来纠正这种情况: /sf/answers/5031913351/

* IMDSv2 =“实例元数据服务版本 2”= EC2 的新的、更安全的、面向会话的元数据访问方法,某些安全审计推荐/要求使用该方法。

(感谢 @efess 的上述评论,这让我意识到这是我的问题。)