為什麼我的 AWS Glue 作業傳回 403 存取遭拒錯誤?

3 分的閱讀內容
0

當我的 AWS Glue 作業嘗試讀取/寫入 Amazon Simple Storage Service (Amazon S3) 儲存貯體時,作業會傳回 403 存取遭拒錯誤。

簡短描述

您會收到存取遭拒錯誤,通常是因為下列其中一個原因:

  • AWS 身分和存取管理 (IAM) 角色沒有存取儲存貯體所需的權限。
  • Amazon S3 儲存貯體政策不允許 IAM 角色所需的權限。
  • S3 儲存貯體擁有者與物件擁有者不同。
  • Amazon Virtual Private Cloud (Amazon VPC) 端點政策不包含存取 S3 儲存貯體所需的權限。
  • 物件由 AWS Key Management Service (AWS KMS) 加密,而 AWS KMS 政策不會將使用金鑰所需的最低權限授予 IAM 角色。
  • S3 儲存貯體已開啟請求者付費
  • AWS Organizations 服務控制政策限制對 S3 儲存貯體的存取。

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

解決方法

確保 IAM 角色具有存取 S3 儲存貯體的必要權限

執行 AWS Glue 作業的 IAM 角色需要存取 S3 儲存貯體。您可以將 IAM 政策附加到 IAM 角色中,這樣才能將所需權限授予給 IAM 角色。最佳作法是將 AWsGlueSerole 受管政策附加到 IAM 角色,以確認已提供基本的 AWS Glue 作業權限。此外,建立並附加客戶管理政策,以獲得在寫入時放置 S3 物件的權限。

執行以下操作更新 IAM 角色存取儲存貯體的權限:

1.    開啟 IAM 主控台

  1. 開啟與 AWS Glue 作業相關聯的 IAM 角色,需要存取儲存貯體。

3.    在 IAM 使用者/角色的權限標籤中,展開每項政策以查看其 JSON 政策文件。

  1. 在 JSON 政策文件中,尋找具有儲存貯體名稱的政策。然後,確認這些政策是否允許在儲存貯體上執行正確的 S3 動作。

  2. 如果 IAM 角色未授予儲存貯體所需要的存取權,請新增政策以授予正確權限。例如,下列 IAM 政策授予 IAM 角色及將物件 (s3:PutObject) 放入 S3 儲存貯體DOC-EXAMPLE-BUCKET 的存取權:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "ExampleStmt",
      "Action": "s3:PutObject",
      "Effect": "Allow",
      "Resource": [
        "arn:aws:s3:::DOC-EXAMPLE-BUCKET/*"
      ]
    }
  ]
}

請務必將政策中的 DOC-EXAMPLE-BUCKET 替換為 S3 儲存貯體的名稱。

確定儲存貯體政策授予 IAM 角色所需的權限

檢閱下列項目的儲存貯體政策:

  • 任何明確拒絕 IAM 角色存取儲存貯體的陳述式
  • 任何可能限制 IAM 角色存取的遺失權限和條件

請執行以下操作以檢閱和修改儲存貯體政策,以授予 IAM 角色所需的存取權:

1.    開啟 Amazon S3 主控台

  1. 從導覽窗格中選擇儲存貯體

  2. 從儲存貯體清單中,開啟您要檢查的儲存貯體。

  3. 選擇權限,然後向下捲動至儲存貯體政策區段。

  4. 檢閱儲存貯體政策,瞭解拒絕該角色存取儲存貯體的任何陳述式。

  5. 修改儲存貯體政策以編輯或移除任何拒絕 IAM 角色存取儲存貯體的陳述式。

如需儲存貯體政策範例,請參閱儲存貯體政策範例

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

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

如果其他帳戶的 IAM 使用者/角色將物件上傳到您的 S3 儲存貯體,請設定 S3 物件擁有權。然後,新增要求将物件上傳的儲存貯體政策及 bucket-owner-full-control 存取控制清單 (ACL) 。在物件與 bucket-owner-full-control ACL 一起上傳時,新增儲存貯體政策会自動將物件的擁有者變更為儲存貯體擁有者。如需詳細資訊,請參閱當其他 AWS 帳戶將物件上傳到我的 Amazon S3 儲存貯體時,我如何要求他們授予我對物件的完全控制權?

確保 Amazon VPC 端點政策允許對 S3 儲存貯體執行必要的動作

當下列情況成立時,請確定 VPC 端點政策包含存取 S3 儲存貯體和物件所需的權限:

  • 您的 AWS Glue 作業會讀取物件或將物件寫入 S3。
  • 使用 VPC 端點將連線路由至 S3。

例如,下列 VPC 端點政策僅允許存取儲存貯體 DOC-EXAMPLE-BUCKET。如果您的儲存貯體未在政策中列為允許的資源,則使用者/角色無法透過 VPC 端點存取儲存貯體。

{
  "Statement": [
    {
      "Sid": "Access-to-specific-bucket-only",
      "Principal": "*",
      "Action": [
        "s3:PutObject"
      ],
      "Effect": "Allow",
      "Resource": "arn:aws:s3:::DOC-EXAMPLE-BUCKET/*"
    }
  ]
}

請務必將政策中的 DOC-EXAMPLE-BUCKET 替換為 S3 儲存貯體的名稱。

如果使用者/角色上傳具有 ACL 的物件,則您必須更新 VPC 端點政策,以授予對 PutObjectAcl 動作的存取。例如:

{
  "Statement": [
    {
      "Sid": "Access-to-specific-bucket-only",
      "Principal": "*",
      "Action": [
        "s3:PutObject",
        "s3:PutObjectAcl"
      ],
      "Effect": "Allow",
      "Resource": "arn:aws:s3:::DOC-EXAMPLE-BUCKET/*"
    }
  ]
}

確定 AWS KMS 金鑰的政策允許存取 IAM 角色

如果擷取、轉換和載入 (ETL) 作業讀取加密的資料或將其寫入 Amazon S3,請確保以下事項:

  • IAM 角色的政策包含 AWS KMS 動作所需的權限。
  • AWS KMS 金鑰的政策包含 IAM 角色所需的權限。

在 IAM 角色的政策中包含下列權限,以允許必要的 AWS KMS 動作:

{
  "Version": "2012-10-17",
  "Statement": {
    "Effect": "Allow",
    "Action": [
      "kms:Decrypt",
      "kms:Encrypt",
      "kms:GenerateDataKey"
    ],
    "Resource": "arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab"
  }
}

請務必將政策中的 ARN 替換為您選擇的 ARN。

如需詳細資訊,請參閱在 AWS Glue 中設定加密

檢閱 KMS 金鑰政策以確認政策是否允許存取 AWS Glue 作業的角色。如需有關金鑰政策的詳細資訊,請參閱在 AWS KMS 中使用金鑰政策

如果儲存貯體已開啟請求者付費,請務必包含要求者付費標頭

如果 S3 儲存貯體已開啟請求者付費功能,則從 AWS Glue 作業向儲存貯體發出的所有請求都必須包含請求者付費標頭。根據預設,向 Amazon S3 發出的 AWS Glue 請求不包含請求者付費標頭。如果沒有這個標頭,對請求者付費儲存貯體的 API 呼叫會失敗,並出現存取遭拒異常。若要將請求者付費標頭新增至 ETL 指令碼,請使用 hadoopConfiguration().set() 在 GlueContext 變數或 Apache Spark 工作階段變數上包含 fs.s3.useRequesterPaysHeader

如需詳細資訊,請參閱如何從 AWS Glue、Amazon EMR 或 Amazon Athena 存取 Amazon S3 Requester Pays 儲存貯體?

確保 AWS Organizations 服務控制政策允許存取 S3

如果您使用 AWS Organizations,請檢閱服務控制政策以確保允許存取 Amazon S3。例如,下列政策明確拒絕存取 Amazon S3,造成存取遭拒錯誤。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Deny",
      "Action": "s3:*",
      "Resource": "*"
    }
  ]
}

如需詳細資訊,請參閱啟用組織中的所有功能


相關資訊

如何對 Amazon S3 的 403 存取遭拒錯誤進行疑難排解?

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