本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
使用 Lambda 函數在 Step Functions 中繼續新的執行
提示
下列方法使用 Lambda 函數啟動新的工作流程執行。建議使用 Step Functions 任務狀態來啟動新的工作流程執行。請參閱下列教學課程:使用 Step Functions 繼續長時間執行的工作流程 API (建議)。
您可以建立使用 Lambda 函數在目前執行終止之前啟動新執行的狀態機器。透過這種在新執行中繼續持續工作的方法,您可以將大型任務分解為較小的工作流程,或無限期地執行工作流程。
本教學課程以使用外部 Lambda 函數修改工作流程的概念為基礎,該概念已在在 Step Functions 驟函數中使用 Lambda 函數迭代循環教學課程中示範。您可以使用相同的 Lambda 函數 (Iterator
) 來反覆執行特定次數的迴圈。此外,您可以建立另一個 Lambda 函數來啟動工作流程的新執行,並在每次啟動新的執行時減少計數。透過設定輸入中的執行次數,此狀態機器會結束並重新啟動指定次數的執行。
您將建立的狀態機器會實作下列狀態。
State | 用途 |
---|---|
|
設定 |
|
參考 |
|
使用Iterator 函數布林值來決定狀態機器是否應繼續範例運作或移至 ShouldRestart 狀態Choice 的狀態。 |
|
Pass 表示在實際實作中執行工作Task 的狀態。 |
|
使用 executionCount 值來決定其是否應結束一個執行並開始另一個執行,還是簡單結束Choice 的狀態。 |
|
Task 使用 Lambda 函數啟動狀態機器新執行的狀態。如同 Iterator 函數,此函數也會減少計數。Restart 狀態會將計數的遞減值傳遞至新執行的輸入。 |
必要條件
開始之前,請先瀏覽建立使用 Lambda 的 Step Functions 狀態機教學課程,以確保您熟悉將 Lambda 和 Step Functions 搭配使用。
步驟 1:建立 Lambda 函數來反覆計數
注意
如果您已完成在 Step Functions 驟函數中使用 Lambda 函數迭代循環教學課程,您可以略過此步驟,並使用該 Lambda 函數。
本節和在 Step Functions 驟函數中使用 Lambda 函數迭代循環教學課程示範如何使用 Lambda 函數來追蹤計數,例如,狀態機器中迴圈的反覆次數。
下列 Lambda 函數會接收 count
、 index
和 的輸入值step
。它會傳回包含更新 index
和名為 continue
布林值的這些值。true
如果 小於 index
,Lambda 函數會continue
設定為 count
。
您的狀態機器實作 Choice
狀態,然後執行一些應用程式邏輯,如果 continue
是 true
,或移至 ShouldRestart
(如果 continue
是 false
)。
建立迭代 Lambda 函數
-
開啟 Lambda 主控台
,然後選擇 Create function (建立函數)。 -
在 Create function (建立函數) 頁面上,選擇 Author from scratch (從頭開始撰寫)。
-
在基本資訊區段中,設定 Lambda 函數,如下所示:
-
針對 函數名稱 ,請輸入
Iterator
。 -
針對 執行時間,請選擇 Node.js 16.x。
-
保留頁面上的所有預設選擇,然後選擇建立函數 。
建立 Lambda 函數時,請在頁面右上角記下其 Amazon Resource Name (ARN),例如:
arn:aws:lambda:us-east-1:123456789012:function:Iterator
-
-
將 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 }) }
此程式碼接受輸入值為
count
、index
和step
。這會將step
的值增加index
,並傳回這些值及布林值continue
。如果index
低於count
,則continue
的值為true
。 -
選擇部署以部署程式碼。
測試迭代 Lambda 函數
若要查看您的 Iterate
函數運作狀況,請使用數值來執行該函數。您可以為 Lambda 函數提供輸入值,以模擬迭代,以查看您透過特定輸入值取得的輸出。
測試 Lambda 函數
-
在設定測試事件對話方塊中,選擇建立新的測試事件 ,然後
TestIterator
輸入事件名稱 。 -
將範例資料取代為以下內容。
{ "Comment": "Test my Iterator function", "iterator": { "count": 10, "index": 5, "step": 1 } }
這些值會模擬反覆運算期間來自狀態機器的內容。Lambda 函數會增加索引,並傳回
continue
為true
。當索引未低於count
,就會以false
的形式傳回continue
。對於此測試,索引已經增加到5
。結果應該將index
增加到6
和將continue
設定為true
。 -
選擇 Create (建立)。
-
在 上
迭代器
頁面,請確定TestIterator已列出,然後選擇測試 。測試結果會顯示在頁面頂端。選擇 Details (詳細資訊) 並檢閱結果。
{ "index": 6, "step": 1, "count": 10, "continue": true }
注意
如果您將此測試的
index
設定為9
,則index
會增加至10
,且continue
為false
。
步驟 2:建立重新啟動 Lambda 函數以啟動新的步驟函數執行
-
開啟 Lambda 主控台
,然後選擇 Create function (建立函數)。 -
在 Create function (建立函數) 頁面上,選擇 Author from scratch (從頭開始撰寫)。
-
在基本資訊區段中,設定 Lambda 函數,如下所示:
-
針對 函數名稱 ,請輸入
Restart
。 -
針對 執行時間,請選擇 Node.js 16.x。
-
-
保留頁面上的所有預設選擇,然後選擇建立函數 。
建立 Lambda 函數時,請在頁面右上角記下其 Amazon Resource Name (ARN),例如:
arn:aws:lambda:us-east-1:123456789012:function:Iterator
-
將 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); }); }
-
選擇部署以部署程式碼。
步驟 3:建立狀態機器
現在您已建立兩個 Lambda 函數,請建立狀態機器。在此狀態機器中,ShouldRestart
和 Restart
狀態表示您在多次執行間中斷工作的方式。
範例 ShouldRestart 選擇狀態
下列摘錄顯示 ShouldRestart
Choice
狀態。此狀態決定您是否應該重新啟動執行。
"ShouldRestart": {
"Type": "Choice",
"Choices": [
{
"Variable": "$.restart.executionCount",
"NumericGreaterThan": 1,
"Next": "Restart"
}
],
$.restart.executionCount
值包含在初始執行的輸入中。該值會在每次呼叫 Restart
函數時減 1,然後在每次後續執行時將該值放置於輸入中。
範例 重新啟動任務狀態
下列摘錄顯示 Restart
Task
狀態。此狀態會使用您先前建立的 Lambda 函數來重新啟動執行,並遞減計數,以追蹤要啟動的剩餘執行數目。
"Restart": {
"Type": "Task",
"Resource": "arn:aws:lambda:us-east-1:123456789012:function:Restart
",
"Next": "Done"
},
建立 狀態機器
-
開啟 Step Functions 主控台
,然後選擇建立狀態機器 。 在選擇範本對話方塊中,選取空白 。
選擇選取以在 中開啟 Workflow Studio設計模式。
-
對於本教學課程,您將在 中寫入狀態機器的 Amazon States Language(ASL) 定義程式碼編輯器。若要執行此操作,請選擇程式碼 。
-
移除現有的樣板程式碼並貼上下列程式碼。請記得將此程式碼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 } } } -
為您的狀態機器指定名稱。若要這麼做,請選擇 的預設狀態機器名稱旁的編輯圖示MyStateMachine。然後,在狀態機器組態 中,在狀態機器名稱方塊中指定名稱。
針對本教學課程,輸入名稱
ContinueAsNew
。 -
(選用) 在 狀態機器組態 中,指定其他工作流程設定,例如 狀態機器類型及其執行角色。
在此教學課程中,請保留 狀態機器設定 中的所有預設選擇。
如果您先前已為狀態機器建立具有正確許可IAM的角色,並想要使用它,請在許可 中,選取選擇現有角色 ,然後從清單中選擇角色。或選取輸入角色ARN,然後ARN為該IAM角色提供 。
-
在確認角色建立對話方塊中,選擇確認以繼續。
您也可以選擇檢視角色設定,以返回狀態機器組態 。
注意
如果您刪除 Step Functions 建立的角色,Step Functions 稍後無法重新建立該IAM角色。同樣地,如果您修改角色 (例如,從IAM政策的主體中移除 Step Functions),Step Functions 稍後無法還原其原始設定。
-
將此狀態機器的 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
其中包含應啟動新執行的次數。
-
在頁面上ContinueAsNew,選擇開始執行 。
隨即顯示開始執行對話方塊。
-
在啟動執行對話方塊中,執行下列動作:
-
(選用) 輸入自訂執行名稱以覆寫產生的預設值。
非ASCII名稱和記錄
Step Functions 接受包含非ASCII 字元的狀態機器、執行、活動和標籤的名稱。由於此類字元不適用於 Amazon CloudWatch,因此我們建議您僅使用 ASCII 個字元,以便在 中追蹤指標 CloudWatch。
-
在輸入方塊中,輸入下列JSON輸入以執行工作流程。
{ "restart": { "StateMachineArn": "
arn:aws:states:us-east-1:123456789012:stateMachine:ContinueAsNew
", "executionCount":4
} } -
使用
ContinueAsNew
狀態機器ARN的 更新StateMachineArn
欄位。 -
選擇 Start execution (開始執行)。
-
Step Functions 主控台會引導您前往標題為執行 ID 的頁面。此頁面稱為執行詳細資訊頁面。在此頁面上,您可以在執行進行時或完成後檢閱執行結果。
若要檢閱執行結果,請在圖形檢視 上選擇個別狀態,然後選擇步驟詳情窗格上的個別索引標籤,分別檢視每個狀態的詳細資訊,包括輸入、輸出和定義。如需您可以在執行詳細資訊頁面上檢視之執行資訊的詳細資訊,請參閱 執行細節概述。
圖形檢視會顯示四個執行中的第一個。在執行完成之前,它將通過
Restart
狀態並啟動新的執行。當此執行完成時,您可以查看正在執行的下一個執行。選取頂端ContinueAsNew的連結以查看執行清單。您應該會同時看到最近關閉的執行,以及
Restart
Lambda 函數啟動的持續執行。所有執行完成後,您應該會在清單中看到四個成功的執行。第一個開始執行會顯示您選擇的名稱,後續的執行具有產生的名稱。
-