跨账号访问S3 Bucket失败:配置Bucket Policy仍遇Access Denied错误
跨账号访问S3 Bucket时调用getBucketLocation返回Access Denied的排查与解决
我尝试配置Bucket Policy实现跨账号访问S3 Bucket,已设置如下策略,但通过AWS SDK调用getBucketLocation时仍收到Access Denied错误。
策略配置:
{ "Version": "2012-10-17", "Statement": [ { "Sid": "CrossAccountPutGet", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::123456789012:role/my-task-role" }, "Action": [ "s3:*Object", "s3:GetBucketLocation", "s3:ListBucket" ], "Resource": [ "arn:aws:s3:::my-bucket/*", "arn:aws:s3:::my-bucket" ] } ] }
调用的Java代码片段:
String region = s3Clientdefault.getBucketLocation(currentBucket);
可能的问题及修复方案
无效的Action写法
策略中的s3:*Object不是AWS S3支持的合法操作名称,AWS不识别这种通配符格式。需要替换为具体的对象操作,比如:"Action": [ "s3:GetObject", "s3:PutObject", "s3:GetBucketLocation", "s3:ListBucket" ]若需覆盖所有对象操作,可使用
s3:*Object*(注意后缀的*),但更推荐明确列出所需操作以遵循最小权限原则。跨账号角色信任策略缺失
确保被授权的角色my-task-role(账号123456789012下)的信任策略允许发起请求的实体(如另一账号的用户/角色)扮演它。例如,若账号987654321098的用户需要扮演该角色,信任策略应包含:{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::987654321098:user/your-user" }, "Action": "sts:AssumeRole" } ] }IAM权限与Bucket Policy的交集限制
S3访问权限是IAM实体权限(角色/用户的权限)与Bucket Policy的交集。需确保my-task-role本身的IAM策略也允许执行相关操作,比如:{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "s3:GetBucketLocation", "s3:ListBucket", "s3:GetObject", "s3:PutObject" ], "Resource": [ "arn:aws:s3:::my-bucket", "arn:aws:s3:::my-bucket/*" ] } ] }确认凭证正确性
检查SDK调用时使用的凭证确实是my-task-role的临时凭证,避免误使用其他账号或角色的凭证。可通过打印凭证关联的账号ID验证。检查SCP或其他全局限制
若账号启用了AWS Organizations,确认服务控制策略(SCP)未阻止该角色访问S3服务或目标Bucket。
内容的提问来源于stack exchange,提问作者Tom
相关产品推荐
相关产品推荐

