查询Athena表的问题,其中源存储桶来自不同的帐户

时间:2017-07-25 11:26:07

标签: amazon-s3 amazon-athena

我为S3存储桶中不属于我帐户的文件创建了Athena表。 这些表是分区的,当我运行MSCK REPAIR TABLE命令时,它成功并显示不在Metastore中的分区。但是,当我查询表时,它会给出以下错误

“您的查询有以下错误:

执行查询的权限不足。

此查询针对“......”数据库运行,除非查询限定。请在我们的论坛上发布错误消息或通过查询ID联系客户支持:...........“

这可能是什么问题?

3 个答案:

答案 0 :(得分:0)

您所描述的问题是由错误设置的访问策略引起的。我猜,Athena帐户具有listBucket权限,但不是getObject

作为示例,我使用以下存储桶策略来测试跨账户访问。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Action": [
        "s3:GetObject",
        "s3:ListBucket"
      ],
      "Effect": "Allow",
      "Resource": ["arn:aws:s3:::bucketname","arn:aws:s3:::bucketname/*"],
      "Principal": "*"
    }
  ]
}

请更改该样本中的主体,否则您的数据将在整个互联网上公开。

答案 1 :(得分:0)

我遇到了类似的问题,结果表明我的表是使用AWS Glue创建的。向Glue添加权限解决了这个问题。

答案 2 :(得分:0)

即使我遇到了同样的问题,但有时问题是政策传播需要时间,具体取决于您的服务所在的不同区域。

  • 提供" *" Principal的值可能不是一个好主意,因为这将使您的存储桶全局可访问。
  • 然后将所有s3权限授予其他AWS账户。
  • 现在,由于我们已授予对另一个帐户的root访问权限,因此Athena是一个内部服务,可以进行必要的连接。
  • 为了说清楚,您只需要将桶名称放在同一个AWS账户中,而不需要担心该位置。

以下是我所指的政策样本示例:

{ "Version": "2012-10-17", "Statement": [ { "Sid": "Corss-Account-Permissions", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::AWS-ACCOUNT-ID:root" }, "Action": "s3:*", "Resource": [ "arn:aws:s3:::example-bucket", "arn:aws:s3:::example-bucket/*" ] } ] }