在另一个账户中跨账户访问 AWS Glue 的 S3

zen*_*th7 7 amazon-s3 amazon-iam aws-glue

我想设置对 S3 存储桶的跨账户访问,以便 AWS Glue 在另一个账户中进行爬网。我们的环境中有两个帐户(A 和 B):

  • AccountA有一个具有 ACL 权限的 S3 存储桶(即管理员不喜欢使用存储桶策略),允许 AccountB 既“列出对象”又“读取存储桶权限”。
  • AccountB希望使用 Glue(在 AccountB 中)抓取 AccountA 中 S3 存储桶中的数据,从而填充其自己的数据目录。

我已经验证我可以通过 AccountB 凭证使用 AWS CLI 列出 AccountA 的 S3 存储桶的内容,即aws s3 ls AccountA-S3-Bucket

在 AccountB 中,我使用以下内联策略设置了一个角色(允许 Glue 代表您调用 AWS 服务)

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:Get*",
                "s3:List*"
            ],
            "Resource": "arn:aws:s3:::AccountA-S3-Bucket/*"
        }
    ] 
}
Run Code Online (Sandbox Code Playgroud)

为了更好地衡量,该角色还附加了 AmazonS3FullAccess、AWSGlueServiceRole 和 CloudWatchLogsFullAccess 托管策略。我设置了一个 Glue 爬虫,将该角色附加为服务角色。

当我在爬网程序停止后查看 CloudWatch 日志时,出现以下错误:

[3c81da32-b1eb-49f8-8e51-123fa94f789b] ERROR : Not all read errors will be logged. com.amazonaws.services.s3.model.AmazonS3Exception: Access Denied (Service: Amazon S3; Status Code: 403; Error Code: AccessDenied; Request ID: 4C75D2487246DC4B; S3 Extended Request ID: GoXpY+6XC0pL73qJDmHGt3/4Mp/HeFXNiNFU3QGxVxt2ltTV4W41/LuJCBDVCcqc6Hep+tlG+Wg=), S3 Extended Request ID: GoXpY+6XC0pL73qJDmHGt3/4Mp/HeFXNiNFU3QGxVxt2ltTV4W41/LuJCBDVCcqc6Hep+tlG+Wg=
Run Code Online (Sandbox Code Playgroud)

我还尝试按照此博客文章进行上述操作 如何向另一个账户中的 AWS Glue 和 Athena 提供对 Amazon S3 存储桶中对象的跨账户访问

我正在做的事情和博客文章所做的事情之间唯一真正的区别是他们在 S3 存储桶上设置了存储桶策略,而我的管理员在存储桶上设置了 ACL 权限。我想知道这是否是问题的原因。任何帮助将不胜感激。

zen*_*th7 2

问题是管理员在存储桶上设置了 ACL,但没有在存储桶内的对象上设置 ACL(读取对象)。由于桶中的对象数量较多,并且必须为每个对象放置一个 ACL,因此 ACL 方法被废弃。相反,强制执行了存储桶策略 - 解决了问题。