GHCR Docker镜像部署AWS Beanstalk遇403权限错误,请求排查
排查AWS Beanstalk拉取GHCR私有镜像失败的403问题
从你提供的eb-engine.log来看,核心问题出现在下载S3中的.dockercfg文件时返回403,且下载字节数为0,结合你的配置,按以下顺序排查:
1. 修正Dockerrun.aws.json中的密钥路径
日志明确显示Beanstalk尝试拉取的对象是/.dockercfg(带前置斜杠),但你在Dockerrun.aws.json的Authentication.Key字段写的是.dockercfg。S3对象键不允许前置斜杠,这会导致实际请求的对象不存在,触发权限拦截。
- 修正
Dockerrun.aws.json的Key字段,确保没有前置斜杠:"Authentication": { "Bucket": "xxxxx", "Key": ".dockercfg" } - 同时确认S3中该文件的实际键就是
.dockercfg(在桶根目录下,没有多余路径)。
2. 区分Beanstalk的服务角色和实例角色
你提到设置了Beanstalk环境的服务角色,但负责拉取S3文件和镜像的是EC2实例的实例配置文件角色(Instance Profile),两者权限是分离的:
- 进入Beanstalk环境的配置页面,找到实例配置,查看关联的实例配置文件。
- 给该实例配置文件的角色添加S3读取权限,权限策略如下:
{ "Version": "2012-10-17", "Statement": [ { "Sid": "AllowGetDockercfg", "Effect": "Allow", "Action": "s3:GetObject", "Resource": "arn:aws:s3:::xxxx/.dockercfg" } ] }
3. 验证S3对象的实际访问权限
- 检查S3桶的公共访问设置,确保没有阻止所有公共访问之外的额外限制(比如桶策略拒绝了实例角色的访问)。
- 手动测试实例角色的权限:使用AWS CLI在本地模拟实例角色的权限,执行
aws s3 cp s3://xxxx/.dockercfg ./test.cfg,如果返回403,说明权限配置仍有问题。 - 确认
.dockercfg文件本身没有设置独立的对象权限(比如拒绝了实例角色的访问),可以在S3控制台查看该文件的权限设置,确保继承桶的权限或直接允许实例角色读取。
4. 验证.dockercfg的有效性
日志中下载字节数为0,可能是文件本身为空或上传失败:
- 重新在本地生成
.dockercfg:执行docker login ghcr.io,输入GitHub用户名和个人访问令牌(PAT,需要有read:packages权限),确保生成的文件有有效内容。 - 重新上传该文件到S3,覆盖原有文件,确认上传后的文件大小不为0。
- 检查
.dockercfg的格式是否正确,确保auth字段是Base64编码的用户名:令牌字符串。
5. 检查Beanstalk平台版本兼容性
你使用的是AWSEBDockerrunVersion: 1,该版本适用于单一Docker镜像部署,但部分旧版本的Beanstalk平台可能对私有镜像的认证逻辑有bug:
- 尝试升级Beanstalk平台到最新的Amazon Linux 2版本(推荐使用Docker平台分支),新版本的认证逻辑更稳定。
内容的提问来源于stack exchange,提问作者Harry Lees
相关产品推荐
相关产品推荐

