為什麼我的 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=

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

**注意:**如果您在執行 AWS Command Line Interface (AWS CLI) 命令時收到錯誤,則請參閱對 AWS CLI 進行錯誤疑難排解。此外,請確定您使用的是最新的 AWS CLI 版本

在 Amazon EMR 叢集的主節點上執行 ls 命令:

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

**注意:**將 s3://doc-example-bucket/abc/ 取代為您的 Amazon S3 路徑。

如果上一個命令成功,則憑證或 AWS Identity and Access Management (IAM) 角色會導致存取遭拒錯誤。

若要解決此問題,請完成下列步驟:

  1. 確認您的應用程式使用預期的憑證或擔任預期的 IAM 角色。
  2. 若要驗證角色是否具有 Amazon S3 路徑的權限,請使用 AWS CLI 來擔任 IAM 角色。然後,對 S3 路徑執行範例請求。

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

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

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

要檢查您是否具有必要的讀取權限,請執行 ls 命令:

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

範例輸出結果:

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

-or-

執行下列命令:

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 政策範例:

{  "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 角色

如果您使用安全性組態來指定 Amazon EMR 檔案系統 (EMRFS) 的 IAM 角色,則您將使用角色映射。您的應用程式根據角色映射組態從 IAM 角色繼承 S3 許可。

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

檢查 Amazon S3 VPC 端點政策

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

使用 AWS CLI

執行 describe-vpc-endpoints AWS CLI 註解以檢查端點政策:

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

**注意:**將 vpce-######## 取代為您的 VPC ID

執行 modify-vpc-endpoint 命令以修改端點政策:

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

注意:取代--vpc-endpoint-idJSON 檔案路徑。

使用 Amazon VPC 主控台

完成下列步驟:

  1. 開啟 Amazon VPC 主控台
  2. 在瀏覽窗格中,選擇端點服務
  3. 選取位於 EMR 叢集子網路路由表上的 Amazon S3 端點。
  4. 選擇政策索引標籤。
  5. 選擇編輯政策

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

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

若要修改儲存貯體政策,請使用 AWS CLI 或 Amazon S3 主控台。

使用 AWS CLI

執行 get-bucket-policy 命令以取得儲存貯體政策:

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

**注意:**將 doc-example-policy 取代為來源或目的地儲存貯體的名稱。

修改政策,然後將政策儲存到 JSON 檔案中。

然後,執行 put-bucket-policy 命令,將修改的政策新增到儲存貯體中:

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

**注意:**取代儲存貯體名稱和 JSON 檔案路徑。

使用 Amazon S3 主控台

如需指示,請參閱透過使用 Amazon 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 個月前