amazon-web-services - 如何在 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 的访问?
解决方案
有几个选项可以做到这一点,并且根据您对可能的安全风险的风险偏好将有助于确定要走的路。
您可以使用静态凭据在外部创建文件并在构建期间credentials
将其复制到其中。~/.aws/
您甚至可以在文件中使用变量并使用ENV
or传递它们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 注入它们以增加安全性。
推荐阅读
- python - 如何根据 python 中的用户输入检查从数组中随机生成的值?
- node.js - 为什么 .pre find 查询在这种情况下返回 undefined?
- r - 对列字符串的唯一组合进行子集化
- php - php - 从逗号分隔的值范围中获取最小值和最大值
- shopify - Complete Checkout API 给出错误“无法在没有任何交易的情况下完成结帐 shopify”
- python - 如何通过 python 中的 pyautogui 模块打开具有预定义窗口(x,y)位置的外部应用程序?
- html - 在 GitHub Pages 上包含图像的正确方法是什么?
- node.js - req.isAuthenticated 为 false 且 req.user 未定义。我该如何解决这个问题?
- javascript - 反应JS | OnSubmit 不是 Formik 的函数
- debian - Fail2ban - 如何阻止搜索 avi、mpeg、mpg