教學課程 3:在工作流程中實作 if-else 條件 - AWS Step Functions

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

教學課程 3:在工作流程中實作 if-else 條件

您可以使用狀態Choice,在工作流程中實作 if-else 條件。它會根據指定的條件評估為 true 或 false 來決定工作流程執行路徑。

在本教學課程中,您將新增條件式邏輯,以判斷教學課程 2 中使用的 RandomNumberforCredit Lambda 函數傳回的已套用信用金額是否超過特定的閾值限制。如果金額超過閾值限制,則應用程序需要人工互動以進行批准。否則,應用程式會自動核准,並進入下一個步驟。

您將通過暫停工作流執行,直到返回任務令牌來模仿人工互動步驟。為此,您將傳遞一個任務令牌到您將在本教程中使用的 AWS SDK 集成,這是亞馬遜簡單通知服務。工作流程執行將暫停,直到它通過 SendTaskSuccessAPI 調用收到任務令牌返回為止。如需有關使用工作權杖的更多資訊,請參閱等候傳回任務字符的回呼

因為您已經在工作流程原型中定義了人工核准和自動核准的步驟,因此在本教學中,您會先建立接收回呼 Token 的 Amazon SNS 主題。然後,您可以建立 Lambda 函數來實作回呼功能。最後,您可以透過新增這些AWS 服務整合的詳細資訊來更新工作流程原型。

步驟 1:建立接收回呼權杖的 Amazon SNS 主題

若要實作人工互動步驟,您將發佈到 Amazon 簡單通知服務主題,並將回呼任務 Token 傳遞給此主題。回呼工作將暫停工作流程執行,直到傳回包含有效負載的工作 Token 為止。

  1. 開啟 Amazon SNS 主控台並建立標準主題類型。如需建立主題的相關資訊,請參閱 Amazon 簡單通知服務開發人員指南中的建立 Amazon SNS 主題

  2. 將主題名稱指定為TaskTokenTopic

  3. 確保複製主題 ARN 並將其保存在文本文件中。指定 [等待人工核准] 狀態的服務整合時,您需要主題 ARN。以下是 ARN 的範例主題:

    arn:aws:sns:us-east-2:123456789012:TaskTokenTopic
  4. 為主題建立以電子郵件為基礎的訂閱,然後確認您的訂閱。如需訂閱主題的相關資訊,請參Amazon 簡單通知服務開發人員指南中的建立主題訂閱。

第 2 步:創建一個 Lambda 函數來處理回調

若要處理回呼功能,您需要定義 Lambda 函數,並將您在步驟 1 中建立的 Amazon SNS 主題新增為此函數的觸發器。當您使用任務權杖發佈到 Amazon SNS 主題時,會使用已發佈訊息的承載叫用 Lambda 函數。

步驟 2.1:創建 Lambda 函數來處理回調

在此功能中,您將處理信用額度核准請求,並透過 SendTaskSuccessAPI 呼叫成功傳回要求的結果。此 Lambda 函數也會傳回從 Amazon SNS 主題收到的任務權杖。

為了簡單起見,用於人工互動步驟的 Lambda 函數會自動核准任何工作,並透過 SendTaskSuccess API 呼叫傳回任務 Token。您可以將 Lambda 函數命名為callback-human-approval

  1. 在新索引標籤或視窗中,開啟 Lambda 主控台並建立標題callback-human-approvalNode.js 16.x Lambda 函數。如需使用主控台建立 Lambda 函數的詳細資訊,請參閱AWS Lambda開發人員指南中的主控台中的建立 Lambda 函數

  2. callback-human-approval頁面上,以下列程式碼取代 [程式碼原始碼] 區域中的現有程式碼。

    // Sample Lambda function that will automatically approve any task whenever a message is published to an Amazon SNS topic by Step Functions. console.log('Loading function'); const AWS = require('aws-sdk'); const resultMessage = "Successful"; exports.handler = async (event, context) => { const stepfunctions = new AWS.StepFunctions(); let message = JSON.parse(event.Records[0].Sns.Message); let taskToken = message.TaskToken; console.log('Message received from SNS:', message); console.log('Task token: ', taskToken); // Return task token to Step Functions let params = { output: JSON.stringify(resultMessage), taskToken: taskToken }; console.log('JSON Returned to Step Functions: ', params); let myResult = await stepfunctions.sendTaskSuccess(params).promise(); console.log('State machine - callback completed..'); return myResult; };
  3. 保持此視窗開啟,並執行下一節中的步驟,以進行進一步的動作。

步驟 2.2:將亞馬遜 SNS 主題新增為 Lambda 函數的觸發器

當您將在本教學課程步驟 1 中建立的 Amazon SNS 主題新增為您在本教學課程步驟 2.1 中建立的 Lambda 函數的觸發器時,每次您發佈到 Amazon SNS 主題時都會觸發 Lambda 函數。當您使用任務權杖發佈到 Amazon SNS 主題時,會使用已發佈訊息的承載叫用 Lambda 函數。如需設定 Lambda 函數觸發器的詳細資訊,請參閱開發AWS Lambda人員指南中的設定觸發程序

  1. callback-human-approval Lambda 函數的 [函數概觀] 區段中,選擇 [新增觸發器]。

  2. 從觸發器的下拉式清單中,選擇 SNS 做為觸發器。

  3. 對於 SNS 主題,請開始輸入您在本教學課程的步驟 1 中建立的 Amazon SNS 主題名稱,然後從顯示的下拉式清單中選擇名稱。

  4. 選擇 Add (新增)。

  5. 保持此視窗開啟,並執行下一節中的步驟,以進行進一步的動作。

步驟 2.3:為 Lambda 函數 IAM 角色提供必要的許可

您必須提供 callback-human-approval Lambda 函數的許可,才能存取步驟函數,以便傳回任務權杖以及 SendTaskSucess API 呼叫。

  1. callback-human-approval頁面上,選擇 [組態] 索引標籤,然後選擇 [權限]。

  2. 在 [執行角色] 底下,選擇 [角色] 名稱以導覽至主AWS Identity and Access Management控台的 [角色] 頁面。

  3. 若要新增必要的權限,請選擇 [新增權限],然後選擇 [附加原則]。

  4. 在搜尋方塊中,輸入,AWSStepFunctions然後按 Enter 鍵。

  5. 選擇AWSStepFunctionsFullAccess然後向下捲動以選擇 [附加原則]。這會新增包含 callback-human-approval Lambda 函數角色必要權限的原則。

第 3 步:更新工作流-添加 if-else 條件邏輯在選擇狀態

在「步驟函數」主控台中,使用Choice狀態為工作流程定義條件式邏輯。如果 RandomNumberforCredit Lambda 函數傳回的輸出小於 5000,則會自動核准要求的點數。如果傳回的輸出大於或等於 5000,則工作流程執行會繼續進行信用額度核准的人工互動步驟。

Choice狀態下,您可以使用比較運算子來比較輸入變數與特定值。您可以在啟動狀態機器執行時將輸入變數指定為執行輸入,或使用前一個步驟的輸出作為目前步驟的輸入。默認情況下,一個步驟的輸出存儲在一個名為的變量Payload。若要在Choice狀態中使用Payload變數的值進行比較,請使用下列程序所示的$語法。

有關資訊如何從一個狀態流向另一個狀態,以及如何在工作流程中指定輸入和輸出的資訊,請參閱教學課程 7:設定輸入和輸出Step Functions 中的輸入和輸出處理

注意

如果狀Choice態使用狀態機器執行輸入中指定的輸入變數進行比較,請使用$.variable_name語法來執行比較。例如,若要比較變數,例如myAge,請使用語法$.myAge

因為在這個步驟中,Choice狀態會從 [取得信用額度] 狀態接收輸入,所以您將使用Choice狀態設定的$語法。若要探索當您使用狀態組態中的$.variable_name語法來參照上述步驟的輸出時,Choice狀態機器執行的結果有何不同,請參閱教學課程 8 中的偵錯無效路徑選擇狀態錯誤章節。

若要使用狀態新增 if-else 條件邏輯 Choice
  1. 開啟包含您在中建立之工作流程原型的「步驟函數」主控台視窗教學 1:建立狀態機的原型

  2. 選擇已套用的信用額度大於等於 5000? state 並在「組態」索引標籤中,指定條件式邏輯,如下所示:

    1. 在「選擇規則」下,選擇「規則 #1」圖標中的「編輯」 圖示,以定義第一個選擇規則。

    2. 選擇 [新增條件]。

    3. 在「規則 #1 的條件」對話方塊中,對於「變數」,輸入$

    4. 對於「運算子,選擇小於

    5. 對於「」,請選擇「數字常數」,然後5000在「」下拉式清單旁邊的欄位中輸入。

    6. 選擇 [儲存條件]。

    7. 對於「然後」下一個狀態為:下拉式清單,請選擇「自動核准限制」。

    8. 選擇「新增選擇規則」,然後在貸方金額大於或等於 5000 時,透過重複子步驟 2.b 到 2.f 來定義第二個選擇規則。對於「運算子」,請選擇「大於」或「等於」。

    9. 對於「然後」下一個狀態為:下拉式清單,請選擇「等待人工核准」。

    10. 在 [預設規則] 方塊中,選擇 [編輯] 圖示以定義預設選擇規則,然後從 [預設狀態] 下拉式清單中選擇 [等待人工核准]。如果沒有任何「選擇」狀態條件評估為 true 或 false,您可以定義「預設」規則,以指定要轉換到的下一個狀態。

  3. 設定 [等待人工核准] 狀態,如下所示:

    1. 在「組態」索引標籤的「主題」中,開始輸入 Amazon SNS 主題的名稱 TaskTokenTopic,然後選擇下拉式清單中顯示的名稱。

    2. 對於「訊息」,從下拉式清單中選擇「輸入訊息」。在訊息欄位中,您可以指定要發佈到 Amazon SNS 主題的訊息。在本教學課程中,您會將工作 Token 發佈為訊息。

      工作 Token 可讓您暫停標準類型步驟函數工作流程,直到外部處理程序完成並傳回工作 Token 為止。當您透過指定.waitForTaskToken服務整合模式將 T ask 狀態指定為回呼任務時,會產生任務 Token,並在任務啟動時將其置於前後關聯物件中。上下文對象是一個內部 JSON 結構,可在執行期間使用,並包含有關您的狀態機器及其執行的信息。如需前後關聯物件的詳細資訊,請參閱內容物件

    3. 在出現的方塊中,輸入以下內容作為訊息:

      { "TaskToken.$": "$$.Task.Token" }
    4. 選擇等待回呼核取方塊。

    5. 在出現對話方塊中選擇「完成」。

  4. 保持此視窗開啟,並繼續下一個教學課程,以進行進一步的動作。

後續步驟

在下一個教程中,您將學習如何並行執行多個任務。