為什麼我的 Amazon EMR 應用程式失敗,並出現 HTTP 403「存取遭拒」AmazonS3Exception?

3 分的閱讀內容
0

在我將某個應用程式提交至 Amazon EMR 叢集時,該應用程式會失敗,並出現 HTTP 403「存取遭拒」AmazonS3Exception。

解決方法

如果未正確設定許可,您可能會在 Amazon EMR 或 Amazon Simple Storage Service (Amazon S3) 上收到「存取遭拒」錯誤。錯誤看起來類似下列訊息:

java.io.IOException: com.amazon.ws.emr.hadoop.fs.shaded.com.amazonaws.services.s3.model.AmazonS3Exception: Access Denied (Service: Amazon S3; Status Code: 403; Error Code: AccessDenied; Request ID: 8B28722038047BAA; S3 Extended Request ID: puwS77OKgMrvjd30/EY4CWlC/AuhOOSNsxfI8xQJXMd20c7sCq4ljjVKsX4AwS7iuo92C9m+GWY=), S3 Extended Request ID: puwS77OKgMrvjd30/EY4CWlC/AuhOOSNsxfI8xQJXMd20c7sCq4ljjVKsX4AwS7iuo92C9m+GWY=

首先,檢查應用程式程式碼中指定的憑證或角色

在 EMR 叢集的主節點上執行下列命令。將 s3://doc-example-bucket/abc/ 取代為您的 Amazon S3 路徑。

aws s3 ls s3://doc-example-bucket/abc/

如果此命令成功,則應用程式程式碼中指定的憑證或角色會導致「存取遭拒」錯誤。確認您的應用程式使用預期的憑證或擔任預期的角色,且可存取 Amazon S3 路徑。透過使用 AWS CLI 擔任 AWS Identity and Access Management (IAM) 角色,確認角色具有 Amazon S3 路徑的許可。然後,對 S3 路徑執行範例請求。

如果此命令失敗,請確認您使用的是最新版本的 AWS Command Line Interface (AWS CLI)。然後,檢查下列內容以解決「存取遭拒」錯誤:

檢查 Amazon EC2 執行個體設定檔角色的政策

如果 Amazon Elastic Compute Cloud (Amazon EC2) 執行個體設定檔沒有 S3 儲存貯體上所需的讀取和寫入許可,您可能會收到「存取遭拒」錯誤。

**注意:**依預設,應用程式會從 Amazon EC2 執行個體設定檔的 IAM 角色繼承 Amazon S3 存取權。請確保連接至此角色的 IAM 政策允許在來源和目的地儲存貯體上執行所需的 S3 操作。

若要對此問題進行疑難排解,請執行下列命令來檢查您是否具有必要的讀取許可:

$ aws s3 ls s3://doc-example-bucket/myfolder/

您的輸出可能如下所示:

An error occurred (AccessDenied) when calling the ListObjectsV2 operation: Access Denied

-或-

執行下列命令:

$ hdfs dfs -ls s3://doc-example-bucket/myfolder

您的輸出可能如下所示:

ls: com.amazon.ws.emr.hadoop.fs.shaded.com.amazonaws.services.s3.model.AmazonS3Exception: Access Denied (Service: Amazon S3; Status Code: 403; Error Code: AccessDenied; Request ID: RBT41F8SVAZ9F90B; S3 Extended Request ID: ih/UlagUkUxe/ty7iq508hYVfRVqo+pB6/xEVr5WHuvcIlfQnFf33zGTAaoP2i7cAb1ZPIWQ6Cc=; Proxy: null), S3 Extended Request ID: ih/UlagUkUxe/ty7iq508hYVfRVqo+pB6/xEVr5WHuvcIlfQnFf33zGTAaoP2i7cAb1ZPIWQ6Cc=

請確保執行個體設定檔角色具有 S3 儲存貯體所需的讀取和寫入許可。例如,下列 IAM 政策中的 S3 動作提供 S3 儲存貯體 doc-example-bucket 所需的讀取和寫入存取權:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "ListObjectsInBucket",
      "Effect": "Allow",
      "Action": [
        "s3:ListBucket"
      ],
      "Resource": [
        "arn:aws:s3:::doc-example-bucket"
      ]
    },
    {
      "Sid": "AllObjectActions",
      "Effect": "Allow",
      "Action": "s3:*Object*",
      "Resource": [
        "arn:aws:s3:::doc-example-bucket/*"
      ]
    }
  ]
}

檢查 EMRFS 角色映射的 IAM 角色

如果使用安全組態為 EMRFS 指定 IAM 角色,則您將使用角色映射。您的應用程式根據角色映射組態從 IAM 角色繼承 S3 許可。

連接至這些角色的 IAM 政策必須具有來源和目的地儲存貯體上所需的 S3 許可。若要為對 Amazon S3 的 EMRFS 請求指定 IAM 角色,請參閱使用 IAM 角色為 EMRFS 設定安全組態

檢查 Amazon S3 VPC 端點政策

如果 EMR 叢集的子網路路由表具有 Amazon S3 VPC 端點的路由,請確認端點政策允許所需的 Amazon S3 操作。

若要使用 CLI 檢查和修改端點政策,請執行以下操作:

執行下列命令以檢閱端點政策。將 vpce-xxxxxxxx 取代為您的 VPC ID。

aws ec2 describe-vpc-endpoints --vpc-endpoint-ids "vpce-xxxxxxxx"

如有必要,請執行下列命令以上傳修改的端點政策。取代 VPC ID 和 JSON 檔案路徑。

aws ec2 modify-vpc-endpoint --vpc-endpoint-id "vpce-xxxxxxxx" --policy-document file://policy.json

若要使用 Amazon VPC 主控台檢查和修改端點政策,請執行以下操作:

  1. 開啟 Amazon VPC 主控台
  2. 在導覽窗格中,選擇端點
  3. 選取 Amazon S3 端點 (EMR 叢集子網路路由表上的端點)。然後,選擇政策標籤以檢閱端點政策。
  4. 若要新增所需的 Amazon S3 動作,請選擇編輯政策

檢查 S3 來源和目的地儲存貯體政策

儲存貯體政策指定主體允許或拒絕的動作。來源和目的地儲存貯體政策必須允許 EC2 執行個體設定檔角色或映射的 IAM 角色執行所需的 Amazon S3 操作。

若要使用 CLI 檢查和修改儲存貯體政策,請執行以下操作:

執行下列命令以檢閱儲存貯體政策。將 doc-example-bucket 取代為來源或目的地儲存貯體的名稱。

aws s3api get-bucket-policy --bucket doc-example-bucket

如有必要,請執行下列命令以上傳修改的儲存貯體政策。取代儲存貯體名稱和 JSON 檔案路徑。

aws s3api put-bucket-policy --bucket doc-example-bucket --policy file://policy.json

若要使用 Amazon S3 主控台檢查和修改儲存貯體政策,請執行以下操作:

  1. 開啟 Amazon S3 主控台
  2. 選擇儲存貯體。
  3. 選擇許可標籤。
  4. 選擇儲存貯體政策以檢閱和修改儲存貯體政策。

存取其他帳戶中的 S3 儲存貯體

**重要:**如果您的應用程式存取屬於其他 AWS 帳戶的 S3 儲存貯體,則帳戶擁有者必須在儲存貯體政策中允許您的 IAM 角色。

例如,下列儲存貯體政策向 emr-account 中的所有 IAM 角色和使用者提供對 s3://doc-example-bucket/myfolder/ 的完整存取權。

{
  "Id": "MyCustomPolicy",
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "AllowRootAndHomeListingOfCompanyBucket",
      "Principal": {
        "AWS": [
          "arn:aws:iam::emr-account:root"
        ]
      },
      "Action": [
        "s3:ListBucket"
      ],
      "Effect": "Allow",
      "Resource": [
        "arn:aws:s3:::doc-example-bucket"
      ],
      "Condition": {
        "StringEquals": {
          "s3:prefix": [
            "",
            "myfolder/"
          ],
          "s3:delimiter": [
            "/"
          ]
        }
      }
    },
    {
      "Sid": "AllowListingOfUserFolder",
      "Principal": {
        "AWS": [
          "arn:aws:iam::emr-account:root"
        ]
      },
      "Action": [
        "s3:ListBucket"
      ],
      "Effect": "Allow",
      "Resource": [
        "arn:aws:s3:::doc-example-bucket"
      ],
      "Condition": {
        "StringLike": {
          "s3:prefix": [
            "myfolder/*"
          ]
        }
      }
    },
    {
      "Sid": "AllowAllS3ActionsInUserFolder",
      "Principal": {
        "AWS": [
          "arn:aws:iam::emr-account:root"
        ]
      },
      "Effect": "Allow",
      "Action": [
        "s3:*"
      ],
      "Resource": [
        "arn:aws:s3:::doc-example-bucket/myfolder/*",
        "arn:aws:s3:::doc-example-bucket/myfolder*"
      ]
    }
  ]
}

相關資訊

為什麼我在 Amazon EMR 上的 Spark 或 Hive 工作失敗,並出現 HTTP 503「降速」AmazonS3Exception?

為什麼我的 Amazon EMR 應用程式失敗,並出現 HTTP 404「找不到」AmazonS3Exception?

錯誤回應

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

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