当我在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无法读取文件。但是可以列出它们,每个文件都会出现错误。
我该怎么做才能使查询正常工作?
答案 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
。PutObject
和GetObject
适用于s3中的对象,而不是 buckets ,因此资源"arn:aws:s3:::mybucket"
不需要这些权限Permission Boundaries
,请确保这不限制对存储桶的访问。在使用自定义存储桶位置的同时使用Quicksight策略作为权限边界时,我犯了一个错误,并且权限边界使我的其他S3策略无法正常工作。