使用 Lambda 函數在 Step Functions 中繼續新的執行 - AWS Step Functions

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

使用 Lambda 函數在 Step Functions 中繼續新的執行

提示

下列方法使用 Lambda 函數啟動新的工作流程執行。建議使用 Step Functions 任務狀態來啟動新的工作流程執行。請參閱下列教學課程:使用 Step Functions 繼續長時間執行的工作流程 API (建議)

您可以建立使用 Lambda 函數在目前執行終止之前啟動新執行的狀態機器。透過這種在新執行中繼續持續工作的方法,您可以將大型任務分解為較小的工作流程,或無限期地執行工作流程。

本教學課程以使用外部 Lambda 函數修改工作流程的概念為基礎,該概念已在在 Step Functions 驟函數中使用 Lambda 函數迭代循環教學課程中示範。您可以使用相同的 Lambda 函數 (Iterator) 來反覆執行特定次數的迴圈。此外,您可以建立另一個 Lambda 函數來啟動工作流程的新執行,並在每次啟動新的執行時減少計數。透過設定輸入中的執行次數,此狀態機器會結束並重新啟動指定次數的執行。

您將建立的狀態機器會實作下列狀態。

State 用途

ConfigureCount

設定 Iterator Lambda 函數用來逐步反覆執行工作countindex、 和 stepPass的狀態。

Iterator

參考 Iterator Lambda 函數Task的狀態。

IsCountReached

使用Iterator函數布林值來決定狀態機器是否應繼續範例運作或移至 ShouldRestart 狀態Choice的狀態。

ExampleWork

Pass 表示在實際實作中執行工作Task的狀態。

ShouldRestart

使用 executionCount值來決定其是否應結束一個執行並開始另一個執行,還是簡單結束Choice的狀態。

Restart

Task 使用 Lambda 函數啟動狀態機器新執行的狀態。如同 Iterator 函數,此函數也會減少計數。Restart 狀態會將計數的遞減值傳遞至新執行的輸入。

必要條件

開始之前,請先瀏覽建立使用 Lambda 的 Step Functions 狀態機教學課程,以確保您熟悉將 Lambda 和 Step Functions 搭配使用。

步驟 1:建立 Lambda 函數來反覆計數

注意

如果您已完成在 Step Functions 驟函數中使用 Lambda 函數迭代循環教學課程,您可以略過此步驟,並使用該 Lambda 函數。

本節和在 Step Functions 驟函數中使用 Lambda 函數迭代循環教學課程示範如何使用 Lambda 函數來追蹤計數,例如,狀態機器中迴圈的反覆次數。

下列 Lambda 函數會接收 countindex和 的輸入值step。它會傳回包含更新 index 和名為 continue 布林值的這些值。true 如果 小於 index,Lambda 函數會continue設定為 count

您的狀態機器實作 Choice 狀態,然後執行一些應用程式邏輯,如果 continuetrue,或移至 ShouldRestart (如果 continuefalse)。

建立迭代 Lambda 函數

  1. 開啟 Lambda 主控台,然後選擇 Create function (建立函數)

  2. Create function (建立函數) 頁面上,選擇 Author from scratch (從頭開始撰寫)

  3. 基本資訊區段中,設定 Lambda 函數,如下所示:

    1. 針對 函數名稱 ,請輸入 Iterator

    2. 針對 執行時間,請選擇 Node.js 16.x

    3. 保留頁面上的所有預設選擇,然後選擇建立函數

      建立 Lambda 函數時,請在頁面右上角記下其 Amazon Resource Name (ARN),例如:

      arn:aws:lambda:us-east-1:123456789012:function:Iterator
  4. 將 Lambda 函數的下列程式碼複製到 的程式碼來源區段 Iterator Lambda 主控台中的 頁面。

    exports.handler = function iterator (event, context, callback) { let index = event.iterator.index; let step = event.iterator.step; let count = event.iterator.count; index = index + step; callback(null, { index, step, count, continue: index < count }) }

    此程式碼接受輸入值為 countindexstep。這會將 step 的值增加 index,並傳回這些值及布林值 continue。如果 index 低於 count,則 continue 的值為 true

  5. 選擇部署以部署程式碼。

測試迭代 Lambda 函數

若要查看您的 Iterate 函數運作狀況,請使用數值來執行該函數。您可以為 Lambda 函數提供輸入值,以模擬迭代,以查看您透過特定輸入值取得的輸出。

測試 Lambda 函數

  1. 設定測試事件對話方塊中,選擇建立新的測試事件 ,然後TestIterator輸入事件名稱

  2. 將範例資料取代為以下內容。

    { "Comment": "Test my Iterator function", "iterator": { "count": 10, "index": 5, "step": 1 } }

    這些值會模擬反覆運算期間來自狀態機器的內容。Lambda 函數會增加索引,並傳回continuetrue。當索引未低於 count,就會以 false 的形式傳回 continue。對於此測試,索引已經增加到 5。結果應該將 index 增加到 6 和將 continue 設定為 true

  3. 選擇 Create (建立)。

  4. 在 上 迭代器 頁面,請確定TestIterator已列出,然後選擇測試

    測試結果會顯示在頁面頂端。選擇 Details (詳細資訊) 並檢閱結果。

    { "index": 6, "step": 1, "count": 10, "continue": true }
    注意

    如果您將此測試的 index 設定為 9,則 index 會增加至 10,且 continuefalse

步驟 2:建立重新啟動 Lambda 函數以啟動新的步驟函數執行

  1. 開啟 Lambda 主控台,然後選擇 Create function (建立函數)

  2. Create function (建立函數) 頁面上,選擇 Author from scratch (從頭開始撰寫)

  3. 基本資訊區段中,設定 Lambda 函數,如下所示:

    1. 針對 函數名稱 ,請輸入 Restart

    2. 針對 執行時間,請選擇 Node.js 16.x

  4. 保留頁面上的所有預設選擇,然後選擇建立函數

    建立 Lambda 函數時,請在頁面右上角記下其 Amazon Resource Name (ARN),例如:

    arn:aws:lambda:us-east-1:123456789012:function:Iterator
  5. 將 Lambda 函數的下列程式碼複製到 的程式碼來源區段 Restart Lambda 主控台中的 頁面。

    下列程式碼會減少執行數量的計數,並啟動狀態機器的新執行,包括遞減數值。

    var aws = require('aws-sdk'); var sfn = new aws.StepFunctions(); exports.restart = function(event, context, callback) { let StateMachineArn = event.restart.StateMachineArn; event.restart.executionCount -= 1; event = JSON.stringify(event); let params = { input: event, stateMachineArn: StateMachineArn }; sfn.startExecution(params, function(err, data) { if (err) callback(err); else callback(null,event); }); }
  6. 選擇部署以部署程式碼。

步驟 3:建立狀態機器

現在您已建立兩個 Lambda 函數,請建立狀態機器。在此狀態機器中,ShouldRestartRestart 狀態表示您在多次執行間中斷工作的方式。

範例 ShouldRestart 選擇狀態

下列摘錄顯示 ShouldRestartChoice 狀態。此狀態決定您是否應該重新啟動執行。

"ShouldRestart": { "Type": "Choice", "Choices": [ { "Variable": "$.restart.executionCount", "NumericGreaterThan": 1, "Next": "Restart" } ],

$.restart.executionCount 值包含在初始執行的輸入中。該值會在每次呼叫 Restart 函數時減 1,然後在每次後續執行時將該值放置於輸入中。

範例 重新啟動任務狀態

下列摘錄顯示 RestartTask 狀態。此狀態會使用您先前建立的 Lambda 函數來重新啟動執行,並遞減計數,以追蹤要啟動的剩餘執行數目。

"Restart": { "Type": "Task", "Resource": "arn:aws:lambda:us-east-1:123456789012:function:Restart", "Next": "Done" },
建立 狀態機器
  1. 開啟 Step Functions 主控台,然後選擇建立狀態機器

    重要

    請確定您的狀態機器與您在步驟 1步驟 2 中建立的 Lambda 函數位於相同的 AWS 帳戶和區域。

  2. 選擇範本對話方塊中,選取空白

  3. 選擇選取以在 中開啟 Workflow Studio設計模式

  4. 對於本教學課程,您將在 中寫入狀態機器的 Amazon States Language(ASL) 定義程式碼編輯器。若要執行此操作,請選擇程式碼

  5. 移除現有的樣板程式碼並貼上下列程式碼。請記得將此程式碼ARNs中的 取代為您建立ARNs的 Lambda 函數的 。

    { "Comment": "Continue-as-new State Machine Example", "StartAt": "ConfigureCount", "States": { "ConfigureCount": { "Type": "Pass", "Result": { "count": 100, "index": -1, "step": 1 }, "ResultPath": "$.iterator", "Next": "Iterator" }, "Iterator": { "Type": "Task", "Resource": "arn:aws:lambda:us-east-1:123456789012:function:Iterator", "ResultPath": "$.iterator", "Next": "IsCountReached" }, "IsCountReached": { "Type": "Choice", "Choices": [ { "Variable": "$.iterator.continue", "BooleanEquals": true, "Next": "ExampleWork" } ], "Default": "ShouldRestart" }, "ExampleWork": { "Comment": "Your application logic, to run a specific number of times", "Type": "Pass", "Result": { "success": true }, "ResultPath": "$.result", "Next": "Iterator" }, "ShouldRestart": { "Type": "Choice", "Choices": [ { "Variable": "$.restart.executionCount", "NumericGreaterThan": 0, "Next": "Restart" } ], "Default": "Done" }, "Restart": { "Type": "Task", "Resource": "arn:aws:lambda:us-east-1:123456789012:function:Restart", "Next": "Done" }, "Done": { "Type": "Pass", "End": true } } }
  6. 為您的狀態機器指定名稱。若要這麼做,請選擇 的預設狀態機器名稱旁的編輯圖示MyStateMachine。然後,在狀態機器組態 中,在狀態機器名稱方塊中指定名稱

    針對本教學課程,輸入名稱 ContinueAsNew

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

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

    如果您先前已為狀態機器建立具有正確許可IAM的角色,並想要使用它,請在許可 中,選取選擇現有角色 ,然後從清單中選擇角色。或選取輸入角色ARN,然後ARN為該IAM角色提供 。

  8. 確認角色建立對話方塊中,選擇確認以繼續。

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

    注意

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

  9. 將此狀態機器的 Amazon Resource Name (ARN) 儲存在文字檔案中。您需要在提供 Lambda 函數的許可ARN時提供 ,才能啟動新的 Step Functions 執行。

步驟 4:更新 IAM 政策

若要確保您的 Lambda 函數具有啟動新 Step Functions 執行的許可,請將內嵌政策連接至您用於 Restart Lambda 函數IAM的角色。如需詳細資訊,請參閱 IAM 使用者指南 中的內嵌內嵌政策

注意

您可以更新上一個範例中的Resource行,以參考ContinueAsNew狀態機器ARN的 。這將限制政策,使該政策只能啟動特定狀態機器的執行。

{ "Version": "2012-10-17", "Statement": [ { "Sid": "VisualEditor0", "Effect": "Allow", "Action": [ "states:StartExecution" ], "Resource": "arn:aws:states:us-east-2:123456789012stateMachine:ContinueAsNew" } ] }

步驟 5:執行 狀態機器

若要開始執行,請提供輸入,其中包含狀態機器ARN的 和 ,executionCount其中包含應啟動新執行的次數。

  1. 在頁面上ContinueAsNew,選擇開始執行

    隨即顯示開始執行對話方塊。

  2. 啟動執行對話方塊中,執行下列動作:

    1. (選用) 輸入自訂執行名稱以覆寫產生的預設值。

      非ASCII名稱和記錄

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

    2. 輸入方塊中,輸入下列JSON輸入以執行工作流程。

      { "restart": { "StateMachineArn": "arn:aws:states:us-east-1:123456789012:stateMachine:ContinueAsNew", "executionCount": 4 } }
    3. 使用 ContinueAsNew 狀態機器ARN的 更新 StateMachineArn 欄位。

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

    5. Step Functions 主控台會引導您前往標題為執行 ID 的頁面。此頁面稱為執行詳細資訊頁面。在此頁面上,您可以在執行進行時或完成後檢閱執行結果。

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

      圖形檢視會顯示四個執行中的第一個。在執行完成之前,它將通過 Restart 狀態並啟動新的執行。

      顯示四個執行中的第一個執行的執行圖。

      當此執行完成時,您可以查看正在執行的下一個執行。選取頂端ContinueAsNew的連結以查看執行清單。您應該會同時看到最近關閉的執行,以及 Restart Lambda 函數啟動的持續執行。

      所有執行完成後,您應該會在清單中看到四個成功的執行。第一個開始執行會顯示您選擇的名稱,後續的執行具有產生的名稱。

      顯示所有執行已完成的說明性螢幕擷取畫面。