用 Lambda 迭代一個循環 - AWS Step Functions

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

用 Lambda 迭代一個循環

在此教學課程中,您將實作設計模式,其會使用狀態機器和 AWS Lambda 函數反覆運算迴圈特定的次數。

每當您需要追蹤狀態機器中的迴圈次數時,請使用此設計模式。此實作可協助您中斷大型任務,或將長時間執行的執行分割成較小區塊,或在特定事件數量後結束執行。您可以使用類似的實作來定期結束並重新啟動長時間執行的執行,以避免超過 AWS Step Functions AWS Lambda、或其他服務的服 AWS 務配額。

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

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

透過使用 Lambda 函數,您可以追蹤狀態機器中迴圈的迭代次數。下列 Lambda 函數會接收countindex、和的輸入值step。它會傳回包含更新 index 和名為 continue 布林值的這些值。如果小於,true則 Lambda 函數會index設定continuecount

您的狀態機器會實作 Choice 狀態,如果 continuetrue,其將執行一些應用程式邏輯,如果為 false 則結束。

建立 Lambda 函數

  1. 登入 Lambda 主控台,然後選擇 [建立函數]。

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

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

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

    2. 針對 Runtime (執行時間),選擇 Node.js

    3. 在 [變更預設執行角色] 中,選擇 [使用基本 Lambda 權限建立新角色]。

    4. 選擇建立函數

  4. 將 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 }) }

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

  5. 選擇部署

步驟 2:測試 Lambda 函數

使用數值執行 Lambda 函數,以便在運作中查看該函數。您可以為模擬迭代的 Lambda 函數提供輸入值。

若要測試您的 Lambda 函數

  1. 選擇 測試

  2. 在 [設定測試事件] 對話方塊TestIterator中,輸入 [事件名稱] 方塊。

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

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

    這些值會模擬反覆運算期間來自狀態機器的內容。Lambda 函數將遞增索引,並在索引小truecontinue時返回count。對於此測試,索引已經增加到 5。測試將遞增index6並設定continuetrue

  4. 選擇建立

  5. 選擇 [測試] 以測試您的 Lambda 函數。

    測試結果會顯示在 [執行結果] 索引標籤中。

  6. 選擇 [執行結果] 索引標籤以查看輸出。

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

    如果您將設index定為9並再次測試10,則continueindex增量為和false

步驟 3:建立狀態機器

離開 Lambda 主控台之前...

複製 Lambda 函數 ARN。將其粘貼到註釋中。下一個步驟將需要此值。

接下來,您將建立具有下列狀態的狀態機器:

  • ConfigureCount— 設定countindex和的預設值step

  • Iterator— 參照您之前建立的 Lambda 函數,並傳入中設定的值ConfigureCount

  • IsCountReached— 根據Iterator函數傳回的值,繼續迴圈或繼續Done狀態的選擇狀態。

  • ExampleWork— 需要完成工作的存根。在此範例中,工作流程具有Pass狀態,但在實際解決方案中,您可能會使用Task.

  • Done— 工作流程的結束狀態。

若要在主控台中建立狀態機器:

  1. 開啟 Step Functions 主控台,然後選擇 [建立狀態機器]。

    重要

    您的狀態機器必須與 Lambda 函數位於相同的 AWS 帳戶和區域中。

  2. 選取「空白」範本。

  3. 在「程式碼」窗格中,貼上下列定義狀態機器的 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 } } }
  4. Iterator Resource欄位取代為您先前建立的 Iterator Lambda 函數的 ARN。

  5. 選取「Config」,然後輸入狀態機器的「名稱」,例如IterateCount

    注意

    狀態機器、執行項目和活動工作的名稱長度不得超過 80 個字元。這些名稱對於您的帳戶和 AWS 地區而言必須是唯一的,且不得包含以下任何一項:

    • 空白

    • 萬用字元 (? *)

    • 括號字元 (< > { } [ ])

    • 特殊字元 (" # % \ ^ | ~ ` $ & , ; : /)

    • 控制字符(\\u0000-\\u001f\\u007f-\\u009f)。

    如果您的狀態機器的類型為 Express,則可以為狀態機器的多個執行提供相同的名稱。即使多個執行具有相同的名稱,Step Functions 也會為每個 Express 狀態機器執行產生唯一的執行 ARN。

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

  6. 對於「類型」,接受預設值為「標準」。針對「權限」,選擇「建立新角色」。

  7. 選擇 [建立],然後選擇 [確認角色建立]。

步驟 4:開始新的執行

建立狀態機器後,您就可以開始執行。

  1. IterateCount頁面上,選擇 [開始執行]。

  2. (選擇性) 若要識別您的執行項目,您可以在「名稱」(Name) 方塊中指定執行項目的名稱。默認情況下,Step Functions 自動生成一個唯一的執行名稱。

    注意

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

  3. 選擇 Start Execution (開始執行)

    狀態機器的新執行隨即開始,顯示您正在執行的執行。

    狀態機器圖形視圖,以藍色顯示迭代器狀態,以指示進行中的狀態。

    執行會以步驟遞增,並使用 Lambda 函數追蹤計數。每次反覆運算時,其會執行在狀態機器中以 ExampleWork 狀態參考的範例工作。

    計數達到狀態機器中指定的 ConfigureCount 狀態的數量後,執行會結束反覆運算並退出。

    狀態機器圖形檢視,以綠色顯示 [迭代器] 狀態和 [完成] 狀態,表示兩者都已成功。