使用AWS CLI登录Amazon ECR Public时出现403 Forbidden错误
问题描述
我正尝试在EC2实例(俄亥俄区域,us-east-2)上通过AWS CLI登录Amazon ECR Public以推送Docker镜像。我已配置具备ECR完全访问权限的凭证,并遵循了登录公共ECR注册表的必要步骤。
执行以下命令时:
aws ecr get-login-password --region us-east-2 | docker login --username AWS --password-stdin public.ecr.aws/g0n5y2m3
出现如下错误:
Error response from daemon: login attempt to https://public.ecr.aws/v2/ failed with status: 403 Forbidden
当前使用的aws-cli版本为1.18.69
已完成的排查操作:
- 验证
~/.aws/credentials中的凭证已正确配置 - 确认IAM用户已附加
AmazonEC2ContainerRegistryFullAccess和AmazonElasticContainerRegistryPublicFullAccess策略 - 确保处于正确的区域(us-east-2)
请问登录公共ECR仓库时出现403 Forbidden错误的原因是什么?访问ECR Public是否还需要额外配置?
问题分析与解决方案
1. AWS CLI版本过低
你使用的1.18.69版本AWS CLI对ECR Public的支持存在兼容性缺陷,早期版本未完善公共注册表的登录令牌生成逻辑。建议升级到AWS CLI v2,或至少升级到v1的最新稳定版本:
# 升级到AWS CLI v2示例命令 curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip" unzip awscliv2.zip sudo ./aws/install
2. 区域参数使用错误
ECR Public是全局服务,无需指定区域参数(或需使用us-east-1作为默认区域)。你当前指定的us-east-2会导致生成的登录令牌无法被公共注册表识别,尝试调整命令:
# 去掉区域参数 aws ecr get-login-password | docker login --username AWS --password-stdin public.ecr.aws/g0n5y2m3 # 或指定us-east-1区域 aws ecr get-login-password --region us-east-1 | docker login --username AWS --password-stdin public.ecr.aws/g0n5y2m3
3. IAM策略权限缺失
虽然你已附加官方策略,但需确认策略中包含ecr-public:GetAuthorizationToken权限——这是登录公共注册表的核心权限。如果是自定义策略,需确保包含以下语句:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "ecr-public:GetAuthorizationToken", "ecr-public:BatchCheckLayerAvailability", "ecr-public:PutImage" ], "Resource": "*" } ] }
4. 实例角色权限问题(若使用EC2实例角色)
如果依赖EC2实例的IAM角色而非本地凭证,需确认实例角色已附加ECR Public相关权限策略,且角色信任关系允许EC2服务扮演该角色。
5. Docker缓存或网络问题
- 清理Docker旧登录缓存:
docker logout public.ecr.aws后重新登录 - 测试网络连通性:执行
curl https://public.ecr.aws确认EC2实例能正常访问公共ECR端点
内容的提问来源于stack exchange,提问作者Tomas Lecaros
相关产品推荐
相关产品推荐

