如何解決在 Amazon Athena 中執行查詢時遇到的「存取遭拒」權限錯誤?

3 分的閱讀內容
0

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

簡短描述

存取遭拒查詢錯誤通常與 Athena 與之互動的其他 AWS 服務或 AWS 帳戶的權限問題有關。Athena 通常與其互動的服務範例包括 AWS Identity and Access Management (IAM)、Amazon Simple Storage Service (Amazon S3) 及 AWS Key Management Service (KMS)。

下列原因可能會導致存取遭拒錯誤:

  • AWS Glue Data Catalog 政策不允許存取 IAM 實體 (使用者或角色)。
  • IAM 實體沒有讀取 S3 來源資料儲存貯體或將結果寫入查詢結果儲存貯體的權限。
  • 當 Athena 資料表和儲存貯體位於不同帳戶時,S3 儲存貯體政策不允許為 IAM 實體提供所需的權限。
  • 物件擁有者與 Amazon S3 儲存貯體擁有者不同。
  • 您無法存取用於讀取或寫入加密資料的 AWS KMS 金鑰。

解決方法

若要對存取被拒錯誤進行疑難排解,請確認您的使用案例的權限。如需詳細資訊,請參閱在 Athena 中疑難排解

**注意:**如果您在執行 AWS Command Line Interface (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:*"
      ]
    }
  ]
}

如需範例政策,請參閱 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;狀態代碼: 403;錯誤代碼: 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 實體。

如果您的 Athena 表格和 S3 儲存貯體位於不同的帳戶中,則須附加授予 IAM 實體存取權的 S3 儲存貯體政策。

在具有 S3 儲存貯體的帳戶中,附加授予其他帳戶中 athena\ _user 存取權的 S3 儲存貯體政策。下列範例政策明確允許帳戶 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/
  • IAM 使用者帳戶 (帳戶 A) 的 ID 取代 1111222233334444
  • IAM 使用者 (帳戶 A) 的名稱取代 athena_user

若要授予其他帳戶中的所有使用者存取儲存貯體,請用指定權限的金鑰取代主體金鑰 ("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": "*"
}

**注意:**在上述政策中,用您的變數取代範例變數。

如需詳細資訊,請參閱 AWS KMS 中的金鑰政策Amazon S3 中加密資料的權限

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

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

如果 S3 儲存貯體擁有者與物件擁有者不同,則物件擁有者可授予您完整的物件控制權。為此,物件擁有者需執行帶 bucket-owner-full-control 參數的 PutObjectAcl 命令。

若要將物件的所有權變更至擁有 S3 儲存貯體的帳戶,請執行 AWS CLI cp 命令。確保從儲存貯體的帳戶中執行 cp 命令以將物件複製到自身。

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

相關資訊

Athena 中的身分和存取管理

AWS 官方
AWS 官方已更新 8 個月前