Elastic Beanstalk实例上传文件到S3遇权限拒绝的解决方法
解决Elastic Beanstalk Worker实例上传S3报错Access denied的问题
核心问题分析
你当前的S3桶策略给的是Elastic Beanstalk服务角色(aws-elasticbeanstalk-service-role)权限,但Worker实例实际使用的是EC2实例角色(通常名为aws-elasticbeanstalk-ec2-role或自定义角色),两者不是同一个角色,所以桶策略的权限不会生效。本地能上传是因为你用的本地AWS凭证(比如配置文件里的密钥)有足够权限。
具体解决方案
方案1:给EC2实例角色添加S3权限
- 登录AWS控制台,进入IAM服务。
- 找到Worker实例使用的IAM角色:
- 打开Elastic Beanstalk控制台,进入你的环境,点击左侧「配置」→「实例」,查看「IAM实例配置文件」对应的角色名称。
- 给该角色添加内联策略或托管策略:
- 内联策略示例(允许上传等必要操作):
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "s3:PutObject", "s3:GetObject", "s3:ListBucket" ], "Resource": [ "arn:aws:s3:::spmgr", "arn:aws:s3:::spmgr/*" ] } ] } - 也可以直接附加
AmazonS3FullAccess托管策略(若无需严格最小权限),但建议遵循最小权限原则,只添加业务必需的操作。
- 内联策略示例(允许上传等必要操作):
方案2:调整S3桶策略,允许EC2实例角色访问
如果不想修改实例角色,也可以修改桶策略,把实例角色的ARN加入Principal:
- 先获取EC2实例角色的ARN:在IAM角色详情页复制ARN(格式类似
arn:aws:iam::823510892997:role/aws-elasticbeanstalk-ec2-role)。 - 修改桶策略,添加新的Statement:
{ "Version": "2008-10-17", "Statement": [ { "Sid": "AddPerm", "Effect": "Allow", "Principal": "*", "Action": "s3:GetObject", "Resource": "arn:aws:s3:::spmgr/*" }, { "Sid": "AllowEBSService", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::823510892997:role/service-role/aws-elasticbeanstalk-service-role" }, "Action": "*", "Resource": [ "arn:aws:s3:::spmgr", "arn:aws:s3:::spmgr/*" ] }, { "Sid": "AllowEC2InstanceRole", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::823510892997:role/aws-elasticbeanstalk-ec2-role" }, "Action": [ "s3:PutObject", "s3:GetObject" ], "Resource": [ "arn:aws:s3:::spmgr", "arn:aws:s3:::spmgr/*" ] } ] }
验证步骤
- 保存修改后,等待1-2分钟让IAM权限生效。
- 重新测试Worker实例的上传操作,确认是否还报错。
- 如果仍有问题,可以用AWS CLI在实例上执行
s3 cp命令测试,或者查看CloudTrail日志,确认具体被拒绝的操作以及使用的角色信息。
内容的提问来源于stack exchange,提问作者rahulserver
相关产品推荐
相关产品推荐

