我正在尝试设置存储桶策略以允许跨帐户访问。
我的存储桶中有以下设置,但从 AWS SDK 调用时仍然出现“访问被拒绝”错误。
{
"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);
假设您的代码在 Account-A 中运行,S3 存储桶位于 Account-B 中。
您所显示的存储桶策略应应用于账户-B中的存储桶。
代码使用来自 Account-A 的 IAM 角色,因此我们将其称为 Role-A。
除了Bucket-B上的存储桶策略之外,您还需要向Role-A添加权限,以授予其访问Bucket-B的权限。也就是说,双方都需要权限 - Role-A 需要 use S3 的权限,而 Bucket-B 授予 Role-A 使用存储桶的权限。
关于 Role-A 的 IAM 策略与存储桶策略类似,但
Principal
不是必需的:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"s3:*Object",
"s3:GetBucketLocation",
"s3:ListBucket"
],
"Resource": [
"arn:aws:s3:::bucket-b/*",
"arn:aws:s3:::bucket-b"
]
}
]
}