使用AWS re:Post即您表示您同意 AWS re:Post 使用条款

如何解决在 Amazon Athena 中运行查询时出现的 “访问被拒绝” 权限错误?

3 分钟阅读
0

当我运行 Amazon Athena 查询时,我收到 “访问被拒绝” 错误。

简短描述

**“访问被拒绝”**查询错误通常与 Athena 交互的其他 AWS 服务或 AWS 账户的权限问题有关。常与 Athena 交互的服务示例包括 AWS Identity and Access Management ( AWS IAM)、Amazon Simple Storage Service (Amazon S3) 和 AWS Key Management Service (AWS KMS)。

以下原因可能会导致**“访问被拒绝”**错误:

  • AWS Glue Data Catalog 策略不允许访问 IAM 实体(用户或角色)。
  • IAM 实体无权读取 S3 源数据存储桶或将结果写入查询结果存储桶。
  • 当 Athena 表和存储桶位于不同的账户时,S3 存储桶策略不允许向 IAM 实体提供所需的权限。
  • 对象所有者与 Amazon S3 存储桶所有者不同。
  • 您无权访问用于读取或写入加密数据的 AWS KMS 密钥。

解决方法

要排查**“访问被拒绝”**错误,请确认用例的以下权限。有关更多信息,请参阅在 Athena 中进行故障排除

**注意:**如果在运行 AWS 命令行界面(AWS CLI)命令时收到错误,请参阅排查 AWS CLI 错误。此外,确保您使用的是最新版本的 AWS CLI

检查 Glue Data Catalog 策略是否允许访问 IAM 实体

如果使用了 Glue Data Catalog 策略,请确保该策略允许访问 IAM 实体。例如,如果 Data Catalog 中有以下策略,则 athena\ _user IAM 实体会被拒绝访问 Data Catalog:

{  "Version": "2012-10-17",
  "Statement": [
    {
      "Principal": {
        "AWS": [
          "arn:aws:iam::1111222233334444:user/athena_user"
        ]
      },
      "Effect": "Deny",
      "Action": [
        "glue:*"
      ],
      "Resource": [
        "arn:aws:glue:us-east-1:1111222233334444:*"
      ]
    }
  ]
}

有关策略示例,请参阅 Resource-based policy examples for AWS Glue

当前面的策略位于 Data Catalog 中时,用户运行的 Athena 查询可能会失败,并显示以下错误响应:

"Insufficient permissions to execute the query.User: arn:aws:iam:: 1111222233334444:user/athena_user is not authorized to perform: glue:GetTable on resource: arn:aws:glue:us-east-1:1111222233334444:database/doc_example_database with an explicit deny Query Id: example_query_ID"

确保运行查询的 IAM 实体具有访问 AWS Glue 资源所需的权限。有关所需的 AWS Glue 权限的完整列表,请参阅 AWS 托管策略: AmazonAthenaFullAccess

确保 Data Catalog 资源策略不会拒绝所需的 AWS Glue 操作。有关更多信息,请参阅针对 AWS Glue Data Catalog 中数据库和表的精细访问权限

检查 IAM 实体是否具有访问源数据存储桶和查询结果存储桶所需的权限

当您无权访问源数据存储桶时,会收到与以下内容类似的错误响应:

"Your query has the following errors:com.amazonaws.services.s3.model.AmazonS3Exception: Access Denied (Service: Amazon S3; Status Code: 403; Error Code: AccessDenied; Request ID: 72VA5FB0ASWCQFPD; S3 Extended Request ID: cykX1CZ/KfxpL/h8/DOQoCBJ88qFGYqt6J52Jqh87qBfyN8c2P2azRiYjjJE1HL7i0Mg9xxxxxx=; Proxy: null), S3 Extended Request ID: cykX1CZ/KfxpL/h8/DOQoCBJ88qFGYqt6J52Jqh87qBfyN8c2P2azRiYjjJE1HL7i0Mg9xxxxxx= (Path: s3://my-athena-source-bucket/athena_data.csv)"

当您无权访问查询结果存储桶时,会收到与以下内容类似的错误响应:

"Your query has the following errors:Access denied when writing output to url: s3://my-athena-result-bucket/Unsaved/2021/05/07/example_query_ID.csv .Please ensure you are allowed to access the S3 bucket.If you are encrypting query results with KMS key, please ensure you are allowed to access your KMS key"

运行查询的 IAM 实体必须具有访问源数据存储桶和查询结果存储桶的权限。要为 IAM 实体授予所需的权限,请将 IAM 策略附加到 IAM 实体。

IAM 策略示例:

{  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "s3:ListBucket"
      ],
      "Resource": [
        "arn:aws:s3:::my-athena-source-bucket"
      ]
    },
    {
      "Effect": "Allow",
      "Action": [
        "s3:GetObject"
      ],
      "Resource": [
        "arn:aws:s3:::my-athena-source-bucket/data/*"
      ]
    },
    {
      "Effect": "Allow",
      "Action": [
        "s3:GetBucketLocation",
        "s3:GetObject",
        "s3:ListBucket",
        "s3:ListBucketMultipartUploads",
        "s3:AbortMultipartUpload",
        "s3:PutObject",
        "s3:ListMultipartUploadParts"
      ],
      "Resource": [
        "arn:aws:s3:::my-athena-result-bucket",
        "arn:aws:s3:::my-athena-result-bucket/*"
      ]
    }
  ]
}

替换前面策略中的以下变量:

  • my-athena-source-bucket 替换为源数据存储桶名称
  • my-athena-source-bucket/data/ 替换为源数据位置
  • my-athena-source-bucket/data/ 替换为查询结果存储桶名称

有关策略的完整列表,请参阅 Amazon Athena 的 AWS 托管策略

将 Amazon S3 存储桶策略附加至跨账户查询所需的权限

如果您的 Athena 表和 S3 存储桶位于同一个账户中,则无需附加 S3 存储桶策略。但是,如果已经附加了存储桶策略,请检查该策略是否向查询数据的 IAM 实体授予了 S3 权限。

如果您的 Athena 表和 S3 存储桶位于不同的账户中,请附加 S3 存储桶策略,授予对 IAM 实体访问权限。

在拥有 S3 存储桶的账户中,附加 S3 存储桶策略,向其他账户中的 athena\ _user 授予访问权限。以下示例策略明确允许账户 A 中的 IAM 用户访问账户 B 中的 my-athena-source-bucket S3 存储桶:

{  "Version": "2012-10-17",
  "Id": "Policy1620692934647",
  "Statement": [
    {
      "Sid": "Stmt1620692932186",
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::1111222233334444:user/athena_user"
      },
      "Action": [
        "s3:*"
      ],
      "Resource": [
        "arn:aws:s3:::my-athena-source-bucket",
        "arn:aws:s3:::my-athena-source-bucket/data/*"
      ]
    }
  ]
}

替换前面示例策略中的以下变量:

  • my-athena-source-bucket 替换为源数据存储桶名称
  • my-athena-source-bucket/data/ 替换为源数据位置
  • 1111222233334444 替换为 IAM 用户账户(账户 A)的 ID
  • athena_user 替换为 IAM 用户(账户 A)的名称

要向其他账户中的所有用户授予对存储桶的访问权限,请将 Principal 密钥替换为指定 root 的密钥 ("arn:aws:iam::1111222233334444:root")。

**注意:**前面的策略允许对 my-athena-source-bucket 执行所有 S3 操作。会根据 S3 存储桶是源存储桶还是查询结果存储桶更新 S3 操作。有关更多信息,请参阅跨账户存取存储桶对象

确认 S3 存储桶策略不包含明确拒绝访问账户 A 或其 IAM 用户的语句。另外,请确保您的策略不包含可能拒绝请求的条件。有关更多信息,请参阅如何对来自 Amazon S3 的 403 访问被拒绝错误执行故障排查?

更新 AWS KMS 密钥策略

如果源数据已加密,或者 Athena 查询使用 AWS KMS 密钥写入加密结果,请确认以下权限:

  • IAM 用户的策略允许进行必要的 AWS KMS 操作。
  • AWS KMS 密钥策略允许访问用户。

以下示例 AWS KMS 密钥策略允许账户 1111222233334444 中的所有用户执行所有 AWS KMS 操作:

{  "Sid": "Enable IAM policies",
  "Effect": "Allow",
  "Principal": {
    "AWS": "arn:aws:iam::1111222233334444:root"
   },
  "Action": "kms:*",
  "Resource": "*"
}

**注意:**在前面的策略中,请将示例变量替换为您的变量。

有关更多信息,请参阅 Key policies in AWS KMSAmazon S3 中加密数据的权限

确保 S3 存储桶所有者有权访问对象

默认情况下,将 S3 对象上传到存储桶的账户拥有该对象。即使另一个账户拥有该存储桶,也是如此。如果其他账户的用户可以将对象上传到您的存储桶,请检查您的用户无法访问的对象所属的账户。运行 GetObjectAcl 命令可检查对象的所有者。

如果 S3 存储桶所有者和对象所有者不同,则对象所有者可以授予您对该对象的完全控制权。为此,对象所有者会使用 bucket-owner-full-control 参数运行 PutObjectAcl 命令。

要将对象的所有权更改为拥有 S3 存储桶的账户,请运行 AWS CLI cp 命令。确保从存储桶的账户运行 cp 命令,复制并覆盖对象。

有关更多信息,请参阅为何我无法访问由其他 AWS 账户上载到我的 Amazon S3 存储桶的对象?

相关信息

Athena 中的 Identity and Access Management

AWS 官方
AWS 官方已更新 10 个月前