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

Posted

技术标签:

【中文标题】从 Docker 容器中获取 AWS 实例元数据?【英文标题】:Fetching AWS instance metadata from within Docker container? 【发布时间】:2014-04-20 00:03:00 【问题描述】:

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

例如,当尝试在 EC2 实例上获取 IAM 角色的凭证时,这将在实例本身上起作用:

http://169.254.169.254/latest/meta-data/iam/security-credentials/my_role

...但不是来自在该 EC2 实例上运行的 Docker 容器内。

【问题讨论】:

【参考方案1】:

正如@Ben Whaley 在 cmets 中提到的, 以下命令对我有用,在https://docs.aws.amazon.com/AmazonECS/latest/developerguide/windows_task_IAM_roles.html中提到

$gateway = (Get-NetRoute | Where  $_.DestinationPrefix -eq '0.0.0.0/0'  | Sort-Object RouteMetric | Select NextHop).NextHop
$ifIndex = (Get-NetAdapter -InterfaceDescription "Hyper-V Virtual Ethernet*" | Sort-Object | Select ifIndex).ifIndex
New-NetRoute -DestinationPrefix 169.254.169.254/32 -InterfaceIndex $ifIndex -NextHop $gateway

【讨论】:

【参考方案2】:

在容器和主机中执行此操作应该没有区别。容器可以直接访问 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"

当您在容器中尝试该命令时,您会看到什么?已分配 IAM 角色?

【讨论】:

我刚刚对此进行了测试,并确认在 AWS EC2 实例上运行的 Docker 容器可以访问元数据服务。 我必须使用--net=host 来启用对元数据服务的访问。 不。 5 年前,我说过 169.254.169.254 可以从 docker 容器中访问。因此,您的代码可以检索其 EC2 实例主机元数据。如果您使用 AWS 开发工具包,则无需编写代码来检索临时凭证。我们的 SDK 会自动为您完成这项工作。 (并且 AWS CLI 正在使用 Python 开发工具包) @RichardPayne 查看此链接以从 Windows 容器访问元数据:docs.aws.amazon.com/AmazonECS/latest/developerguide/… 只想指出,我在 Ubuntu 机器中遇到了这个问题,并通过增加您可以制作的最大 PUT“跳数”来修复它。 aws ec2 modify-instance-metadata-options --instance-id <instanceId> --http-put-response-hop-limit 3 --http-endpoint enableddocs.aws.amazon.com/AWSEC2/latest/UserGuide/…

以上是关于从 Docker 容器中获取 AWS 实例元数据?的主要内容,如果未能解决你的问题,请参考以下文章

python AWS:从EC2实例元数据中获取临时凭证,并使用它来访问AWS资源

如何从容器本身获取 Docker Linux 容器信息?

如何从 docker 容器内的主机工作站获取 aws 凭据

是否可以从 Docker 映像创建 AWS AMI?

将图像从公共 Docker Hub 拉取到 AWS Elastic Beanstalk 多个容器

通过 AWS ECS 在一个 EC2 实例中的多个 docker 容器