让 AWS Glue 写入另一个 AWS 账户中的 S3 存储桶

Getting AWS Glue to write to an S3 bucket in another AWS account

我需要 AWS Glue(账户:PROD)写入另一个账户(账户:DEV)上的 S3 存储桶

根据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 存储桶。

我该怎么做?

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

希望对您有所帮助

我们可以通过让 GLUE 作业向它正在创建并上传到 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)

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