Redshift跨帐户显示COPY,实例凭据失败

时间:2017-10-24 23:42:10

标签: amazon-web-services amazon-s3 amazon-redshift amazon-vpc

我正在尝试在帐户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中的一个文件时,拒绝访问。

2 个答案:

答案 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中的资源