本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
在 Step Functions 驟函數中使用 Lambda 函數迭代循環
在此教學課程中,您將實作設計模式,其會使用狀態機器和 AWS Lambda 函數反覆運算迴圈特定的次數。
每當您需要追蹤狀態機器中的迴圈次數時,請使用此設計模式。此實作可協助您中斷大型任務,或將長時間執行的執行分割成較小區塊,或在特定事件數量後結束執行。您可以使用類似的實作來定期結束並重新啟動長時間執行的執行,以避免超過 AWS Step Functions AWS Lambda、或其他服務的服 AWS 務配額。
在開始之前,請先閱讀建立使用 Lambda 的 Step Functions 狀態機教學課程,以確保您熟悉一起使用 Lambda 和 Step Functions。
步驟 1:創建一個 Lambda 函數以迭代計數
透過使用 Lambda 函數,您可以追蹤狀態機器中迴圈的迭代次數。下列 Lambda 函數會接收count
index
、和的輸入值step
。它會傳回包含更新 index
和名為 continue
布林值的這些值。如果小於,true
則 Lambda 函數會index
設定continue
為count
。
您的狀態機器會實作 Choice
狀態,如果 continue
為 true
,其將執行一些應用程式邏輯,如果為 false
則結束。
建立 Lambda 函數
-
登入 Lambda 主控台
,然後選擇 [建立函數]。 -
在 Create function (建立函數) 頁面上,選擇 Author from scratch (從頭開始撰寫)。
-
在「基本資訊」區段中,設定 Lambda 函數,如下所示:
-
針對 函數名稱 ,請輸入
Iterator
。 -
針對 Runtime (執行時間),選擇 Node.js 。
-
在 [變更預設執行角色] 中,選擇 [使用基本 Lambda 權限建立新角色]。
-
選擇建立函數。
-
-
將 Lambda 函數的下列程式碼複製到程式碼來源中。
export const handler = function (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
。 -
選擇部署。
步驟 2:測試 Lambda 函數
使用數值執行 Lambda 函數,以便在運作中查看該函數。您可以為模擬迭代的 Lambda 函數提供輸入值。
若要測試您的 Lambda 函數
-
選擇 測試。
-
在 [設定測試事件] 對話方塊
TestIterator
中,輸入 [事件名稱] 方塊。 -
將範例資料取代為以下內容。
{ "Comment": "Test my Iterator function", "iterator": { "count": 10, "index": 5, "step": 1 } }
這些值會模擬反覆運算期間來自狀態機器的內容。Lambda 函數將遞增索引,並在索引小
true
於continue
時返回count
。對於此測試,索引已經增加到5
。測試將遞增index
至6
並設定continue
為true
。 -
選擇 Create (建立)。
-
選擇「測試」以測試您的 Lambda 函數。
測試結果會顯示在 [執行結果] 索引標籤中。
-
選擇 [執行結果] 索引標籤以查看輸出。
{ "index": 6, "step": 1, "count": 10, "continue": true }
注意
如果您將設
index
定為9
並再次測試10
,則continue
會index
增量為和false
。
步驟 3:建立狀態機器
離開 Lambda 主控台之前...
複製 Lambda 函數ARN。將其粘貼到註釋中。下一個步驟將需要此值。
接下來,您將建立具有下列狀態的狀態機器:
-
ConfigureCount
— 設定count
、index
和的預設值step
。 -
Iterator
— 參照您之前建立的 Lambda 函數,並傳入中設定的值ConfigureCount
。 -
IsCountReached
— 根據Iterator
函數傳回的值,繼續迴圈或繼續Done
狀態的選擇狀態。 -
ExampleWork
— 需要完成工作的存根。在此範例中,工作流程具有Pass
狀態,但在實際解決方案中,您可能會使用Task
. -
Done
— 工作流程的結束狀態。
要在控制台中創建狀態機:
-
開啟 Step Functions 主控台
,然後選擇 [建立狀態機器]。 重要
您的狀態機器必須與 Lambda 函數位於相同的 AWS 帳戶和區域。
-
選取「空白」範本。
-
在「程式碼」窗格中,貼上JSON定義狀態機器的下列項目。
如需 Amazon 州語言的詳細資訊,請參閱狀態機器結構。
{ "Comment": "Iterator State Machine Example", "StartAt": "ConfigureCount", "States": { "ConfigureCount": { "Type": "Pass", "Result": { "count": 10, "index": 0, "step": 1 }, "ResultPath": "$.iterator", "Next": "Iterator" }, "Iterator": { "Type": "Task", "Resource": "
arn:aws:lambda:us-east-1:123456789012:function:Iterate
", "ResultPath": "$.iterator", "Next": "IsCountReached" }, "IsCountReached": { "Type": "Choice", "Choices": [ { "Variable": "$.iterator.continue", "BooleanEquals": true, "Next": "ExampleWork" } ], "Default": "Done" }, "ExampleWork": { "Comment": "Your application logic, to run a specific number of times", "Type": "Pass", "Result": { "success": true }, "ResultPath": "$.result", "Next": "Iterator" }, "Done": { "Type": "Pass", "End": true } } } -
將
Iterator Resource
欄位取代ARN為您之前建立的Iterator
Lambda 函數。 -
選取「Config」,然後輸入狀態機的「名稱」,例如
。IterateCount
注意
狀態機器、執行項目和活動工作的名稱長度不得超過 80 個字元。這些名稱對於您的帳戶和 AWS 地區而言必須是唯一的,且不得包含以下任何一項:
-
空白符號
-
萬用字元 (
? *
) -
括號字元 (
< > { } [ ]
) -
特殊字元 (
" # % \ ^ | ~ ` $ & , ; : /
) -
控制字符(
\\u0000
-\\u001f
或\\u007f
-\\u009f
)。
Step Functions 接受包含非ASCII字元的狀態機器、執行項目、活動和標籤的名稱。由於ASCII包含非ASCII字元的名稱不適用於 Amazon CloudWatch,因此我們建議您僅使用字元,以便您可以追蹤中的指標。 CloudWatch
-
-
對於「類型」,接受預設值為「標準」。針對「權限」,選擇「建立新角色」。
-
選擇 [建立],然後選擇 [確認角色建立]。
步驟 4:開始新的執行
建立狀態機器後,您就可以開始執行。
-
在IterateCount頁面上,選擇 [開始執行]。
-
(選擇性) 若要識別您的執行項目,您可以指定名稱,或使用預設產生的執行名稱。
注意
Step Functions 接受包含非ASCII字元的狀態機器、執行項目、活動和標籤的名稱。由於ASCII包含非ASCII字元的名稱不適用於 Amazon CloudWatch,因此我們建議您僅使用字元,以便您可以追蹤中的指標。 CloudWatch
-
選擇 Start Execution (開始執行)。
狀態機器的新執行隨即開始,顯示您正在執行的執行。
執行會以步驟遞增,並使用 Lambda 函數追蹤計數。每次反覆運算時,其會執行在狀態機器中以
ExampleWork
狀態參考的範例工作。計數達到狀態機器中指定的
ConfigureCount
狀態的數量後,執行會結束反覆運算並退出。