Help us improve the AWS re:Post Knowledge Center by sharing your feedback in a brief survey. Your input can influence how we create and update our content to better support your AWS journey.
為什麼我的 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?
相關內容
- 已提問 1 年前
- 已提問 2 年前

