从 CodeBuild 实例访问 EC2 元数据服务

从 CodeBuild 实例访问 EC2 元数据服务

我正在 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 容器中。

相关内容