使用 Step Functions 狀態機處理錯誤條件 - AWS Step Functions

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

使用 Step Functions 狀態機處理錯誤條件

在此自學課程中,您將建立具有后援国家欄位的 AWS Step Functions 狀態機器。此Catch欄位會根據錯誤訊息類型使用條件式邏輯來回應 AWS Lambda 函數。此技術稱為函數錯誤處理

如需詳細資訊,請參閱AWS Lambda 開發人員指南中的 Node.js 中的AWS Lambda 函式錯誤。

注意

您也可以建立在逾時時重試的狀態機器,或是在發生錯誤或逾時時用來轉換Catch至特定狀態的狀態機器。如需錯誤處理技巧的範例,請參閱使用重試和擷取的範例

步驟 1:建立失敗的 Lambda 函數

使用 Lambda 函數來模擬錯誤狀況。

重要

確保您的 Lambda 函數與 AWS 區域 狀態機位於相同的 AWS 帳戶下。

  1. 在開啟 AWS Lambda 主控台https://console.aws.amazon.com/lambda/

  2. 選擇建立函數

  3. 選擇 [使用藍圖],在搜尋方塊step-functions中輸入,然後選擇 [擲回自訂錯誤藍圖]。

  4. 針對 函數名稱 ,請輸入 FailFunction

  5. 對於角色,請保留預設選項 (使用基本 Lambda 權限建立新角色)。

  6. 下列程式碼會顯示在 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!

  7. 選擇建立函數

  8. 建立 Lambda 函數後,複製頁面右上角顯示的函數的 Amazon 資源名稱 (ARN)。下面是一個例子ARN:

    arn:aws:lambda:us-east-1:123456789012:function:FailFunction
  9. 選擇部署

步驟 2:測試 Lambda 函數

測試您的 Lambda 函數以查看它在運作中。

  1. FailFunction頁面上,選擇 [測試] 索引標籤,然後選擇 [測試]。您不需要建立測試事件。

  2. 若要檢閱測試結果 (模擬錯誤),請在執行結果下展開詳細資料

步驟 3:使用 Catch 欄位建立狀態機

使用 Step Functions 主控台建立使用具有Catch欄位之工作流程狀態狀態的狀態機器。在「工作」狀態下新增對 Lambda 函數的參考。狀態機器調用 Lambda 函數,該函數在執行期間失敗。Step Functions 會在重試之間使用指數輪詢來重試函式兩次。

  1. 開啟 Step Functions 主控台,然後選擇建立狀態機器

  2. 在「選擇範本」對話方塊中,選取「空白」。

  3. 選擇選以在中開啟工作流程工作室設計模式

  4. 選擇 [程式碼] 以開啟程式碼編輯器。在程式碼編輯器中,您可以撰寫並編輯工作流程的 Amazon States Language (ASL) 定義。

  5. 貼上下列程式碼,但取代您先前在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.UnknownStates.ALL、或上進行比對States.TaskFailed來處理這些錯誤。當 Lambda 達到調用的最大數量時,錯誤為。Lambda.TooManyRequestsException如需 Lambda HandledUnhandled錯誤的詳細資訊,請參閱AWS Lambda 開發人員指南FunctionError中的。

  6. (選擇性) 在中圖形視覺化,查看工作流程的即時圖形視覺效果。

  7. 指定狀態機的名稱。若要執行此操作,請選擇的預設狀態機器名稱旁邊的編輯圖示MyStateMachine。然後,在 [狀態機器組態] 中,在 [狀態機器名稱] 方塊中指定名稱

    針對本教學,輸入 Catchfailure

  8. (選擇性) 在狀態機器組態中,指定其他工作流程設定,例如狀態機器類型及其執行角色。

    在本教學課程中,請保留狀態機器設定中的所有預設選項。

  9. 在 [確認角色建立] 對話方塊中,選擇 [確認] 以繼續。

    您也可以選擇 [檢視角色設定] 以返回 [狀態機器組態]。

    注意

    如果刪除 Step Functions 所建立的IAM角色,則 Step Functions 稍後無法重新建立。同樣地,如果您修改角色 (例如,從原則中的主參與者中移除 Step Functions),IAM則 Step Functions 稍後無法還原其原始設定。

步驟 4:運行狀態機

建立狀態機之後,您可以執行它。

  1. 在 [狀態電腦] 頁面上,選擇 [捕捉失敗]。

  2. 在「捕捉失敗」頁面上,選擇「開始執行」。此時會顯示「開始執行」對話方塊。

  3. 在 [開始執行] 對話方塊中,執行下列動作:

    1. (選擇性) 若要識別您的執行項目,您可以指定名稱,或使用預設產生的執行名稱。

      注意

      Step Functions 接受包含非ASCII字元的狀態機器、執行項目、活動和標籤的名稱。由於ASCII包含非ASCII字元的名稱不適用於 Amazon CloudWatch,因此我們建議您僅使用字元,以便您可以追蹤中的指標。 CloudWatch

    2. (選擇性) 在「入」方塊中,以JSON格式輸入輸入值以執行工作流程。

    3. 選擇 Start execution (開始執行)

    4. Step Functions 主控台會將您導向至標題為執行 ID 的頁面。此頁面稱為「執行詳細資訊」頁面。在此頁面上,您可以在執行進行時或完成之後複查執行結果。

      若要複查執行結果,請在「圖形」檢視中選擇個別狀態,然後選擇步驟詳情窗格上的個別索引標籤,分別檢視每個狀態的詳細資訊,包括輸入、輸出和定義。如需有關可在「執行詳細資訊」頁面檢視之執行資訊的詳細資訊,請參閱執行詳細資訊頁面 — 介面概觀

    例如,若要檢視您的自訂錯誤訊息,請在「圖表」檢視中選擇CreateAccount步驟,然後選擇「輸出」標籤。

    帶有執行錯誤消息的輸出的說明性屏幕截圖。
    注意

    您可以使用 ResultPath 來保留狀態輸入與錯誤。請參閱用於 ResultPath 將錯誤和輸入都包含在 Catch