為什麼我的 Amazon EMR 應用程式失敗,並出現 HTTP 403「存取遭拒」AmazonS3Exception?
在我將某個應用程式提交至 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) 角色會導致存取遭拒錯誤。
若要解決此問題,請完成下列步驟:
- 確認您的應用程式使用預期的憑證或擔任預期的 IAM 角色。
- 若要驗證角色是否具有 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-id 和 JSON 檔案路徑。
使用 Amazon VPC 主控台
完成下列步驟:
- 開啟 Amazon VPC 主控台。
- 在瀏覽窗格中,選擇端點服務。
- 選取位於 EMR 叢集子網路路由表上的 Amazon S3 端點。
- 選擇政策索引標籤。
- 選擇編輯政策。
檢查 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?
相關內容
- 已提問 7 個月前lg...
- AWS 官方已更新 2 年前