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 无法读取文件。但是可以列出它们,我收到每个文件的错误。
我该怎么做才能使查询工作?
您没有向我们展示您的表定义,但我怀疑 Athena 想要列出路径的内容以发现存在哪些文件,以便它可以读取它们。
该策略只授予 Put 和 Get 对象的权限,不授予列出存储桶的权限。尝试添加ListBucket权限。
顺便说一句,使用这样的存储桶策略是一个“非常糟糕的主意”,因为您要公开您的内容。相反,应将权限分配给调用 Athena 的凭证(例如 IAM 用户)。这样,存储桶就不是公开的。
一般来说,问题不是 AWS Athena,而是我将文件上传到 S3 的方式
\n我确实从 IoT 设备上传数据,并通过匿名 PUT 请求执行此操作。这可能不是很安全,但对于我的用例来说,it\xe2\x80\x99s OK。但正如约翰·罗滕斯坦(John Rotenstein)在对该问题的评论中所写的那样,如果您不设置bucket-owner-full-access上传,Athena 将无法访问这些文件。
不幸的是,据我所知,你只能在客户端修复这个问题。在 AWS 方面,您可以强制客户端这样做(另请参阅/sf/answers/3528203241/上的 John)上的 John ),但不能在 aws 端更改它。
\n简而言之:如果您要使用 HTTP 匿名上传到 S3,则必须设置bucket-owner-full-access,否则无论您使用什么 ACL 设置,AWS Athena 都无法访问数据。
| 归档时间: |
|
| 查看次数: |
6422 次 |
| 最近记录: |