尽管权限=允许全部,但来自Athena的S3存储桶拒绝访问

时间:2017-06-26 12:36:26

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

我按照教程http://docs.aws.amazon.com/athena/latest/ug/connect-with-jdbc.html进行了操作。我设置了一个IAM用户(具有奇怪的权限)和一个S3-bucket,可以查询样本Athena表,并将输出写入我的S3-bucket。 现在我有来自客户端的凭据来访问他的Athena表。这不起作用,我得到以下错误:

  

将输出写入url时拒绝访问:   s3://my-test-bucket/b36-f3c0-482-a225-34d63d355.txt。请确保   您可以访问S3存储桶。如果您正在加密查询   使用KMS密钥的结果,请确保您可以访问您的KMS   键

我的S3-bucket是公共的。 "任何经过身份验证的AWS用户的权限" :读,写。 "每个人"的权限:读,写。 "日志传送的权限" :读,写。 "权限访问"为了一切:读,写

Bucket Policy允许每个人都做任何事情。

{
 "Version": "2012-10-17",
 "Statement": [
     {
         "Effect": "Allow",
         "Principal": "*",
         "Action": "s3:ListBucket",
         "Resource": "arn:aws:s3:::my-test-bucket"
     },
     {
         "Effect": "Allow",
         "Principal": "*",
         "Action": [
             "s3:PutObject",
             "s3:GetObject",
             "s3:DeleteObject"
         ],
         "Resource": "arn:aws:s3:::my-test-bucket/*"
     },
     {
         "Sid": "AddPerm",
         "Effect": "Allow",
         "Principal": "*",
         "Action": [
             "s3:GetObject",
             "s3:PutObject"
         ],
         "Resource": "arn:aws:s3:::my-test-bucket/*"
     }
 ] }

CORS配置:

 <?xml version="1.0" encoding="UTF-8"?> <CORSConfiguration
 xmlns="http://s3.amazonaws.com/doc/2006-03-01/"> <CORSRule>
     <AllowedOrigin>*</AllowedOrigin>
     <AllowedMethod>PUT</AllowedMethod>
     <AllowedMethod>POST</AllowedMethod>
     <AllowedMethod>DELETE</AllowedMethod>
     <AllowedHeader>*</AllowedHeader> </CORSRule> </CORSConfiguration>

仍然,我收到错误:将输出写入url时拒绝访问...

编辑:我不时会收到其他错误:&#34;无法验证/创建输出存储桶my-test-bucket&#34;。不知道为什么我会遇到不同的错误。

我该怎么办?

1 个答案:

答案 0 :(得分:0)

与s3上的特定文件有类似的问题。我无法读取该文件。通过使用mv命令和--acl参数更改文件的访问权限来解决此问题。尝试访问名为data.jsonlines的文件时出现ACCESS DENIED错误。通过运行以下命令解决它:

注意:您需要安装AWS CLI$ pip install --upgrade --user awscli

aws s3 cp s3://<s3 bucket name>/path/to/file/data.jsonlines  s3://cfa-opengazettes-ke/gazettes/data_copy.jsonlines 

aws s3 mv --acl public-read s3://<s3 bucket name>/path/to/file/data_copy.jsonlines s3://cfa-opengazettes-ke/gazettes/data.jsonlines

或者您可以通过运行合并

aws s3 cp s3://<s3 bucket name>/path/to/file/data_out.jsonlines  s3://cfa-opengazettes-ke/gazettes/data_out2.jsonlines && aws s3 mv --acl public-read s3://cfa-opengazettes-ke/gazettes/data_out2.jsonlines s3://<s3 bucket name>/path/to/file/data_out.jsonlines

这些命令执行以下步骤:

  • 复制:s3://<s3 bucket name>/path/to/file/data.jsonliness3://c<s3 bucket name>/path/to/file/data_copy.jsonlines

  • 移动:s3://<s3 bucket name>/path/to/file/data_copy.jsonliness3://cfa-opengazettes-ke/path/to/file/data.jsonlines

基本上,它会创建文件的副本,然后在移动过程中删除它,同时更改文件的权限。

请注意--acl选项和参数public-read。也许以下权限之一可能适合您。您可以使用其他权限替换public-read。来自documentation

  

- acl(string)设置执行命令时对象的ACL。如果您使用此参数,您必须具有   “s3:PutObjectAcl”权限包含在您的操作列表中   IAM政策。仅接受私有公开阅读的值,    public-read-write authenticated-read aws-exec-read ,   存储桶拥有者阅读存储桶拥有者完全控制日志传递 - 写入

AWS page

提供了一些更有用的信息