已绑定IAM角色的EC2实例运行ECR命令的权限配置问题
问题原因
- AWS官方托管的
AmazonEC2ContainerRegistryFullAccess策略仅适用于ECR私有仓库的所有操作,权限动作前缀为ecr:,不包含ECR公有仓库(ECR Public)的操作权限。 - ECR Public是独立的AWS服务类别,所有相关操作的权限动作前缀为
ecr-public:,不在上述托管策略的覆盖范围内,因此即使配置了该策略依然会报AccessDenied错误。 - 配置
AdministratorAccess后所有服务的操作权限都被放开,自然可以正常创建ECR Public仓库。
所需的最小IAM策略配置
你可以为jenkins_role附加如下自定义策略,覆盖ECR Public的操作需求,如果同时需要操作私有ECR仓库,可以保留原有AmazonEC2ContainerRegistryFullAccess托管策略,或者合并到自定义策略中:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "ecr-public:CreateRepository", "ecr-public:DeleteRepository", "ecr-public:DescribeRepositories", "ecr-public:GetRepositoryPolicy", "ecr-public:SetRepositoryPolicy", "ecr-public:InitiateLayerUpload", "ecr-public:UploadLayerPart", "ecr-public:CompleteLayerUpload", "ecr-public:PutImage", "ecr-public:BatchCheckLayerAvailability", "ecr-public:GetDownloadUrlForLayer", "ecr-public:BatchGetImage" ], "Resource": "arn:aws:ecr-public::1234567890:repository/*" }, { "Effect": "Allow", "Action": "ecr-public:GetAuthorizationToken", "Resource": "*" }, { "Effect": "Allow", "Action": "sts:GetServiceBearerToken", "Resource": "*", "Condition": { "StringEquals": { "sts:AWSServiceName": "ecr-public.amazonaws.com" } } } ] }
注意将策略中的账号ID
1234567890替换为你实际的AWS账号ID,也可以根据实际使用场景裁剪不需要的动作,进一步收缩权限范围。
额外注意事项
- 如果你是在非us-east-1区域调用ECR Public的API,不需要额外配置其他区域的权限,ECR Public的服务端点仅在us-east-1区域存在,所有区域的ECR Public请求最终都会自动路由到该端点。
- 确认
jenkins_role的信任策略中已经允许EC2服务代入角色,没有额外的权限边界限制相关操作。
内容的提问来源于stack exchange,提问作者TheWalkingMalteser
相关产品推荐
相关产品推荐

