是否可以分析雅典娜外部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/*"
]
}
]
}
答案 0 :(得分:0)
要使跨帐户访问S3正常工作,必须满足以下条件(帐户A拥有存储桶,帐户B是访问存储桶的帐户):
此外,要使其与Athena配合使用,运行查询的IAM用户或角色还必须具有将结果写入输出位置的权限,该位置通常是与包含数据的存储区分开的存储区。
如果对象是用KMS加密的,则需要帐户A中的另一组策略才能授予对帐户B的访问权限,并且帐户B中的IAM用户或角色具有解密密钥的权限。
仅使用存储桶策略还不够,这很重要,IAM用户或角色还必须具有执行S3操作的权限。存储桶策略只是授予另一个帐户执行某项操作的权限,但这并不意味着该帐户中的所有IAM用户和角色都会自动拥有这些权限。
第三点更加微妙,S3对象所有权不是您经常遇到的东西,但是它确实会弄乱权限。帐户只能使用存储桶策略来授予对其拥有的对象的访问权限。假设有第三个帐户C,它在帐户B拥有的存储桶中写入对象。在这种情况下,即使帐户B是存储桶的所有者,帐户C还是对象的所有者,因此无法授予帐户A访问这些对象。
跨帐户S3访问很困难,使用Athena并没有使它变得更容易。您需要进行调试的方法是尝试使用AWS CLI和用于运行查询的凭据来执行列表并获取操作,如果您可以使之正常运行,则可能也可以运行查询。>