获取AWS Glue以写入另一个AWS账户中的S3存储桶

时间:2017-12-13 00:01:14

标签: amazon-s3 amazon-iam aws-glue

我需要将AWS Glue(帐户:PROD)写入另一个帐户的S3 Bucket(帐户:DEV)

根据http://docs.aws.amazon.com/glue/latest/dg/access-control-overview.html

基于资源的政策

其他服务(如Amazon S3)也支持基于资源的权限策略。例如,您可以将策略附加到要管理的S3存储桶 访问该存储桶的权限。 AWS Glue不支持基于资源的政策。

...这意味着我无法做arn:aws:s3::DEV-Account:S3-Bucket/*

我尝试使用PROD在DEV帐户上创建Trusted entity,并附加了一个策略集来访问DEV帐户上的s3存储桶。

我该怎么做?

3 个答案:

答案 0 :(得分:2)

我们遇到了同样的问题,我们通过将这些问题添加到我们的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'
)

希望这有帮助

答案 1 :(得分:1)

只是Glue现在支持资源级别策略的更新,但当前仅适用于DataCatalog资源。 https://docs.aws.amazon.com/glue/latest/dg/glue-resource-policies.html

答案 2 :(得分:0)

我们能够通过让GLUE Job为其创建的对象添加ACL并上传到S3存储桶来解决这个问题

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)