【问题标题】:Issues querying Athena table where source bucket is from a different account查询源存储桶来自不同账户的 Athena 表时出现问题
【发布时间】:2017-07-25 11:26:07
【问题描述】:

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

“您的查询有以下错误:

执行查询的权限不足。

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

这可能是什么问题?

【问题讨论】:

    标签: amazon-s3 amazon-athena


    【解决方案1】:

    您描述的问题是由错误设置的访问策略引起的。我猜想,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": "*"
        }
      ]
    }
    

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

    【讨论】:

    • 我正在查看源 AWS 账户的存储桶权限。在公共访问下,我可以看到授予“任何 AWS 用户”的列表对象、写入对象、读取存储桶权限、写入存储桶权限。这还不够吗?但是,“其他 AWS 账户的访问权限”下没有添加任何账户。
    • 对我来说,在控制台中向任何用户添加 READ 访问权限都不起作用。我必须明确使用存储桶策略才能使其运行。
    【解决方案2】:

    我遇到了类似的问题,原来我的表是使用 AWS Glue 创建的。为 Glue 添加权限解决了这个问题。

    【讨论】:

      【解决方案3】:

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

      • 提供 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/*" ] } ] }

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-11-28
        • 2019-08-26
        • 2020-02-12
        • 2021-03-28
        • 1970-01-01
        相关资源
        最近更新 更多