本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
使用 Lambda 函數繼續新的執行
您可以建立使用 Lambda 函數的狀態機器,在目前的執行終止之前開始新的執行。使用此方法在新的執行中繼續進行中的工作,可讓您擁有可以將大型工作分解為較小工作流程的狀態機器,或者擁有無限期執行的狀態機器。
本教學課程以使用外部 Lambda 函數修改工作流程的概念為基礎,此概念已在用 Lambda 迭代一個循環教學課程中展示。您可以使用相同的 Lambda 函數 (Iterator
) 來反覆執行特定次數的迴圈。此外,您還可以建立另一個 Lambda 函數來開始新的工作流程執行,並在每次啟動新執行時遞減計數。透過設定輸入中的執行次數,此狀態機器會結束並重新啟動指定次數的執行。
您將建立的狀態機器會實作下列狀態。
State | 用途 |
---|---|
|
一種 |
|
參考 |
|
使用Iterator 函數中的 Boolean 值來決定狀態機是否應該繼續範例工作,還是移至ShouldRestart 狀態的狀態。Choice |
|
表示將在實際實施中執行工作的Task 狀態的狀態。Pass |
|
使用executionCount 值來決定是否應該結束某個執行並開始另一個執行,或直接結束的Choice 狀態。 |
|
使用 Lambda 函數來啟動Task 狀態機器的新執行的狀態。如同 Iterator 函數,此函數也會減少計數。狀Restart 態將計數的遞減值傳遞給新執行的輸入。 |
必要條件
在開始之前,請先閱讀建立使用 Lambda 的 Step Functions 狀態機器教學課程,以確保您熟悉一起使用 Lambda 和 Step Functions。
主題
步驟 1:創建一個 Lambda 函數以迭代計數
注意
如果您已完成用 Lambda 迭代一個循環教學課程,則可以略過此步驟並使用該 Lambda 函數。
本節和用 Lambda 迭代一個循環教學課程說明如何使用 Lambda 函數追蹤計數,例如狀態機器中迴圈的迭代次數。
下列 Lambda 函數會接收count
index
、和的輸入值step
。它會傳回包含更新 index
和名為 continue
布林值的這些值。如果小於,true
則 Lambda 函數會index
設定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 資源名稱 (ARN),例如:
arn:aws:lambda:us-east-1:123456789012:function:Iterator
-
-
將 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 }) }
此程式碼接受輸入值為
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
。 -
選擇建立。
-
在 Lambda 主控台的 [
迭代器
] 頁面上,確定TestIterator已列出,然後選擇 [測試]。測試結果會顯示在頁面頂端。選擇 Details (詳細資訊) 並檢閱結果。
{ "index": 6, "step": 1, "count": 10, "continue": true }
注意
如果您將此測試的
index
設定為9
,則index
會增加至10
,且continue
為false
。
步驟 2:建立重新啟動 Lambda 函數以開始執行新的 Step Functions 數
-
開啟 Lambda 主控台
,然後選擇 Create function (建立函數)。 -
在 Create function (建立函數) 頁面上,選擇 Author from scratch (從頭開始撰寫)。
-
在「基本資訊」區段中,設定 Lambda 函數,如下所示:
-
針對 函數名稱 ,請輸入
Restart
。 -
針對 執行時間,請選擇 Node.js 16.x。
-
-
保留頁面上的所有預設選項,然後選擇 [建立功能]。
建立 Lambda 函數時,請在頁面右上角記下其 Amazon 資源名稱 (ARN),例如:
arn:aws:lambda:us-east-1:123456789012:function:Iterator
-
將 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); }); }
-
選擇部署以部署程式碼。
步驟 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 主控台
,然後選擇建立狀態機器。 在「選擇範本」對話方塊中,選取「空白」。
選擇選取。這會在設計模式中開啟工作流程工作室
-
在本教學課程中,您將在程式碼編輯器. Amazon States Language 要做到這一點,選擇代碼。
-
刪除現有的樣板代碼並粘貼以下代碼。請記得將此程式碼中的 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 } } } -
指定狀態機的名稱。若要執行此操作,請選擇的預設狀態機器名稱旁邊的編輯圖示MyStateMachine。然後,在 [狀態機器組態] 中,在 [狀態機器名稱] 方塊中指定名稱。
針對本教學課程,輸入名稱
ContinueAsNew
。 -
(選擇性) 在狀態機器組態中,指定其他工作流程設定,例如狀態機器類型及其執行角色。
在本教學課程中,請保留狀態機器設定中的所有預設選項。
如果您先前已使用狀態機器的正確許可建立 IAM 角色,並且想要使用它,請在 [權限] 中選取 [選擇現有角色],然後從清單中選取角色。或選取 [輸入角色 ARN],然後為該 IAM 角色提供 ARN。
-
在 [確認角色建立] 對話方塊中,選擇 [確認] 以繼續。
您也可以選擇 [檢視角色設定] 以返回 [狀態機器組態]。
注意
如果您刪除 Step Functions 建立的 IAM 角色,則 Step Functions 稍後無法重新建立。同樣地,如果您修改角色 (例如,透過從 IAM 政策中的主體移除 Step Functions),Step Functions 稍後無法還原其原始設定。
-
將此狀態機器的 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
,以指示應啟動新執行的次數。
-
在ContinueAsNew頁面上,選擇 [開始執行]。
此時會顯示「開始執行」對話方塊。
-
在 [開始執行] 對話方塊中,執行下列動作:
-
(選擇性) 若要識別您的執行項目,您可以在「名稱」(Name) 方塊中指定執行項目的名稱。默認情況下,Step Functions 自動生成一個唯一的執行名稱。
注意
Step Functions 允許您為狀態機器,執行和活動以及包含非 ASCII 字符的標籤創建名稱。這些非 ASCII 名稱不適用於 Amazon CloudWatch。若要確保您可以追蹤 CloudWatch 量度,請選擇僅使用 ASCII 字元的名稱。
-
在 [輸入] 方塊中,輸入下列 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 函數啟動的持續執行。所有執行完成後,您應該會在清單中看到四個成功的執行。第一個開始執行會顯示您選擇的名稱,後續的執行具有產生的名稱。
-