Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Amazon web services 在AWS雅典娜上被拒绝访问_Amazon Web Services_Amazon S3_Amazon Athena - Fatal编程技术网

Amazon web services 在AWS雅典娜上被拒绝访问

Amazon web services 在AWS雅典娜上被拒绝访问,amazon-web-services,amazon-s3,amazon-athena,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`

当我在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/';
然而,我甚至向所有人公开了桶政策:

{
  "Version": "2008-10-17",
  "Statement": [
    {
        "Effect": "Allow",
        "Principal": "*",
        "Action": [
            "s3:PutObject",
            "s3:GetObject"
        ],
        "Resource": [
            "arn:aws:s3:::mybucket/*",
            "arn:aws:s3:::mybucket"
        ]
    }
  ]
}
除了bucket策略之外,我在ACL中还拥有对bucket所有者的标准完全访问权限,这与我运行Athena查询的帐户相同。我在AWS管理控制台中运行查询

不确定是否相关:AWS Glue Crawler无法读取文件。但是如果我能列出它们,我会得到每个文件的一个错误


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

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

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


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

您的策略缺少ListBucket访问,这是Athena在获取/放置对象之前列出存储桶内容所必需的

下面的政策应该有效

{
  "Version": "2008-10-17",
  "Statement": [
    {
        "Effect": "Allow",
        "Principal": "*",
        "Action": [
            "S3:ListBucket",
            "s3:PutObject",
            "s3:GetObject"
        ],
        "Resource": [
            "arn:aws:s3:::mybucket/*",
            "arn:aws:s3:::mybucket"
        ]
    }
  ]
}
指向此示例的托管策略点显示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查询结果默认位置的所有存储桶。如果已更改默认位置存储桶,则应为该存储桶应用类似的权限

笔记
  • 在附加到组/用户的策略中不需要
    主体
  • 操作
    PutObject
    GetObject
    应用于s3中的对象,而不是bucket,因此资源
    “arn:aws:s3:::mybucket”
    不需要这些权限
  • Quicksight管理的策略使用一种模式,该模式将同时包含bucket和其中的所有对象,因此它将bucket和对象操作混合在一起,这是可行的,但不是很具体
  • 如果对IAM组/用户使用
    权限边界
    ,请确保该权限边界不限制对存储桶的访问。我犯了一个错误,即在使用自定义存储桶位置的同时使用Quicksight策略作为权限边界,权限边界使我的附加S3策略无法工作

这是正确的,您需要
s3:ListBucket
权限才能运行Athena查询。非常感谢John。我知道这是个坏主意,只是为了测试。我在ACL中还有一个IAM用户,但这没有帮助。ListBucket是个好主意,但它无助于解决问题。我仍然会犯同样的错误。我把我的问题扩大了一点,希望这能有所帮助。谢谢你,坎南!ListBucket是个好主意,但它无助于解决问题。我仍然会遇到相同的错误。好的,尝试通过aws cli访问存储桶。”aws s3 ls s3://mybucket/data/”。如果访问被拒绝,请在IAM中创建策略并将其附加到您的用户帐户。然后试一试。您能否测试是否可以使用AWS CLI访问该对象?例如,aws s3 cp s3://mybucket/data/sensor=01235EFD886C7DF1EE/t=156513414.json。
此外,这些文件是如何创建的?“我想知道他们是否来自另一个帐户?”约翰罗滕斯坦问得很好!谢谢你的帮助。对于S3CP,我得到“致命错误:调用HeadObject操作时发生错误(403):禁止”(我使用与Athena相同的用户)。这些文件由IoT传感器创建,该传感器在不进行身份验证的情况下执行HTTP推送。我无法更改该对象的权限。我使用的用户是root帐户。因此,您似乎无权访问Amazon S3 bucket中的对象!如果是您的bucket,并且您使用的是root登录,那么唯一的原因就是创建对象时没有
bucket owner完全访问权限。这通常仅当对象是从不同的AWS帐户创建时才会出现问题。如果对象不存在,但您没有访问该对象的权限,则也会发生
拒绝访问
错误。这是一种向不被允许知道的人隐藏文件是否存在的方法。@JohnRotenstein我也有同样的问题,但在我的情况下,在帐户之间复制对象时,我确实将acl设置为bucket owner full control,并且我在对象权限中看到了帐户规范ID,读写权限设置为Yes!但仍然有被禁止的错误。当我手动将文件上传到bucket中的同一路径时,它将使用相同的IAM角色/权限工作!有什么解释吗?可以通过SCP限制吗?@Nisman请创建一个新问题,而不是通过对旧问题的评论提问。
{
  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-*"
        ]
    }
  ]
}