首页 > 解决方案 > 如何在 EC2 上的 docker 内使用 AWS 凭证运行命令?

问题描述

我有 EC2 可以通过配置文件定期访问 S3:

aws s3 ls --profile myprofile s3://

在同一个 EC2 上,我创建了 docker 容器并安装了 aws cli 工具。创建~./aws/config了与主机 ec2 上内容相同的文件,但是来自 docker 容器的这个命令现在给出了错误:

aws s3 ls --profile myprofile s3://
Error when retrieving credentials from Ec2InstanceMetadata: No credentials found in credential_source referenced in profile myprofile

如何启用对容器内 S3 的访问?

标签: amazon-web-servicesdockeramazon-s3aws-cli

解决方案


有几个选项可以做到这一点,并且根据您对可能的安全风险的风险偏好将有助于确定要走的路。

您可以使用静态凭据在外部创建文件并在构建期间credentials将其复制到其中。~/.aws/您甚至可以在文件中使用变量并使用ENVor传递它们ARG

如果您正在使用,docker-compose那么.env文件就会发挥作用,其想法与上述几乎相同。

您可以调用 EC2 的元数据服务来检索临时凭证,我对此没有太多经验,但这里有一些信息:https ://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2 -instance-metadata.html#instancedata-data-retrieval

您也可以cat > ~/.aws输出文件,尽管这会很痛苦,并在 CLI 级别或使用 .env、ENV 或 ARG 做一些 ENV 变量的变体

如果您使用 ECS 在 EC2 之上运行容器,那么您可以在valueFrom任务定义/容器定义中将变量作为 a 传递,以从 Systems Manager 参数存储(明文)中获取它们,或者您可以使用 a 加密您的参数KMS 密钥或使用 Secrets Manager 中的明文秘密并将它们注入您的变量。

使用上述方法,您可以COPY创建一个变量化credentials文件,并ENV像在 Dockerfile 中一样传递变量$(keys),然后从 Secrets Manager 或 Parameter Store 注入它们以增加安全性。


推荐阅读