AWS Athena读取外部S3桶



是否可以在Athena中分析来自外部S3 bucket的数据?

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

我也尝试过作为校长使用同样的角色,但这也不起作用。这应该是可行的,因为我发现Athena对S3访问使用和执行查询相同的主体。

我留下了另一个选项,即复制S3内容,但这不是我想要实现的。所有的官方文件都说,通过bucket策略跨账户访问S3 bucket是可能的,但我认为这不起作用。如果有人对此有经验,或者能够测试一下,我将不胜感激。

附言:我已经在这里读到了类似的答案,但没有发现其中任何一个有效。

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

这是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/*"
]
}
]
}

为了跨账户访问S3,必须满足以下条件(账户A拥有存储桶,账户B访问存储桶(:

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

除此之外,运行查询的IAM用户或角色必须具有将结果写入输出位置的权限,输出位置通常是与数据存储桶分离的存储桶。

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

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

第三点更微妙,S3对象所有权不是你经常遇到的事情,但它确实会扰乱权限。帐户只能使用bucket策略来授予对其拥有的对象的访问权限。假设有第三个帐户C,它在帐户B拥有的bucket中写入对象。在这种情况下,帐户C是对象的所有者,即使帐户B是bucket的所有者,因此不能授予帐户a访问这些对象的权限。

跨账户S3访问很困难,使用Athena并没有让访问变得更容易。调试此操作所需的方法是尝试使用AWS CLI和运行查询所需的凭据执行列表和获取操作,如果您能做到这一点,您可能也可以运行查询。

最新更新