AWS Athena 上的 AccessDenied

leo*_*leo 3 amazon-s3 amazon-web-services amazon-athena

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

查询是:

select * from sensor.sensordata
Run Code Online (Sandbox Code Playgroud)

架构是:

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/';
Run Code Online (Sandbox Code Playgroud)

我得到的错误(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)
Run Code Online (Sandbox Code Playgroud)

然而,我什至向所有人公开了存储桶策略:

{
  "Version": "2008-10-17",
  "Statement": [
    {
        "Effect": "Allow",
        "Principal": "*",
        "Action": [
            "s3:PutObject",
            "s3:GetObject"
        ],
        "Resource": [
            "arn:aws:s3:::mybucket/*",
            "arn:aws:s3:::mybucket"
        ]
    }
  ]
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

Joh*_*ein 8

您没有向我们展示您的表定义,但我怀疑 Athena 想要列出路径的内容以发现存在哪些文件,以便它可以读取它们。

该策略只授予 Put 和 Get 对象的权限,不授予列出存储桶的权限。尝试添加ListBucket权限。

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


leo*_*leo 1

一般来说,问题不是 AWS Athena,而是我将文件上传到 S3 的方式

\n

我确实从 IoT 设备上传数据,并通过匿名 PUT 请求执行此操作。这可能不是很安全,但对于我的用例来说,it\xe2\x80\x99s OK。但正如约翰·罗滕斯坦(John Rotenstein)在对该问题的评论中所写的那样,如果您不设置bucket-owner-full-access上传,Athena 将无法访问这些文件。

\n

不幸的是,据我所知,你只能在客户端修复这个问题。在 AWS 方面,您可以强制客户端这样做(另请参阅/sf/answers/3528203241/上的 John)上的 John ),但不能在 aws 端更改它。

\n

简而言之:如果您要使用 HTTP 匿名上传到 S3,则必须设置bucket-owner-full-access,否则无论您使用什么 ACL 设置,AWS Athena 都无法访问数据。

\n