首页 > 解决方案 > Amazon Athena“打开 Hive 拆分时出错”访问被拒绝错误

问题描述

我正在尝试从 PHP 代码在 Amazon Athena 中运行查询:

    $client = Aws\Athena\AthenaClient::factory(array(
        'version' => 'latest',
        'region' => 'us-east-1',
        'credentials' => array(
            'key' => '<KEY>',
            'secret' => '<SECRET>'
        )
    ));

    $result1 = $client->StartQueryExecution(array(
        'QueryExecutionContext' => array('Database' => 'default'),
        'QueryString' => "select * from logs where date between TIMESTAMP '2020-02-27 00:00:00' and TIMESTAMP '2020-02-27 23:59:59' limit 100",
        'ResultConfiguration' => array(
            'EncryptionConfiguration' => array('EncryptionOption'=> 'SSE_S3'),
            'OutputLocation' => 's3://bucket_name/temp'
        )
    ));

并得到这个错误:

打开 Hive 拆分 s3:///data-mining/logs/2019/07/12/07/Log-6-2019-07-12-07-35-01-a1c6d0a9-27e5-458b-b72a-8942a6d2b261.parquet 时出错(偏移量 = 0,长度 = 756977):com.amazonaws.services.s3.model.AmazonS3Exception:访问被拒绝(服务:Amazon S3;状态代码:403;错误代码:AccessDenied;请求 ID:4A00D465F919D8AB;S3 扩展请求 ID: ...),S3 扩展请求 ID:...(路径:s3://<bucket_name>/data-mining/logs/2019/07/12/07/Log-6-2019-07-12-07- 35-01-a1c6d0a9-27e5-458b-b72a-8942a6d2b261.parquet

我可以确认这些:

  1. 来自 Athena 控制台(使用 root 用户)的相同查询可以毫无问题地运行
  2. 我从具有权限的用户执行查询:AmazonAthenaFullAccessAmazonS3FullAccess

标签: phpamazon-web-servicesamazon-athena

解决方案


确保您使用的 IAM 策略与执行查询的用户关联,该查询允许对与 parquet 文件关联的 KMS 密钥进行操作。即使存储桶可能正在使用 SSE_S3,文件也可能已经使用 KMS 加密。

像这样的政策:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "kms:Decrypt",
                "kms:DescribeKey",
                "kms:GenerateDataKey"
            ],
            "Resource": [
                "arn:aws:kms:"region":"account":key/"keyid"
            ]
        }
    ]
}

推荐阅读