EC2实例绑定IAM角色后可列S3桶但无法下载文件如何解决?
问题根因
你当前EC2实例绑定的IAM内联策略资源范围配置错误:
你指定的资源arn:aws:s3:::mybuild仅对应S3存储桶本身,仅适配ListBucket等桶级操作,这也是你可以正常列出存储桶内容的原因。而GetObject属于对象级操作,需要匹配桶内对象的ARN格式arn:aws:s3:::mybuild/*,你的策略中没有覆盖该资源范围。
即使你已在存储桶侧配置了角色的全量S3权限,IAM侧的策略也需要覆盖对应操作的资源范围,二者同时满足权限才会生效。另外S3为了避免泄露桶内未授权对象的存在性,无权限访问对象时会返回404而非403,和你拿到的错误日志一致。
修复方案
将EC2实例的内联策略调整为如下内容,同时覆盖桶级和对象级资源:
{ "Version": "2012-10-17", "Statement": [ { "Sid": "managebucketsid", "Effect": "Allow", "Action": "s3:*", "Resource": [ "arn:aws:s3:::mybuild", "arn:aws:s3:::mybuild/*" ] } ] }
补充确认项
- 存储桶侧的资源策略需确保Principal字段正确指向EC2绑定的IAM角色ARN,无额外Condition限制(如源IP、路径过滤)覆盖权限
- 计划任务无需配置
~/.aws目录,只要EC2实例角色配置正确,AWS CPP SDK会默认通过实例元数据服务自动获取临时凭证,不需要额外指定AWS profile - 权限调整后可以直接在EC2实例上执行
aws s3 cp s3://mybuild/测试文件 ./验证权限是否生效,不需要手动配置任何凭证
内容的提问来源于stack exchange,提问作者zdenko.s
相关产品推荐
相关产品推荐

