Elastic Beanstalk CLI部署报Amazon S3 Forbidden错误如何解决?
解决Elastic Beanstalk CLI部署时S3 Forbidden错误
我之前碰到过几乎一模一样的问题——控制台部署完全正常,但用CLI执行aws elasticbeanstalk update-environment时就触发S3 Forbidden,CloudTrail还没记录错误码。咱们一步步拆解排查:
1. 先确认CLI和控制台用的是不是同一个身份
控制台部署用的是你当前登录AWS控制台的IAM用户/角色,但CLI大概率用的是本地配置的另一个身份(比如~/.aws/credentials里的配置,或者环境变量AWS_ACCESS_KEY_ID/AWS_SECRET_ACCESS_KEY)。
- 运行这条命令查看CLI当前使用的身份:
aws sts get-caller-identity - 去CloudTrail里找控制台部署成功的事件(比如
CreateApplicationVersion或UpdateEnvironment),对比调用者的ARN。如果两者不一样,权限差异就是问题根源。
2. 检查EB服务角色的S3权限
EB环境是通过服务角色(通常名为aws-elasticbeanstalk-service-role)访问S3拉取应用版本的。控制台部署正常说明这个角色基本权限没问题,但要确认它能访问你CLI指定版本对应的S3对象:
- 打开IAM控制台,找到EB服务角色,查看附加的权限策略。确保策略包含针对目标S3桶的以下权限:
s3:GetObjects3:ListBucket
- 如果你的应用版本存放在S3桶的特定前缀下,要确保策略里的资源路径覆盖了这个前缀(比如
arn:aws:s3:::your-bucket/*)。
3. 检查CLI用户的权限和上传的S3对象权限
如果你是用CLI创建应用版本并上传到S3的,可能存在两个问题:
3.1 CLI用户本身的权限
CLI用户需要有:
elasticbeanstalk:UpdateEnvironment权限(允许更新环境)s3:PutObject权限(上传应用版本到S3)- 可选:
elasticbeanstalk:CreateApplicationVersion权限(如果是CLI创建版本)
3.2 S3对象的访问权限
你上传到S3的Dockerrun.aws.json或应用包,需要允许EB服务角色读取它。可以通过两种方式解决:
- 上传时设置ACL:
aws s3 cp your-dockerrun-file.json s3://your-bucket/path/ --acl bucket-owner-full-control - 或者在S3桶策略中添加允许EB服务角色读取的规则:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::your-account-id:role/aws-elasticbeanstalk-service-role" }, "Action": ["s3:GetObject", "s3:ListBucket"], "Resource": [ "arn:aws:s3:::your-bucket", "arn:aws:s3:::your-bucket/*" ] } ] }
4. 开启S3访问日志找具体原因
CloudTrail没记录错误码的话,直接看S3桶的访问日志是最有效的:
- 打开S3控制台,找到目标桶,在「权限」→「访问日志」里开启日志记录,指定一个存储日志的桶(可以是同一个桶的不同前缀,或者另一个桶)。
- 重新执行CLI部署命令,等待错误出现后,查看S3日志里的403请求。日志里会包含调用者ARN、错误代码(比如
AccessDenied)和详细原因,能精准定位是哪个身份被拒绝。
5. 排查VPC配置(如果EB在VPC内)
如果你的EB环境部署在VPC中,还要检查:
- 是否配置了S3 VPC端点?如果有,端点的策略是否允许EB服务角色访问目标桶。
- 如果没配置端点,EB环境的子网是否有公网访问权限(比如关联了NAT网关),确保EB能通过公网访问S3。
我当时是因为CLI用的IAM用户上传应用版本时没设置ACL,导致EB服务角色读不到S3对象,调整ACL后就正常了。按这个流程排查,基本能解决问题。
内容的提问来源于stack exchange,提问作者bae
相关产品推荐
相关产品推荐

