使用 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,請按一下 copy Amazon Resource Name 。以下是 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欄位中建立的 Lambda 函數的 ARN。

    { "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 函數錯誤的詳細資訊,請參閱AWS Lambda 開發人員指南中的錯誤處理和自動重試

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

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

    針對本教學,輸入 Catchfailure

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

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

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

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

    注意

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

步驟 4:運行狀態機

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

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

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

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

    1. (選擇性) 若要識別您的執行項目,您可以在「名稱」(Name) 方塊中指定執行項目的名稱。默認情況下,Step Functions 自動生成一個唯一的執行名稱。

      注意

      Step Functions 允許您為狀態機器,執行和活動以及包含非 ASCII 字符的標籤創建名稱。這些非 ASCII 名稱不適用於 Amazon CloudWatch。若要確保您可以追蹤 CloudWatch 量度,請選擇僅使用 ASCII 字元的名稱。

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

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

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

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

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

    錯誤輸出
    注意

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