我正在尝试在帐户A中的Redshift群集上运行COPY命令,该帐户从帐户B的存储桶加载文件:
COPY inventory FROM 's3://account-A-bucket/redshiftManifest' IAM_ROLE 'arn:aws:iam::account-A:role/readS3Role' DELIMITER ',' REGION 'us-west-2' MANIFEST GZIP COMPUPDATE OFF REMOVEQUOTES
readS3Role具有权限:
{
"Action": [
"s3:List*",
"s3:Get*"
],
"Resource": [
"arn:aws:s3:::account-A-bucket*",
"arn:aws:s3:::account-B-bucket*"
],
"Effect": "Allow"
}
s3:// account-A-bucket / redshiftManifest是account-B-bucket中的文件列表。 account-B-bucket有以下政策:
{
"Sid": "DelegateS3Access",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::account-A:root"
},
"Action": [
"s3:Get*",
"s3:List*"
],
"Resource": [
"arn:aws:s3:::account-B-bucket",
"arn:aws:s3:::account-B-bucket/*"
]
}
我还在帐户B-bucket的访问控制列表中添加了帐号A.
根据S3 to Redshift : Copy with Access Denied,我启用了增强的VPC路由,看来我的群集的子网有一个与之关联的com.amazonaws.us-west-2.s3的端点。
但是,我仍然收到S3ServiceException:当Redshift尝试加载清单中定义的account-B-bucket中的一个文件时,拒绝访问。
答案 0 :(得分:3)
无需启用增强型VPC路由 - Access Denied
错误表明您已经达到S3就好了,但您的权限不足。
帐户A无权授予对帐户B中任何内容的访问权限,因此您的readS3Role
角色不应指代Bucket-B。
Bucket-B上的Bucket政策应授予对arn:aws:iam::account-A:role/readS3Role
(不是root
)的访问权限。
这样,Redshift群集将使用Account-A中的readS3Role
来访问Bucket-B。
答案 1 :(得分:2)
问题最终是因为虽然我有一个有效的存储桶策略,但是S3存储桶中的对象是第三个帐户,因此无法从我的帐户访问。
我将不得不在我的COPY中直接使用AWS凭证来访问Redshift中的资源