如何在EC2上的docker内部使用AWS凭证运行命令?

时间:2019-06-28 13:06:03

标签: amazon-web-services docker amazon-s3 aws-cli

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

aws s3 ls --profile myprofile s3://

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

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

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

1 个答案:

答案 0 :(得分:0)

有几种方法可以做到这一点,并且根据您对风险的承受程度,可能会遇到安全隐患,这将有助于确定前进的方向。

您可以使用在外部使用静态凭据创建credentials文件并将其在构建期间复制到~/.aws/的方法。您甚至可以在文件中使用变量,然后将其传递给ENVARG

如果您使用的是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的形式传入变量,以从Systems Manager参数存储区(纯文本)中获取它们,或者,您可以使用KMS密钥对参数进行加密,也可以使用Secrets Manager中的“纯文本秘密”并将其注入变量中。

有了上述内容,您可以COPY变量化的credentials文件,并将ENV变量作为$(keys)传递到Dockerfile中,然后从Secrets Manager中注入它们或参数存储区,以提高安全性。