整合 AWS Lambda 在一個 Step Functions 狀態機與 Amazon SQS 和 Amazon SNS - AWS Step Functions

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

整合 AWS Lambda 在一個 Step Functions 狀態機與 Amazon SQS 和 Amazon SNS

此範例專案示範如何整合 AWS Lambda 步驟函數中的功能狀態機器。

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

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

注意

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

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

步驟 1:建立狀態機

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

  2. Orchestrate Lambda functions在搜尋方塊中輸入,然後選擇 [協調] Lambda 返回的搜索結果中的功能。

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

  4. 選擇 [執行示範] 以建立唯讀和 ready-to-deploy 工作流程,或選擇 [在其上建置] 建立可編輯的狀態機定義,您可以在其上建置並稍後進行部署。

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

    • 五 Lambda 函數

    • 同時 Amazon Simple Queue Service 佇列

    • 同時 Amazon Simple Notification Service 主題

    • 同時 AWS Step Functions 狀態機器

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

    下圖顯示協調的工作流程圖形 Lambda 函數示例項目:

    協調的工作流程圖 Lambda 函數示例項目。
  5. 選擇「使用範本」繼續進行選取。

下一步取決於您之前的選擇:

  1. 執行示範 — 您可以先檢閱狀態機器,然後再建立唯讀專案,其中包含部署的資源 AWS CloudFormation 到您的 AWS 帳戶.

    您可以檢視狀態機器定義,當您準備就緒時,請選擇 [部署並執行] 以部署專案並建立資源。

    部署最多可能需要 10 分鐘的時間來建立資源和權限。您可以使用「堆疊 ID」連結來監控進度 AWS CloudFormation.

    部署完成後,您應該會在控制台中看到新的狀態機器。

  2. 建立在其上 — 您可以檢閱和編輯工作流程定義。您可能需要在範例專案中設定預留位置的值,然後才能嘗試執行自訂工作流程。

注意

部署到您帳戶的服務可能需要支付標準費用。

步驟 2:運行狀態機

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

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

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

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

    1. (選擇性) 輸入自訂執行名稱,以覆寫產生的預設值。

      非ASCII名稱和記錄

      Step Functions 接受包含非ASCII字元的狀態機器、執行項目、活動和標籤的名稱。由於此類字元不適用於 Amazon CloudWatch,因此我們建議您僅使用ASCII字元,以便在中追蹤指標 CloudWatch。

    2. (選擇性) 在「入」方塊中,將輸入值輸入為JSON。如果您正在運行演示,則可以跳過此步驟。

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

    「Step Functions」主控台會將您導向「執行詳細資訊」頁面,您可以在其中選擇「圖形」檢視中的狀態,以瀏覽步驟詳情窗格中的相關資訊。

關於狀態機及其執行

此示例項目中的狀態機集成了 AWS Lambda 將參數直接傳遞給這些資源,使用 Amazon SQS 佇列來管理人工核准的請求,並使用 Amazon SNS 主題傳回查詢結果。

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

注意

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

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

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

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 服務,請參閱整合服務與 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 } } }

有關如何在使用步驟函數與其他功能IAM時進行配置的資訊 AWS 服務,請參閱Step Functions 式如何為整合式服務產生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" } ] }

有關如何在使用步驟函數與其他功能IAM時進行配置的資訊 AWS 服務,請參閱Step Functions 式如何為整合式服務產生IAM原則