【问题标题】:How to run commands with AWS credentials inside docker on EC2?如何在 EC2 上的 docker 内使用 AWS 凭证运行命令?
【发布时间】:2019-11-10 10:45:24
【问题描述】:

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

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 的访问?

【问题讨论】:

  • 尝试以 SYS ENV 的形式提供凭据:docker run -e AWS_ACCESS_KEY_ID=XXX -e AWS_SECRET_ACCESS_KEY=XXXX IMAGE
  • 您应该能够正常使用EC2 metadata service 来检索实例的 IAM 角色的凭证。 Docker 本身不会阻止访问神奇的 ​​169.254.169.254 IP 地址。
  • 开启debug时,docker上的MainThread - urllib3.connectionpool - DEBUG - Starting new HTTPS connection (1): sts.amazonaws.com:443出错。

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


【解决方案1】:

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

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

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

您可以调用 EC2 的元数据服务来检索临时凭证,我没有太多 cURL 的经验,但这里有一些信息: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 Parameter Store(纯文本)中获取它们,或者您可以使用 KMS 密钥加密您的参数或使用 Secrets Manager 中的明文秘密并将它们注入您的变量。

通过上述方法,您可以将COPY 变量化为credentials 文件,并将ENV 变量作为$(keys) 传递到您的Dockerfile 中,然后从Secrets Manager 或Parameter Store 注入它们以增加安全性.

【讨论】:

    猜你喜欢
    • 2020-05-29
    • 2018-02-01
    • 2021-05-28
    • 2020-02-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-07
    • 2017-12-17
    相关资源
    最近更新 更多