amazon-web-services - 如何让 Docker Swarm 管理器使用 IAM 角色权限从 AWS ECR 中提取图像?
问题描述
我无法从运行 Docker Swarm 的 AWS ECR 中提取图像。多年来一直运行良好,但我的 swarm 管理器节点已更改为新的 EC2 实例。现在我的服务无法部署:
~ $ docker stack deploy -c dkr_compose_geo_site:3.2.0 --with-registry-auth geo_stack
管理器节点日志显示“没有基本身份验证凭据”:
May 19 21:21:12 ip-172-31-3-108 root: time="2020-05-19T21:21:12.857007050Z" level=error msg="pulling image failed" error="Get https://445523.dkr.ecr.us-west-2.amazonaws.com/v2/geo_site/manifests/sha256:da5820742cd0ecd52e3a2c61179a039ce80996564604b70465e3966087380a09: no basic auth credentials" module=node/agent/taskmanager node.id=eix8c6orbunemismg03ib1rih service.id=smilb788pets7y5rgbu3aze9l task.id=zd3ozdpr9exphwlz318pa9lpe
May 19 21:21:12 ip-172-31-3-108 root: time="2020-05-19T21:21:12.857701347Z" level=error msg="fatal task error" error="No such image: 445523.dkr.ecr.us-west-2.amazonaws.com/geo_site@sha256:da5820742cd0ecd52e3a2c61179a039ce80996564604b70465e3966087380a09" module=node/agent/taskmanager node.id=eix8c6orbunemismg03ib1rih service.id=smilb788pets7y5rgbu3aze9l task.id=zd3ozdpr9exphwlz318pa9lpe
此管理器节点在具有 IAM 角色的 EC2 实例上运行;IAM 角色具有似乎授予权限的 ECR 策略:
{
"Version": "2012-10-17",
"Statement": [
{
"Action": [
"ecr:GetAuthorizationToken",
"ecr:BatchCheckLayerAvailability",
"ecr:GetDownloadUrlForLayer",
"ecr:GetRepositoryPolicy",
"ecr:DescribeRepositories",
"ecr:ListImages",
"ecr:DescribeImages",
"ecr:BatchGetImage"
],
"Resource": "*",
"Effect": "Allow"
}
]
}
通过阅读 AWS/Docker 文档,我认为在管理器节点上运行的 docker 命令应该采用实例 IAM 角色并使用关联的策略权限访问 ECR 存储库。它似乎总是以这种方式工作,但现在看起来可能在旧的管理器节点上隐藏了一些配置文件;我在一个新实例上,它不起作用。我不在这些管理器节点上运行 AWS-CLI,因此无需aws ecr get-login
手动登录。如何让这个新的管理器节点通过 ECR 进行身份验证?
谢谢!
解决方案
我的解决方案,基于 Luigi Lopez 和amazon-ecr-credential-helper 的评论:
AWS IAM 角色允许身份验证,但 docker cli 仍必须向 ECR 提供凭证,正如 Luigi 在他的评论中指出的那样。
这是一个 Docker Swarm 实现,节点运行 Alpine OS。有一个适用于 Alpine 的aws-cli包,但是安装过程非常麻烦,最终二进制文件还是崩溃了。
Amazon ECR Credential Helper 在任何情况下都是更好的长期解决方案,因为您不需要每 12 小时获取新令牌或设置代理服务器等。它使用推荐的 IAM 角色身份验证,不存储任何凭证机器或泄漏到日志文件中。
所以在 Alpine 下,我按照上面链接中的说明从源代码构建。我安装了 go、git 和 make,然后按照描述构建了 credential-helper。我按照描述设置了 PATH,创建了一个配置文件,然后我的部署工作了。没有docker login
必要。
推荐阅读
- python - Pandas 将数据框列中的列表与另一个数据框合并
- javascript - 在模糊事件中将字符串转换为有效 fips 代码的有效方法
- java - Spring-Boot:尝试从 @PostConstruct 方法抛出自定义 RunTimeException 失败
- laravel - 创建或更新行 Laravel
- java - Micronaut 自定义验证约束,根据值编写自定义消息
- python - 无法使用 LBPHFaceRecognizer 和 opencv 训练图像
- mysql - #1241 - 操作数应包含 1 列 SQL 更新
- reactjs - 如何在反应中保护路线?如果管理员登录需要进行身份验证
- amazon-web-services - 仅当 Terraform 中存在文件时才部署资源
- node.js - 无法从“node_modules/expo-three/build/index.js”错误中解析“./ExpoTHREE”