回调模式示例(Amazon SQS、Amazon SNS、Lambda) - Amazon Step Functions
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 Amazon Web Services 服务入门

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

回调模式示例(Amazon SQS、Amazon SNS、Lambda)

此示例项目演示了如何在任务期间暂停 Amazon Step Functions,并等待外部进程返回任务启动时生成的任务令牌。

部署此示例项目并开始执行时,将执行以下步骤:

  1. Step Functions 将包含任务令牌的消息传递给 Amazon Simple Queue Service (Amazon SQS) 队列。

  2. Step Functions 然后暂停,等待该令牌返回。

  3. Amazon SQS 队列触发Amazon Lambda函数,用于调用SendTaskSuccess使用相同的任务令牌。

  4. 收到任务令牌后,工作流程将继续。

  5. 这些区域有:"Notify Success"任务发布 Amazon Simple Notification Service (Amazon SNS) 消息,表明已收到回调。

要了解如何在 Step Functions 中实施回调模式,请参阅等待具有任务令牌的回调

有关 Amazon Step Functions 如何控制其他 Amazon 服务的更多信息,请参阅将 Amazon Step Functions 与其他服务一起使用

创建状态机并预置资源

  1. 打开Step Functions 控制台,然后选择创建状态机

  2. 选择 Sample Projects (示例项目),然后选择 Callback Pattern Example (回调模式示例)

    此时将显示状态机 Code (代码)Visual Workflow (可视工作流程)

    
          回调示例工作流程。
  3. 选择 Create Sample Project (创建示例项目)

    此时将显示 Create Project Resources (创建项目资源) 页面,其中列出了将创建的资源。对于本示例项目,资源包括:

    • Amazon SQS 消息队列。

    • 一个 Lambda 函数,用于调用 Step Functions 操作SendTaskSuccess

    • Amazon SNS 主题,用于在工作流程可以继续时通知成功或失败。

    注意

    创建这些资源和相关 IAM 权限可能需要长达 10 分钟的时间。当 Create Project Resources (创建项目资源) 页面显示 Creating resources (正在创建资源) 时,您可打开 Stack ID: (堆栈 ID:) 链接以查看正在预置的资源。

    完成后,将会显示 New execution (新执行) 页面。

  4. (可选)输入执行名称和示例输入。

    
          开始回调执行
  5. 选择 Start Execution (开始执行)

    此时将启动新的状态机执行,并显示一个说明正在运行的执行的新页面。

    
          回调执行
  6. 要查看 Step Functions 如何在工作流程中的进展情况及其如何从 Amazon SQS 收到回调,请查看执行事件历史记录

Lambda 回调示例

要查看此示例项目的组件如何协同工作,请参阅在Amazonaccount. 例如,这是 Lambda 函数,用于使用任务令牌调用 Step Functions。

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); }); } };