从 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 enabled
docs.aws.amazon.com/AWSEC2/latest/UserGuide/…以上是关于从 Docker 容器中获取 AWS 实例元数据?的主要内容,如果未能解决你的问题,请参考以下文章
python AWS:从EC2实例元数据中获取临时凭证,并使用它来访问AWS资源