我正在 VPC 内的 AWS CodeBuild 中运行 Docker 容器。在主机上,无需aws sts get-caller-identity
任何凭证即可运行。例如:
aws sts get-caller-identity
{
"UserId": "[redacted]",
"Account": "[redacted]",
"Arn": "arn:aws:sts::[redacted]:assumed-role/[redacted]"
}
然而,在 Docker 容器内部,我在尝试获取我的身份时收到错误:
% aws sts get-caller-identity
Couldn't reach EC2 metadata service.
Unable to locate credentials. You can configure credentials by running "aws configure".
我认为这是因为我无法访问 EC2 元数据服务来获取角色密钥,但我认为这应该“正常工作”,因为容器应该能够访问与主机相同的网络。
所以我退出了,再次查看了主机 - 看起来我无法访问http://169.254.169.254:
# curl -kv http://169.254.169.254/latest/meta-data/public-hostname
* Trying 169.254.169.254:80...
* TCP_NODELAY set
* Immediate connect fail for 169.254.169.254: Invalid argument
* Closing connection 0
curl: (7) Couldn't connect to server
主机上的工作情况如何aws sts
?我认为,如果未提供凭证,AWS CLI 需要访问该元数据服务。如何让它在容器内工作(我不想在环境变量中传递长寿命令牌)?
(根据在 CodeBuild 实例中直接探索 SessionManager 发现的更多细节进行编辑)
答案1
到目前为止我发现的最好的...
感谢@Tim的评论,CodeBuild 在 ECS 上运行。当它这样做时,它会从容器凭据中提取凭据。这些凭据显然是从不同的 IP 地址提取的,可以通过以下方式访问
169.254.170.2$AWS_CONTAINER_CREDENTIALS_RELATIVE_URI
您可以从该调用中提取角色凭证,然后将其传递到 Docker 容器中。