AWS Athena读取外部S3存储桶

时间:2020-10-16 13:34:21

标签: amazon-web-services amazon-s3 amazon-athena

是否可以分析雅典娜外部S3存储桶中的数据?

我使用了带有存储桶策略的官方文档,该策略允许访问AWS Athena所在的帐户,但这不起作用。我经常收到访问被拒绝的错误。

我也尝试过使用与Principal相同的角色,但这也行不通。这应该行得通,因为我发现Athena使用S3访问的主体与执行查询的主体相同。

我还有一个选择,就是复制S3内容,但这不是我想要完成的。所有官方文件都说可以通过存储桶策略跨帐户访问S3存储桶,但是我看不到这种方法有效。如果有人对此有经验或可以测试,我将不胜感激。

PS:我已经在这里阅读了类似的答案,但没有找到任何有效的方法。

更新:使用了这两个策略。帐号不一样。

这是AWS的正式政策。

{
   "Version": "2012-10-17",
   "Id": "MyPolicyID",
   "Statement": [
      {
         "Sid": "MyStatementSid",
         "Effect": "Allow",
         "Principal": {
            "AWS": "arn:aws:iam::123456789123:root"
         },
         "Action": [
            "s3:GetBucketLocation",
            "s3:GetObject",
            "s3:ListBucket",
            "s3:ListBucketMultipartUploads",
            "s3:ListMultipartUploadParts",
            "s3:AbortMultipartUpload",
            "s3:PutObject"
         ],
         "Resource": [
            "arn:aws:s3:::my-athena-data-bucket",
            "arn:aws:s3:::my-athena-data-bucket/*"
         ]
      }
   ]
}

我尝试过的另一个是相同的,只是带有通配符:

{
   "Version": "2012-10-17",
   "Id": "MyPolicyID",
   "Statement": [
      {
         "Sid": "MyStatementSid",
         "Effect": "Allow",
         "Principal": {
            "AWS": "arn:aws:iam::123456789123:root"
         },
         "Action": [
            "s3:Get*",
            "s3:List*"
         ],
         "Resource": [
            "arn:aws:s3:::my-athena-data-bucket",
            "arn:aws:s3:::my-athena-data-bucket/*"
         ]
      }
   ]
}

1 个答案:

答案 0 :(得分:0)

要使跨帐户访问S3正常工作,必须满足以下条件(帐户A拥有存储桶,帐户B是访问存储桶的帐户):

  1. 帐户A必须设置一个存储桶策略,该策略将必需的操作授予帐户B
  2. 帐户B必须具有对存储桶和操作具有必要权限的IAM用户或角色
  3. 存储桶中的对象必须归帐户A拥有
  4. 对象未使用KMS加密

此外,要使其与Athena配合使用,运行查询的IAM用户或角色还必须具有将结果写入输出位置的权限,该位置通常是与包含数据的存储区分开的存储区。

如果对象是用KMS加密的,则需要帐户A中的另一组策略才能授予对帐户B的访问权限,并且帐户B中的IAM用户或角色具有解密密钥的权限。

仅使用存储桶策略还不够,这很重要,IAM用户或角色还必须具有执行S3操作的权限。存储桶策略只是授予另一个帐户执行某项操作的权限,但这并不意味着该帐户中的所有IAM用户和角色都会自动拥有这些权限。

第三点更加微妙,S3对象所有权不是您经常遇到的东西,但是它确实会弄乱权限。帐户只能使用存储桶策略来授予对其拥有的对象的访问权限。假设有第三个帐户C,它在帐户B拥有的存储桶中写入对象。在这种情况下,即使帐户B是存储桶的所有者,帐户C还是对象的所有者,因此无法授予帐户A访问这些对象。

跨帐户S3访问很困难,使用Athena并没有使它变得更容易。您需要进行调试的方法是尝试使用AWS CLI和用于运行查询的凭据来执行列表并获取操作,如果您可以使之正常运行,则可能也可以运行查询。