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

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

使用 Lambda 函數繼續新的執行

您可以建立使用 Lambda 函數的狀態機器,在目前的執行終止之前開始新的執行。使用此方法在新的執行中繼續進行中的工作,可讓您擁有可以將大型工作分解為較小工作流程的狀態機器,或者擁有無限期執行的狀態機器。

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

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

State 用途

ConfigureCount

一種Pass狀態count,可設定 Iterator Lambda 函數用來逐步執行工作迭代的index、和step值。

Iterator

參考 Iterator Lambda 函數的Task狀態。

IsCountReached

使用Iterator函數中的 Boolean 值來決定狀態機是否應該繼續範例工作,還是移至ShouldRestart狀態的狀態。Choice

ExampleWork

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

ShouldRestart

使用executionCount值來決定是否應該結束某個執行並開始另一個執行,或直接結束的Choice狀態。

Restart

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

必要條件

在開始之前,請先閱讀建立使用 Lambda 的 Step Functions 狀態機器教學課程,以確保您熟悉一起使用 Lambda 和 Step Functions。

步驟 1:創建一個 Lambda 函數以迭代計數

注意

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

本節和用 Lambda 迭代一個循環教學課程說明如何使用 Lambda 函數追蹤計數,例如狀態機器中迴圈的迭代次數。

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

您的狀態機器實作 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 資源名稱 (ARN),例如:

      arn:aws:lambda:us-east-1:123456789012:function:Iterator
  4. 將 Lambda 函數的下列程式碼複製到 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. 選擇建立

  4. 在 Lambda 主控台的 [迭代器] 頁面上,確定TestIterator已列出,然後選擇 [測試]。

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

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

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

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

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

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

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

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

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

  4. 保留頁面上的所有預設選項,然後選擇 [建立功能]。

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

    arn:aws:lambda:us-east-1:123456789012:function:Iterator
  5. 將 Lambda 函數的下列程式碼複製到 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. 選擇選取。這會在設計模式中開啟工作流程工作室

  4. 在本教學課程中,您將在程式碼編輯器. Amazon States Language 要做到這一點,選擇代碼

  5. 刪除現有的樣板代碼並粘貼以下代碼。請記得將此程式碼中的 ARN 取代為您建立的 Lambda 函數的 ARN。

    { "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],然後為該 IAM 角色提供 ARN。

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

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

    注意

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

  9. 將此狀態機器的 Amazon 資源名稱 (ARN) 儲存在文字檔中。您需要提供 ARN,同時提供 Lambda 函數的許可,以啟動新的 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. (選擇性) 若要識別您的執行項目,您可以在「名稱」(Name) 方塊中指定執行項目的名稱。默認情況下,Step Functions 自動生成一個唯一的執行名稱。

      注意

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

    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 函數啟動的持續執行。

      
                                執行完成後,系統會執行下一個執行。

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

      
                                所有執行完成。