我在 Amazon Athena 中執行查詢時,為什麼會收到「拒絕存取」的錯誤訊息?

3 分的閱讀內容
0

我執行 Amazon Athena 查詢時,我收到「拒絕存取」的錯誤訊息。

簡短說明

下列原因會導致您收到「拒絕存取」的錯誤訊息:

  • AWS Identity and Access Management (IAM) 使用者沒有下列一或多個權限:
  • 讀取來源資料儲存貯體。
  • 將結果寫入查詢結果儲存貯體。
  • Amazon Simple Storage Service (Amazon S3) 儲存貯體政策不允許授予 IAM 使用者必要的權限。
  • 物件擁有者與 Amazon S3 儲存貯體擁有者不同。
  • 您無法存取用於讀取或寫入加密資料的 AWS Key Management Service (AWS KMS) 金鑰。
  • AWS Glue Data Catalog 政策不允許授予 IAM 使用者存取權限。

解決方法

要疑難排解「拒絕存取」的錯誤訊息,請確認下列事項。如需詳細資訊,請參閱在 Athena 中疑難排解

請確定 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 儲存貯體政策。但是,如果您確實有 S3 儲存貯體政策,請確定它們會授予 IAM 使用者/角色必要的 S3 動作。如果您的 Athena 表格和 S3 儲存貯體位於不同的帳戶中,則須附加授予 IAM 使用者必要存取權的 S3 儲存貯體政策。

您可以在帳戶 B 中附加類似於下列內容的 S3 儲存貯體政策,以授予帳戶 A 中的 IAM 使用者 athena_user 存取權限。此範例政策明確允許 IAM 使用者存取帳戶 B 中的 S3 儲存貯體 my-athena-source-bucket

{
  "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/
  • 帳戶 A 的帳戶 ID 取代 1111222233334444
  • 帳戶 A 中的 IAM 使用者名稱取代 athena_user

要授予帳戶 A 中的所有使用者儲存貯體的存取權限,請使用指定的金鑰取代主要金鑰。例如「arn:aws:iam::1111222233334444:root」。

注意:此政策允許 my-athena-source-bucket 的所有 S3 動作。您可以根據 S3 儲存貯體是否是來源儲存貯體或查詢結果儲存貯體以更新 S3 動作。如需詳細資訊,請參閱 Athena 至 Amazon S3 儲存貯體中的跨帳戶存取權限中的儲存貯體政策或 IAM 使用者政策一節。

確認 S3 儲存貯體政策不包括明確拒絕存取帳戶 A 或其 IAM 使用者的陳述式。另請確定您的政策不包括可能拒絕請求的條件。如需詳細資訊,請參閱如何疑難排解 Amazon S3 的「403 拒絕存取」錯誤? 要定義 S3 儲存貯體的最低權限,請參閱如何定義由 AWS 服務呼叫之動作的最低權限

更新您的 AWS KMS 金鑰政策

如果您的來源資料已加密,或者您的 Athena 查詢使用 AWS KMS 金鑰寫入加密結果,請確定下列項目:

  • IAM 使用者的政策允許必要的 AWS KMS 動作。
  • AWS KMS 金鑰政策允許使用者的存取權限。

以下範例為允許帳戶 ID 1111222233334444 中所有使用者執行所有 AWS KMS 動作的 AWS KMS 金鑰政策:

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

請務必根據您的使用案例以更新此政策。如需詳細資訊,請參閱 AWS KMS 中的金鑰政策Amazon S3 中加密資料的權限

請確定 S3 儲存貯體擁有者可存取物件

預設情況下,S3 物件由上傳該物件的 AWS 帳戶擁有。即使儲存貯體由另一個帳戶擁有,也是如此。如果其他帳戶可以將物件上傳至您的儲存貯體,請確認您的使用者無法存取擁有物件的帳戶。您可以執行 GetObjectAcl 命令以檢查物件擁有者。

如果 S3 儲存貯體擁有者與物件擁有者不同,則物件擁有者可授予您完整的物件控制權。物件擁有者可以執行帶 bucket-owner-full-control 參數的 PutObjectAcl 命令以完成此動作。要將物件擁有權變更為擁有 S3 儲存貯體的帳戶,請從儲存貯體的帳戶中執行 AWS Command Line Interface (AWS CLI) 命令 cp,以將物件複製到自己的帳戶。

**注意:**如果您在執行 AWS CLI 命令時收到錯誤訊息,請確認您使用最新版本的 AWS CLI

如需詳細資訊,請參閱為什麼我無法存取由另一個 AWS 帳戶上傳至 Amazon S3 儲存貯體的物件?

確認 AWS Glue Data Catalog 政策允許授予 IAM 使用者/角色存取權限

如果您有現有的 AWS Glue Data Catalog 政策,請確定該政策允許授予 IAM 使用者/角色存取權限。例如,如果您在 Data Catalog 中有下列政策,即會拒絕 IAM 使用者 athena_user 存取 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:*"
      ]
    }
  ]
}

如需範例政策,請參閱 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 權限的清單,請參閱 AmazonAthenaFullAccess 受管政策。請確定 Data Catalog 資源政策不會拒絕必要的 AWS Glue 動作。如需詳細資訊,請參閱 AWS Glue Data Catalog 中資料庫和表格的精細分級存取


相關資訊

Athena 中的身分和存取管理

AWS 官方
AWS 官方已更新 2 年前