AWS Athena上的AccessDenied

时间:2019-06-26 06:11:55

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

当我在AWS Athena上运行简单的select *查询时,出现访问被拒绝错误。

查询为:

select * from sensor.sensordata

模式为:

CREATE EXTERNAL TABLE sensor.sensordata (
  sig string,
  `data` struct<`iat`:timestamp,
  `sub`:string,
  tMax: float,
  tMin: float,
  `tAvg`: float,
  `hAvg`: float,
  hMin: float,
  hMax: float
  >
) 
ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe'
LOCATION 's3://mybucket/data/';

我得到的错误(ID缩短了)是无法读取文件:

com.amazonaws.services.s3.model.AmazonS3Exception: 
Access Denied (Service: Amazon S3; Status Code: 403; Error Code: AccessDenied; 
Request ID: B0048904...; S3 Extended Request ID: CKchfW8...), S3 Extended Request ID: 
CKchfW8... (Path: s3://mybucket/data/sensor=01235EFD886C7DF1EE/t=1561513414.json)

但是我什至向所有人公开了存储桶策略:

{
  "Version": "2008-10-17",
  "Statement": [
    {
        "Effect": "Allow",
        "Principal": "*",
        "Action": [
            "s3:PutObject",
            "s3:GetObject"
        ],
        "Resource": [
            "arn:aws:s3:::mybucket/*",
            "arn:aws:s3:::mybucket"
        ]
    }
  ]
}

除了存储桶策略外,我在ACL中还具有对存储桶所有者的标准完全访问权限,这是我从中运行Athena查询的同一帐户。我在AWS管理控制台中运行查询。

不确定是否相关:AWS Glue Crawler无法读取文件。但是可以列出它们,每个文件都会出现错误。

我该怎么做才能使查询正常工作?

3 个答案:

答案 0 :(得分:2)

您没有向我们显示您的表定义,但是我怀疑Athena希望列出路径内容以发现存在的文件,以便它可以读取它们。

该策略仅授予“放置”和“获取”对象的权限,而不授予列出存储桶的权限。尝试添加ListBucket权限。

顺便说一句,使用这样的存储桶策略是一个“非常糟糕的主意”,因为您要公开内容。而是应将权限分配给调用Athena的凭据(例如IAM用户)。这样,存储桶就不会公开。

答案 1 :(得分:1)

您的策略缺少对ListBucket的访问权限,这是Athena在get / put对象之前列出存储桶中的内容所必需的。

以下政策应能奏效。

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

答案 2 :(得分:0)

AWS Athena docs指向此示例托管策略AWSQuicksightAthenaAccess,以显示SQL客户端和BI工具所需的所有权限。它适用于AWS QuickSight,但权限也适用于其他工具。

专门针对S3权限,它具有以下功能:

{
  Version": "2012-10-17",
  "Statement": [
    {
        "Effect": "Allow",
        "Action": [
            "s3:GetBucketLocation",
            "s3:GetObject",
            "s3:ListBucket",
            "s3:ListBucketMultipartUploads",
            "s3:ListMultipartUploadParts",
            "s3:AbortMultipartUpload",
            "s3:CreateBucket",
            "s3:PutObject"
        ],
        "Resource": [
            "arn:aws:s3:::aws-athena-query-results-*"
        ]
    }
  ]
}

该策略中的资源是S3 ARN模式,该模式将匹配用作Athena查询结果默认位置的所有存储桶。如果您更改了默认位置存储桶,则应对该存储桶应用类似的权限。

注释

  • 在附加到组/用户的策略中,您不需要Principal
  • 动作PutObjectGetObject适用于s3中的对象,而不是 buckets ,因此资源"arn:aws:s3:::mybucket"不需要这些权限
  • Quicksight托管策略使用的模式将同时包含存储桶和其中的所有对象,因此它将存储桶对象操作混合在一起,这是可行的,但不是很具体。
  • 如果您对IAM组/用户使用Permission Boundaries,请确保这不限制对存储桶的访问。在使用自定义存储桶位置的同时使用Quicksight策略作为权限边界时,我犯了一个错误,并且权限边界使我的其他S3策略无法正常工作。