本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
使用 Step Functions 狀態機處理錯誤條件
在此自學課程中,您將建立具有后援国家欄位的 AWS Step Functions 狀態機器。此Catch
欄位會根據錯誤訊息類型使用條件式邏輯來回應 AWS Lambda 函數。此技術稱為函數錯誤處理。
如需詳細資訊,請參閱AWS Lambda 開發人員指南中的 Node.js 中的AWS Lambda 函式錯誤。
注意
您也可以建立在逾時時重試的狀態機器,或是在發生錯誤或逾時時用來轉換Catch
至特定狀態的狀態機器。如需錯誤處理技巧的範例,請參閱使用重試和擷取的範例。
步驟 1:建立失敗的 Lambda 函數
使用 Lambda 函數來模擬錯誤狀況。
重要
確保您的 Lambda 函數與 AWS 區域 狀態機位於相同的 AWS 帳戶下。
-
在開啟 AWS Lambda 主控台https://console.aws.amazon.com/lambda/
。 -
選擇建立函數。
-
選擇 [使用藍圖],在搜尋方塊
step-functions
中輸入,然後選擇 [擲回自訂錯誤藍圖]。 -
針對 函數名稱 ,請輸入
FailFunction
。 -
對於角色,請保留預設選項 (使用基本 Lambda 權限建立新角色)。
-
下列程式碼會顯示在 Lambda 函數程式碼窗格中。
exports.handler = async (event, context) => { function CustomError(message) { this.name = 'CustomError'; this.message = message; } CustomError.prototype = new Error(); throw new CustomError('This is a custom error!'); };
context
物件會傳回錯誤訊息This is a custom error!
。 -
選擇建立函數。
-
建立 Lambda 函數後,複製頁面右上角顯示的函數的 Amazon 資源名稱 (ARN)。下面是一個例子ARN:
arn:aws:lambda:us-east-1:123456789012:function:FailFunction
-
選擇部署。
步驟 2:測試 Lambda 函數
測試您的 Lambda 函數以查看它在運作中。
-
在FailFunction頁面上,選擇 [測試] 索引標籤,然後選擇 [測試]。您不需要建立測試事件。
-
若要檢閱測試結果 (模擬錯誤),請在執行結果下展開詳細資料。
步驟 3:使用 Catch 欄位建立狀態機
使用 Step Functions 主控台建立使用具有Catch
欄位之工作流程狀態狀態的狀態機器。在「工作」狀態下新增對 Lambda 函數的參考。狀態機器調用 Lambda 函數,該函數在執行期間失敗。Step Functions 會在重試之間使用指數輪詢來重試函式兩次。
-
開啟 Step Functions 主控台
,然後選擇建立狀態機器。 -
在「選擇範本」對話方塊中,選取「空白」。
-
選擇選取以在中開啟工作流程工作室設計模式。
-
選擇 [程式碼] 以開啟程式碼編輯器。在程式碼編輯器中,您可以撰寫並編輯工作流程的 Amazon States Language (ASL) 定義。
-
貼上下列程式碼,但取代您先前在Resource欄位中建立ARN的 Lambda 函數。
{ "Comment": "A Catch example of the Amazon States Language using an AWS Lambda function", "StartAt": "CreateAccount", "States": { "CreateAccount": { "Type": "Task", "Resource": "
arn:aws:lambda:us-east-1:123456789012:function:FailFunction
", "Catch": [ { "ErrorEquals": ["CustomError"], "Next": "CustomErrorFallback" }, { "ErrorEquals": ["States.TaskFailed"], "Next": "ReservedTypeFallback" }, { "ErrorEquals": ["States.ALL"], "Next": "CatchAllFallback" } ], "End": true }, "CustomErrorFallback": { "Type": "Pass", "Result": "This is a fallback from a custom Lambda function exception", "End": true }, "ReservedTypeFallback": { "Type": "Pass", "Result": "This is a fallback from a reserved error code", "End": true }, "CatchAllFallback": { "Type": "Pass", "Result": "This is a fallback from any error code", "End": true } } }這是您使用 Amazon 州語言的狀態機器的描述。它定義名為
CreateAccount
的單一Task
狀態。如需詳細資訊,請參閱狀態機器結構。如需
Retry
欄位語法的詳細資訊,請參閱使用重試和使用 Catch 的狀態機示例。注意
Lambda 中未處理的錯誤會報告為錯誤輸出
Lambda.Unknown
中。這些包括 out-of-memory 錯誤和功能超時。您可以在Lambda.Unknown
States.ALL
、或上進行比對States.TaskFailed
來處理這些錯誤。當 Lambda 達到調用的最大數量時,錯誤為。Lambda.TooManyRequestsException
如需 LambdaHandled
和Unhandled
錯誤的詳細資訊,請參閱AWS Lambda 開發人員指南FunctionError
中的。 -
(選擇性) 在中圖形視覺化,查看工作流程的即時圖形視覺效果。
-
指定狀態機的名稱。若要執行此操作,請選擇的預設狀態機器名稱旁邊的編輯圖示MyStateMachine。然後,在 [狀態機器組態] 中,在 [狀態機器名稱] 方塊中指定名稱。
針對本教學,輸入
Catchfailure
。 -
(選擇性) 在狀態機器組態中,指定其他工作流程設定,例如狀態機器類型及其執行角色。
在本教學課程中,請保留狀態機器設定中的所有預設選項。
-
在 [確認角色建立] 對話方塊中,選擇 [確認] 以繼續。
您也可以選擇 [檢視角色設定] 以返回 [狀態機器組態]。
注意
如果刪除 Step Functions 所建立的IAM角色,則 Step Functions 稍後無法重新建立。同樣地,如果您修改角色 (例如,從原則中的主參與者中移除 Step Functions),IAM則 Step Functions 稍後無法還原其原始設定。
步驟 4:運行狀態機
建立狀態機之後,您可以執行它。
-
在 [狀態電腦] 頁面上,選擇 [捕捉失敗]。
-
在「捕捉失敗」頁面上,選擇「開始執行」。此時會顯示「開始執行」對話方塊。
-
在 [開始執行] 對話方塊中,執行下列動作:
-
(選擇性) 若要識別您的執行項目,您可以指定名稱,或使用預設產生的執行名稱。
注意
Step Functions 接受包含非ASCII字元的狀態機器、執行項目、活動和標籤的名稱。由於ASCII包含非ASCII字元的名稱不適用於 Amazon CloudWatch,因此我們建議您僅使用字元,以便您可以追蹤中的指標。 CloudWatch
-
(選擇性) 在「輸入」方塊中,以JSON格式輸入輸入值以執行工作流程。
-
選擇 Start execution (開始執行)。
-
Step Functions 主控台會將您導向至標題為執行 ID 的頁面。此頁面稱為「執行詳細資訊」頁面。在此頁面上,您可以在執行進行時或完成之後複查執行結果。
若要複查執行結果,請在「圖形」檢視中選擇個別狀態,然後選擇步驟詳情窗格上的個別索引標籤,分別檢視每個狀態的詳細資訊,包括輸入、輸出和定義。如需有關可在「執行詳細資訊」頁面檢視之執行資訊的詳細資訊,請參閱執行詳細資訊頁面 — 介面概觀。
例如,若要檢視您的自訂錯誤訊息,請在「圖表」檢視中選擇CreateAccount步驟,然後選擇「輸出」標籤。
注意
您可以使用
ResultPath
來保留狀態輸入與錯誤。請參閱用於 ResultPath 將錯誤和輸入都包含在 Catch。 -