使AWS Glue将数据写入到另一个AWS账户中的S3存储桶

7
我需要让AWS Glue(账户:PROD)写入到另一个账户(账户:DEV)的S3 Bucket中。
根据http://docs.aws.amazon.com/glue/latest/dg/access-control-overview.html
基于资源的策略
其他服务,例如Amazon S3,也支持基于资源的权限策略。例如,您可以将策略附加到S3存储桶以管理对该存储桶的访问权限。AWS Glue不支持基于资源的策略。 这意味着我无法执行arn:aws:s3::DEV-Account:S3-Bucket/* 我尝试在DEV帐户上创建一个“受信实体”,并使用PROD附加了一个策略集来访问DEV帐户上的s3存储桶。
我该如何处理?
3个回答

8

我们遇到了同样的问题,通过将以下内容添加到我们的 DEV 存储桶策略中,我们找到了解决方案:

{
    "Sid": "SID",
    "Effect": "Allow",
    "Principal": {
        "AWS": "arn:aws:iam::[PROD-ACCOUNT-ID]:role/[PROD-GLUE-ROLE]"
    },
    "Action": [
        "s3:Get*",
        "s3:Put*",
        "s3:ListBucket",
        "s3:ListBucketMultipartUploads",
        "s3:ListBucketVersions",
        "s3:ListMultipartUploadParts"
    ],
    "Resource": [
        "arn:aws:s3:::[DEV-BUCKET]",
        "arn:aws:s3:::[DEV-BUCKET]/*"
    ]
}

请将此添加到PROD Glue角色([PROD-GLUE-ROLE])的账户策略中:

{
    "Action": [
        "s3:Get*",
        "s3:List*"
        "s3:Put*"
    ],
    "Resource": [
        "arn:aws:s3:::[DEV-BUCKET]*"
    ],
    "Effect": "Allow"
}

接下来,您应该能够使用PROD帐户中的PROD角色读取和写入DEV存储桶中的数据:

data_frame = glue_context.create_dynamic_frame_from_options(
    connection_type='s3',
    connection_options={
        'paths':'s3://[DEV-BUCKET]/...'
    },
    format='json'
)

希望这可以帮到您。

感谢@hoaxz!非常感谢详细的说明。 - vr00n
我的荣幸 @vr00n - hoaxz

1

0

我们能够通过GLUE Job向创建并上传到S3存储桶中的对象添加ACL来解决此问题

ACL = {
u'Owner': {u'DisplayName': 'prod', u'ID': 'XXXX'
},
u'Grants': [{
    u 'Grantee': {
        u 'Type': 'CanonicalUser',
        u 'DisplayName': 'prod',
        u 'ID': 'XXXXX'
    },
    u 'Permission': 'FULL_CONTROL'
},
{
    u 'Grantee': {
        u 'Type': 'CanonicalUser',
        u 'DisplayName': 'dev',
        u 'ID': 'YYYY'
    },
    u 'Permission': 'READ'
},
{
    u 'Grantee': {
        u 'Type': 'CanonicalUser',
        u 'DisplayName': 'dev',
        u 'ID': 'YYYY'
    },
    u 'Permission': 'READ_ACP'
},
{
    u 'Grantee': {
        u 'Type': 'CanonicalUser',
        u 'DisplayName': 'dev',
        u 'ID': 'YYYY'
    },
    u 'Permission': 'WRITE_ACP'
}
]
response = client.put_object_acl(Bucket='BUCKET', Key='OBJECT', AccessControlPolicy=ACL)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接