Lambda 協調流程範例 - AWS Step Functions

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

Lambda 協調流程範例

此範例專案示範如何整合 Step AWS Lambda Functions 狀態機中的函式。

在此項目中,Step Functions 使用 Lambda 函數來檢查股票價格並確定買入或賣出交易建議。然後向用戶提供此建議,並可以選擇購買還是出售股票。使用 SNS 主題返回交易結果。

如需有關 Step Functions 服務整合的詳細資訊,請參閱下列內容:

注意

此範例專案可能需要付費。

對於新用 AWS 戶,可以使用免費用量方案。在此方案中,特定用量層級以下的服務皆為免費。如需有關 AWS 成本和免費方案的詳細資訊,請參閱定價

步驟 1:建立狀態機器並佈建資源

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

  2. Orchestrate Lambda functions在搜尋方塊中輸入,然後從傳回的搜尋結果中選擇 Orchestrate Lambda 函數

  3. 選擇 Next (下一步) 繼續。

  4. Step Functions 會列出您選取的範例專案中 AWS 服務 使用的項目。它也會顯示範例專案的工作流程圖表。將此項目部署到您的項目中, AWS 帳戶 或將其用作構建自己的項目的起點。根據您想要的進行方式,選擇 [執行示範] 或 [在其上建置]。

    此範例專案會部署下列資源:

    • 五大Lambda功能

    • Amazon Simple Queue Service 佇列

    • Amazon Simple Notification Service 主題

    • AWS Step Functions 狀態機器

    • 相關 AWS Identity and Access Management (IAM) 角色

    下圖顯示 Orchestrate Lambda 函數範例專案的工作流程圖形:

    
            協調Lambda功能範例專案的工作流程圖表。
  5. 選擇「使用範本」繼續進行選取。

  6. 執行以下任意一項:

    • 如果您選取「在其上建置」,「Step Functions」會為您選取的範例專案建立工作流程原型。Step Functions 不會部署工作流程定義中列出的資源。

      在工作流程 Studio 中設計模式,從拖放狀態狀態瀏覽器以繼續建立您的工作流程原型。或者切換到程式碼模式提供類似 VS 代碼的集成代碼編輯器,用於在 Step Functions 控制台中更新狀態機器的Amazon States Language(ASL)定義。如需有關使用工作流程 Studio 建置狀態機器的詳細資訊,請參閱使用工作流程

      重要

      請記得在執行工作流程之前,更新範例專案中使用之資源的預留位置 Amazon 資源名稱 (ARN)。

    • 如果您選取 [執行示範],Step Functions 會建立唯讀範例專案,該專案使用 AWS CloudFormation 範本將該範本中列出的 AWS 資源部署到您的 AWS 帳戶.

      提示

      若要檢視範例專案的狀態機定義,請選擇 [程式碼]。

      準備就緒後,請選擇 [部署並執行] 以部署範例專案並建立資源。

      建立這些資源和相關 IAM 許可最多可能需要 10 分鐘的時間。部署資源時,您可以開啟 CloudFormation Stack ID 連結以查看正在佈建的資源。

      建立範例專案中的所有資源之後,您可以在 [狀態機器] 頁面上看到列出的新範例專案。

      重要

      CloudFormation 範本中使用的每項服務可能會收取標準費用。

步驟 2:運行狀態機

佈建並部署所有資源之後,會顯示 [開始執行] 對話方塊。

  1. 在 [狀態電腦] 頁面上,選擇您的範例專案。

  2. 在範例專案頁面上,選擇 [開始執行]。

  3. 在 [開始執行] 對話方塊中,執行下列動作:

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

      注意

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

    2. (選擇性) 在「入」方塊中,以 JSON 格式輸入輸入值以執行工作流程。

      如果您選擇執行示範,則不需要提供任何執行輸入。

      注意

      如果您部署的示範專案包含預先填入的執行輸入資料,請使用該輸入來執行狀態機器。

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

    4. 「Step Functions」主控台會將您引導至標題為執行 ID 的頁面。此頁面稱為「執行詳細資訊」頁面。在此頁面上,您可以在執行進行時或完成之後複查執行結果。

      若要複查執行結果,請在「圖形」檢視中選擇個別狀態,然後選擇步驟詳情窗格上的個別索引標籤,分別檢視每個狀態的詳細資訊,包括輸入、輸出和定義。如需有關可在「執行詳細資訊」頁面檢視之執行資訊的詳細資訊,請參閱執行詳細資訊頁面 — 介面概觀

關於狀態機及其執行

此範例專案中的狀態機器 AWS Lambda 透過將參數直接傳遞至這些資源與整合,使用 Amazon SQS 佇列管理人工核准請求,並使用 Amazon SNS 主題傳回查詢結果。

Step Functions 執行會接收 JSON 文字做為輸入,並將該輸入傳遞至工作流程中的第一個狀態。各州接收 JSON 數據作為輸入,通常將 JSON 數據作為輸出傳遞到下一個狀態。在此範例專案中,每個步驟的輸出都會作為輸入傳遞至工作流程中的下一個步驟。例如,「產生買入/賣出」建議步驟會接收「檢查股票價格」步驟的輸出作為輸入。此外,「產生買/賣」建議步驟的輸出會作為輸入傳遞至下一個步驟「請求人工核准」,該步驟會模仿人工核准步驟。

注意

若要檢視步驟傳回的輸出以及傳遞至步驟的輸入,請開啟工作流程執行的「執行詳細資訊」頁面。在「步驟詳細資訊」區段中,檢視您在「檢視」模式中選取之每個步驟的輸入和輸出。

若要實作人工核准步驟,您通常會暫停工作流程執行,直到傳回工作 Token 為止。在此範例專案中,訊息會傳遞至 Amazon SQS 佇列,該佇列用作定義用來處理回呼功能之 Lambda 函數的觸發程序。訊息包含工作 Token,以及前述步驟傳回的輸出。Lambda 函數會使用訊息的有效負載來叫用。工作流程執行會暫停,直到它收到具有 SendTaskSuccessAPI 呼叫的工作 Token 為止。如需有關工作權杖的更多資訊,請參閱等候傳回任務字符的回呼

StepFunctionsSample-HelloLambda-ApproveSqsLambda函數的下列程式碼顯示如何將其定義為自動核准 Amazon SQS 佇列透過「Step Functions 數」狀態機提交的任何任務。

exports.lambdaHandler = (event, context, callback) => { const stepfunctions = new aws.StepFunctions(); // For every record in sqs queue for (const record of event.Records) { const messageBody = JSON.parse(record.body); const taskToken = messageBody.TaskToken; const params = { output: "\"approved\"", taskToken: taskToken }; console.log(`Calling Step Functions to complete callback task with params ${JSON.stringify(params)}`); // Approve stepfunctions.sendTaskSuccess(params, (err, data) => { if (err) { console.error(err.message); callback(err.message); return; } console.log(data); callback(null); }); } };

瀏覽此範例狀態機器,瞭解 Step Functions 如何控制 Lambda 和 Amazon SQS。

如需如何 AWS Step Functions 控制其他 AWS 服務的詳細資訊,請參閱AWS Step Functions 搭配其他服務使用

{ "StartAt": "Check Stock Price", "States": { "Check Stock Price": { "Type": "Task", "Resource": "arn:aws:lambda:us-west-1:111122223333:function:StepFunctionsSample-HelloLam-CheckStockPriceLambda-444455556666", "Next": "Generate Buy/Sell recommendation" }, "Generate Buy/Sell recommendation": { "Type": "Task", "Resource": "arn:aws:lambda:us-west-1:111122223333:function:StepFunctionsSample-Hello-GenerateBuySellRecommend-123456789012", "ResultPath": "$.recommended_type", "Next": "Request Human Approval" }, "Request Human Approval": { "Type": "Task", "Resource": "arn:aws:states:::sqs:sendMessage.waitForTaskToken", "Parameters": { "QueueUrl": "https://sqs.us-west-1.amazonaws.com/111122223333/StepFunctionsSample-HelloLambda4444-5555-6666-RequestHumanApprovalSqs-777788889999", "MessageBody": { "Input.$": "$", "TaskToken.$": "$$.Task.Token" } }, "ResultPath": null, "Next": "Buy or Sell?" }, "Buy or Sell?": { "Type": "Choice", "Choices": [ { "Variable": "$.recommended_type", "StringEquals": "buy", "Next": "Buy Stock" }, { "Variable": "$.recommended_type", "StringEquals": "sell", "Next": "Sell Stock" } ] }, "Buy Stock": { "Type": "Task", "Resource": "arn:aws:lambda:us-west-1:111122223333:function:StepFunctionsSample-HelloLambda-BuyStockLambda-000000000000", "Next": "Report Result" }, "Sell Stock": { "Type": "Task", "Resource": "arn:aws:lambda:us-west-1:111122223333:function:StepFunctionsSample-HelloLambda-SellStockLambda-111111111111", "Next": "Report Result" }, "Report Result": { "Type": "Task", "Resource": "arn:aws:states:::sns:publish", "Parameters": { "TopicArn": "arn:aws:sns:us-west-1:111122223333:StepFunctionsSample-HelloLambda1111-2222-3333-ReportResultSnsTopic-222222222222", "Message": { "Input.$": "$" } }, "End": true } } }

如需將 Step Functions 與其他 AWS 服務搭配使用時如何設定 IAM 的詳細資訊,請參閱整合式服務的 IAM 政策

IAM 範例

範例專案產生的這些範例 AWS Identity and Access Management (IAM) 政策包含執行狀態機器和相關資源所需的最低權限。我們建議您僅在 IAM 政策中加入必要的許可。

{ "Statement": [ { "Action": [ "lambda:InvokeFunction" ], "Resource": "arn:aws:lambda:us-west-1:111122223333:function:StepFunctionsSample-HelloLam-CheckStockPriceLambda-444455556666", "Effect": "Allow" } ] }
{ "Statement": [ { "Action": [ "lambda:InvokeFunction" ], "Resource": "arn:aws:lambda:us-west-1:111122223333:function:StepFunctionsSample-Hello-GenerateBuySellRecommend-123456789012", "Effect": "Allow" } ] }
{ "Statement": [ { "Action": [ "lambda:InvokeFunction" ], "Resource": "arn:aws:lambda:us-west-1:111122223333:function:StepFunctionsSample-HelloLambda-BuyStockLambda-777788889999", "Effect": "Allow" } ] }
{ "Statement": [ { "Action": [ "lambda:InvokeFunction" ], "Resource": "arn:aws:lambda:us-west-1:111122223333:function:StepFunctionsSample-HelloLambda-SellStockLambda-000000000000", "Effect": "Allow" } ] }
{ "Statement": [ { "Action": [ "sqs:SendMessage*" ], "Resource": "arn:aws:sqs:us-west-1:111122223333:StepFunctionsSample-HelloLambda4444-5555-6666-RequestHumanApprovalSqs-111111111111", "Effect": "Allow" } ] }
{ "Statement": [ { "Action": [ "sns:Publish" ], "Resource": "arn:aws:sns:us-west-1:111122223333:StepFunctionsSample-HelloLambda1111-2222-3333-ReportResultSnsTopic-222222222222", "Effect": "Allow" } ] }

如需將 Step Functions 與其他 AWS 服務搭配使用時如何設定 IAM 的詳細資訊,請參閱整合式服務的 IAM 政策