6

我正在尝试使用 python 对 Athena 执行查询。

示例代码

   client = boto3.client(
        'athena', 
        region_name=region,
        aws_access_key_id=AWS_ACCESS_KEY_ID,
        aws_secret_access_key=AWS_SECRET_ACCESS_KEY
    )
    execution = client.start_query_execution(
        QueryString=query,
        QueryExecutionContext={
            'Database': database
        },
        WorkGroup=workgroup,
        ResultConfiguration={
            'OutputLocation': S3_OUTPUT_LOCATION
        }
    )

这是工作代码,但我遇到了一个不寻常的情况。

  • 有一天它会抛出一个 InvalidRequestException 错误 Error
InvalidRequestException: An error occurred (InvalidRequestException) when calling the StartQueryExecution operation: Unable to verify/create output bucket <BUCKET NAME>
  • 根据 DevOps 应用程序拥有所有权限,它应该可以工作。
  • 我们尝试在 AWS Athena 控制台(查询编辑器)上执行相同的查询。它在那里工作。
  • 然后我们重新运行python脚本,它没有抛出任何错误。
  • 但是在第二天,python 脚本开始抛出同样的 InvalidRequestException 错误。
  • 然后我们在 AWS Athena 控制台(查询编辑器)上执行相同的查询并重新运行 python 脚本,它开始工作。

我们观察了几天这种情况,每 24 小时 python 脚本抛出错误,然后我们在 Athena 控制台(查询编辑器)上执行查询并重新运行 python 脚本。我不明白为什么会这样,是否有任何权限问题。

权限:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": [
                "s3:GetObject",
                "athena:GetWorkGroup",
                "athena:StartQueryExecution",
                "athena:ListDatabases",
                "athena:StopQueryExecution",
                "athena:GetQueryExecution",
                "athena:GetQueryResults",
                "athena:GetDatabase",
                "athena:GetDataCatalog",
                "athena:ListQueryExecutions",
                "s3:ListBucket"
            ],
            "Resource": [
                "arn:aws:s3:::<BUCKET NAME>",
                "arn:aws:s3:::<BUCKET NAME>/*",
            ]
        },
        {
            "Sid": "VisualEditor1",
            "Effect": "Allow",
            "Action": [
                "s3:PutObject",
                "s3:GetObject",
                "s3:ListBucket",
                "athena:UpdateWorkGroup",
            ],
            "Resource": [
                "arn:aws:s3:::<BUCKET NAME>/*",
                "arn:aws:s3:::<BUCKET NAME>",
                "arn:aws:athena:*:<BUCKET NAME>/<PATH>",
            ]
        },
        {
            "Sid": "VisualEditor2",
            "Effect": "Allow",
            "Action": [
                "athena:ListDataCatalogs",
                "s3:ListAllMyBuckets"
            ],
            "Resource": "*"
        }
    ]
}
4

2 回答 2

3

我遇到了同样的问题 - 随机失败。问题原来是s3:GetBucketLocation策略配置错误。它与资源指向 s3 存储桶的其他 s3 操作(包括路径)捆绑在同一个集群中。它不能以这种方式工作。

我将其修复如下,现在可以使用。

- Effect: Allow
  Action:
    - s3:GetBucketLocation
  Resource:
    - arn:aws:s3:::*
- Effect: Allow
  Action:
    - s3:PutObject
    - s3:GetObject
  Resource:
    - arn:aws:s3:::<BUCKET NAME>/<PATH>/*

请参阅文档:https ://docs.aws.amazon.com/AmazonS3/latest/userguide/using-with-s3-actions.html

于 2021-09-16T09:37:53.030 回答
3

我今天也遇到了同样的错误,发现执行角色也需要s3:GetBucketLocation权限,AWS 文档:https ://aws.amazon.com/premiumsupport/knowledge-center/athena-output-bucket-error/

于 2021-05-24T16:06:18.227 回答