本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
使用 AmazonSQS,Amazon SNS 和 Lambda 創建回調模式示例
這個示例項目演示了如何擁有 AWS Step Functions 在工作期間暫停,並等待外部處理序傳回工作開始時產生的工作 Token。
當這個範例專案部署完成且開始執行後,便會發生下列步驟。
Step Functions 會將包含任務權杖的訊息傳遞至 Amazon 簡單佇列服務 (AmazonSQS) 佇列。
Step Functions 然後暫停,等待返回該令牌。
Amazon SQS 隊列觸發 AWS Lambda 使用相同任務令牌調
SendTaskSuccess
用的函數。當收到該任務字符時,工作流程就會繼續進行。
該
"Notify Success"
任務發布 Amazon 簡單通知服務(AmazonSNS)消息,說明已收到回調。
若要瞭解如何在 Step Functions 式中實作回呼模式,請參閱使用任務令牌等待回調。
有關如何進一步了解 AWS Step Functions 可以控制其他 AWS 服務,請參閱整合服務與 Step Functions。
步驟 1:建立狀態機
-
開啟 Step Functions 主控台
,然後選擇建立狀態機器。 -
Callback pattern example
在搜尋方塊中輸入,然後從傳回的搜尋結果中選擇「回呼」模式範例。 -
選擇 Next (下一步) 繼續。
-
選擇 [執行示範] 以建立唯讀和 ready-to-deploy 工作流程,或選擇 [在其上建置] 建立可編輯的狀態機定義,您可以在其上建置並稍後進行部署。
此範例專案會部署下列資源:
-
Amazon SQS 消息隊列。
-
呼叫 Step Functions 函數API動作的 Lambda 函數SendTaskSuccess。
-
一個 Amazon SNS 主題,用於通知任務成功或失敗,指示工作流程是否可以繼續。
-
同時 AWS Step Functions 狀態機器
-
相關 AWS Identity and Access Management (IAM) 角色
下圖顯示了回呼模式範例範例專案的工作流程圖形:
-
-
選擇「使用範本」繼續進行選取。
下一步取決於您之前的選擇:
-
執行示範 — 您可以先檢閱狀態機器,然後再建立唯讀專案,其中資源部署者 AWS CloudFormation 到您的 AWS 帳戶.
您可以檢視狀態機器定義,當您準備就緒時,請選擇 [部署並執行] 以部署專案並建立資源。
部署最多可能需要 10 分鐘的時間來建立資源和權限。您可以使用「堆疊 ID」連結來監控進度 AWS CloudFormation.
部署完成後,您應該會在控制台中看到新的狀態機器。
-
建立在其上 — 您可以檢閱和編輯工作流程定義。您可能需要在範例專案中設定預留位置的值,然後才能嘗試執行自訂工作流程。
注意
部署到您帳戶的服務可能需要支付標準費用。
步驟 2:運行狀態機
-
在 [狀態電腦] 頁面上,選擇您的範例專案。
-
在範例專案頁面上,選擇 [開始執行]。
-
在 [開始執行] 對話方塊中,執行下列動作:
-
(選擇性) 輸入自訂執行名稱,以覆寫產生的預設值。
非ASCII名稱和記錄
Step Functions 接受包含非ASCII字元的狀態機器、執行項目、活動和標籤的名稱。由於此類字元不適用於 Amazon CloudWatch,因此我們建議您僅使用ASCII字元,以便在中追蹤指標 CloudWatch。
-
(選擇性) 在「輸入」方塊中,將輸入值輸入為JSON。如果您正在運行演示,則可以跳過此步驟。
-
選擇 Start execution (開始執行)。
「Step Functions」主控台會將您導向「執行詳細資訊」頁面,您可以在其中選擇「圖形」檢視中的狀態,以瀏覽步驟詳情窗格中的相關資訊。
例如,若要檢閱 Step Functions 如何在工作流程中進行,並從 Amazon 接收回呼SQS,請檢閱事件表格中的項目。下圖顯示「通知成功」步驟的執行輸出。它還顯示執行事件歷史記錄中的前五個事件。展開每個事件以檢視有關該事件的更多詳細資料。
-
Lambda 回調示例
若要查看此範例專案的元件如何協同運作,請參閱您的中部署的資源 AWS 帳戶。例如,以下是使用工作權杖呼叫 Step Functions 數的 Lambda 函數。
console.log('Loading function'); const aws = require('aws-sdk'); exports.lambda_handler = (event, context, callback) => { const stepfunctions = new aws.StepFunctions(); for (const record of event.Records) { const messageBody = JSON.parse(record.body); const taskToken = messageBody.TaskToken; const params = { output: "\"Callback task completed successfully.\"", taskToken: taskToken }; console.log(`Calling Step Functions to complete callback task with params ${JSON.stringify(params)}`); stepfunctions.sendTaskSuccess(params, (err, data) => { if (err) { console.error(err.message); callback(err.message); return; } console.log(data); callback(null); }); } };