本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
在 Step Functions 狀態機器中處理錯誤條件
在本教學課程中,您會建立具有任務狀態 AWS Step Functions 的狀態機器,該狀態會叫用為擲回自訂錯誤而建置的範例 Lambda 函數。
任務是其中之一備用狀態,您可以設定 Catch
欄位。當整合收到錯誤時,擷取欄位會根據錯誤名稱選擇後續步驟。
步驟 1:建立拋出錯誤的 Lambda 函數
使用 Lambda 函數來模擬錯誤條件。
-
在 https://https://console.aws.amazon.com/lambda/
開啟 AWS Lambda 主控台。 -
選擇 Create function (建立函數)。
-
選擇使用藍圖、搜尋
Step Functions
,然後選擇擲回自訂錯誤。 -
針對函數名稱,請輸入
ThrowErrorFunction
。 -
針對 Role (角色),選擇 Create a new role with basic Lambda permissions (建立具備基本 Lambda 許可的新角色)。
-
選擇 Create function (建立函數)。
下列程式碼應該會顯示在程式碼窗格中。
export const handler = async () => { function CustomError(message) { this.name = 'CustomError'; this.message = message; } CustomError.prototype = new Error(); throw new CustomError('This is a custom error!'); };
步驟 2:測試 Lambda 函數
在建立狀態機器之前,請確認您的 Lambda 函數在調用CustomError
時擲回您的 。
-
選擇測試標籤。
-
選擇建立新事件並保留預設事件 JSON
-
選擇測試以使用測試事件叫用函數。
-
展開執行函數以檢閱擲回錯誤的詳細資訊。
您現在有一個 Lambda 函數已準備好擲回自訂錯誤。
在下一個步驟中,您將設定狀態機器來擷取並重試該錯誤。
步驟 3:建立您的狀態機器
使用 Step Functions 主控台建立使用 任務工作流程狀態 搭配Catch
組態的狀態機器。狀態機器會叫用 Lambda 函數,您已建置此函數來模擬在叫用函數時擲回錯誤。Step Functions 會在重試之間使用指數退避來重試函數。
-
開啟 Step Functions 主控台
,從功能表中選擇狀態機器,然後選擇建立狀態機器。 -
選擇從空白建立,然後在狀態機器名稱中輸入
CatchErrorStateMachine
。 -
接受預設類型 (標準),然後選擇繼續在 Workflow Studio 中編輯您的狀態機器。
-
選擇程式碼以切換至 ASL 編輯器,然後使用下列狀態機器定義取代程式碼:
{ "Comment": "Example state machine that can catch a custom error thrown by a function integration.", "StartAt": "CreateAccount", "States": { "CreateAccount": { "Type": "Task", "Resource": "arn:aws:states:::lambda:invoke", "Output": "{% $states.result.Payload %}", "Arguments": { "FunctionName": "arn:aws:lambda:
region
:account-id
:function:ThrowErrorFunction:$LATEST", "Payload": "{% $states.input %}" }, "Catch": [ { "ErrorEquals": [ "CustomError" ], "Next": "CustomErrorFallback" }, { "ErrorEquals": [ "States.ALL" ], "Next": "CatchAllFallback" } ], "End": true, "Retry": [ { "ErrorEquals": [ "CustomError", "Lambda.ServiceException", "Lambda.AWSLambdaException", "Lambda.SdkClientException", "Lambda.TooManyRequestsException" ], "IntervalSeconds": 1, "MaxAttempts": 3, "BackoffRate": 2, "JitterStrategy": "FULL" } ] }, "CustomErrorFallback": { "Type": "Pass", "End": true, "Output": { "Result": "Fallback from a custom error function." } }, "CatchAllFallback": { "Type": "Pass", "End": true, "Output": { "Result": "Fallback from all other error codes." } } }, "QueryLanguage": "JSONata" }
步驟 4:設定您的狀態機器
執行狀態機器之前,您必須先連線到先前建立的 Lambda 函數。
-
切換回設計模式,然後選取名為 CreateAccount 的 Lambda:調用任務狀態。
在組態索引標籤上,尋找 API 引數。針對函數名稱,選擇您先前建立的 Lambda 函數。
選擇建立,檢閱角色,然後選擇確認以建立您的狀態機器。
步驟 5:執行狀態機器
建立和設定狀態機器之後,您可以執行它並檢查流程。
-
在編輯器中,選擇執行。
或者,從狀態機器清單中,選擇開始執行。
-
在開始執行對話方塊中,接受產生的 ID,並在輸入中輸入下列 JSON:
{ "Cause" : "Custom Function Error" }
-
選擇 Start execution (開始執行)。
Step Functions 主控台會引導您前往標題為執行 ID 的頁面,稱為執行詳細資訊頁面。您可以在工作流程進行和完成後檢閱執行結果。
若要檢閱執行結果,請在圖形檢視中選擇個別狀態,然後選擇步驟詳細資訊窗格上的個別索引標籤,分別檢視每個狀態的詳細資訊,包括輸入、輸出和定義。如需您可以在執行詳細資訊頁面上檢視之執行資訊的詳細資訊,請參閱 執行詳細資訊概觀。
您的狀態機器會叫用 Lambda 函數,這會擲出 CustomError
。在圖形檢視中選擇 CreateAccount 步驟,以查看狀態輸出。您的狀態機器輸出看起來應該類似下圖:

恭喜您!
您現在有一個狀態機器,可以捕捉和處理 Lambda 函數擲回的錯誤條件。您可以使用此模式在工作流程中實作強大的錯誤處理。
注意
您也可以建立狀態機器,在逾時時重試,或在發生錯誤或逾時時Catch
用來轉換為特定狀態的機器。如需錯誤處理技巧的範例,請參閱使用重試和擷取的範例。