教程 3:在工作流中实现 if-else 条件 - Amazon Step Functions
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

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

教程 3:在工作流中实现 if-else 条件

您可以使用 Choice 状态在工作流中实现 if-else 条件。它根据指定条件的计算结果是 true 还是 false 来确定工作流的执行路径。

在本教程中,您将添加条件逻辑来确定在教程 2 中使用的 RandomNumberforCredit Lambda 函数返回的申请的信用额度,是否超过特定的阈值限制。如果额度超过阈值限制,则申请需要人际互动才能获得批准。如果未超过限制,申请将自动批准,并进入下一个步骤。

您将需要暂停工作流执行,直至任务令牌返回,以此来模仿人际互动步骤。为此,您需要将一个任务令牌传递给将在本教程中使用的 Amazon 开发工具包集成,即 Amazon Simple Notification Service。工作流执行将暂停,直到通过 SendTaskSuccess API 调用接收到任务令牌后再继续执行。有关使用任务令牌的更多信息,请参阅等待具有任务令牌的回调

由于您已经在工作流原型中定义了人工批准和自动批准的步骤,因此在本教程中,您将首先创建一个接收回调令牌的 Amazon SNS 主题。然后,创建一个 Lambda 函数来实现回调功能。最后,您将通过添加这些 Amazon Web Service集成的详细信息来更新工作流原型。

第 1 步:创建接收回调令牌的 Amazon SNS 主题

要实现人际互动步骤,您需要发布到 Amazon Simple Notification Service 主题并将回调任务令牌传递给该主题。回调任务将暂停工作流的执行,直至任务令牌与有效负载一起返回。

  1. 打开 Amazon SNS 控制台,并创建一个标准主题类型。有关创建主题的信息,请参阅《Amazon Simple Notification Service 开发人员指南》中的创建 Amazon SNS 主题

  2. 将主题名称指定为 TaskTokenTopic

  3. 确保复制主题 ARN 并将其保存在文本文件中。在为 Wait for human approval 状态指定服务集成时,您需要使用该主题 ARN。以下是一个示例主题 ARN:

    arn:aws:sns:us-east-2:123456789012:TaskTokenTopic
  4. 为该主题创建基于电子邮件的订阅,然后确认订阅。有关主题订阅的信息,请参阅《Amazon Simple Notification Service 开发人员指南》中的创建主题订阅

第 2 步:创建 Lambda 函数来处理回调

要处理回调功能,您需要定义一个 Lambda 函数,并将在第 1 步中创建的 Amazon SNS 主题添加为该函数的触发器。使用任务令牌发布到 Amazon SNS 主题时,将使用已发布消息的有效负载调用 Lambda 函数。

第 2.1 步:创建 Lambda 函数来处理回调

在此函数中,您将处理信用额度批准申请,并通过 SendTaskSuccess API 调用返回申请的成功结果。此 Lambda 函数还将返回它从 Amazon SNS 主题中接收的任务令牌。

为简单起见,用于人际互动步骤的 Lambda 函数会自动批准所有任务,并通过 SendTaskSuccess API 调用返回任务令牌。您可以将 Lambda 函数命名为 callback-human-approval

  1. 在新选项卡或窗口中,打开 Lambda 控制台并创建一个名为 callback-human-approvalNode.js 16.x Lambda 函数。有关使用控制台创建 Lambda 函数的信息,请参阅《Amazon 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 步:添加 Amazon SNS 主题作为 Lambda 函数的触发器

当您添加在本教程第 1 步中创建的 Amazon SNS 主题作为在本教程第 2.1 步中创建的 Lambda 函数的触发器时,则每次发布到 Amazon SNS 主题时都会触发 Lambda 函数。使用任务令牌发布到 Amazon SNS 主题时,将使用已发布消息的有效负载调用 Lambda 函数。有关为 Lambda 函数配置触发器的更多信息,请参阅《Amazon Lambda 开发人员指南》中的配置触发器

  1. callback-human-approval Lambda 函数的函数概述部分中,选择添加触发器

  2. 从触发器下拉列表中,选择 SNS 作为触发器。

  3. 对于 SNS 主题,键入您在本教程第 1 步中创建的 Amazon SNS 主题的名称,然后从出现的下拉列表中进行选择。

  4. 选择添加

  5. 保持此窗口处于打开状态,并执行下一节中的步骤,进行后续操作。

第 2.3 步:向 Lambda 函数 IAM 角色提供必要的权限

您必须向 callback-human-approval Lambda 函数提供访问 Step Functions 的权限,以便随 SendTaskSucess API 调用一起返回任务令牌。

  1. callback-human-approval 页面上,选择配置选项卡,然后选择权限

  2. 执行角色下,选择角色名称以导航到 Amazon Identity and Access Management 控制台的角色页面。

  3. 如需添加所需的权限,选择添加权限,然后选择附加策略

  4. 在 搜索框中,输入 AWSStepFunctions,然后按 Enter 键。

  5. 选择 AWSStepFunctionsFullAccess,然后向下滚动选择附加策略。这将添加包含 callback-human-approval Lambda 函数角色必要权限的策略。

第 3 步:更新工作流 – 在“选择”状态下添加 if-else 条件逻辑

在 Step Functions 控制台中,使用 Choice 状态为工作流定义条件逻辑。如果 RandomNumberforCredit Lambda 函数返回的输出小于 5000,则会自动批准所申请的额度。如果返回的输出大于或等于 5000,则工作流执行将进入信用额度审批的人际互动步骤。

Choice 状态下,您可以使用比较运算符将输入变量与特定值进行比较。您可以在启动状态机执行时将输入变量指定为执行输入,也可以使用前一步的输出作为当前步骤的输入。默认情况下,步骤的输出存储在名为 Payload 的变量中。要在 Choice 状态中使用 Payload 变量的值进行比较,请使用以下过程所示的 $ 语法。

有关信息如何从一种状态流向另一种状态以及如何在工作流中指定输入和输出的信息,请参阅教程 7:配置输入和输出Step Functions 中的输入和输出处理

注意

如果 Choice 状态使用状态机执行输入中指定的输入变量进行比较,请使用 $.variable_name 语法执行比较。例如,要比较 myAge 变量,请使用语法 $.myAge

由于在此步骤中,该 Choice 状态将接收来自Get credit limit状态的输入,您将使用 $ 语法来配置 Choice 状态。要了解在 Choice 状态配置中使用 $.variable_name 语法来引用前一步的输出时,状态机执行结果有何不同,请参阅教程 8 中的调试无效路径 Choice 状态错误部分。

使用 Choice 状态添加 if-else 条件逻辑
  1. 打开 Step Functions 控制台窗口,其中应包含您在教程 1:为状态机创建原型中创建的工作流原型。

  2. 选择已 Credit applied >= 5000? 状态,然后在配置选项卡中,按如下方式指定条件逻辑:

    1. 选择规则下,选择规则 #1 磁贴中的编辑图标,定义第一条选择规则。

    2. 选择添加条件

    3. 规则 #1 的条件对话框中,对于变量,输入 $

    4. 对于运算符,选择小于

    5. 对于,选择数字常量,然后在下拉列表旁边的字段中输入 5000

    6. 选择保存条件

    7. 对于然后下一个状态是:下拉列表,选择自动批准额度

    8. 选择添加新选择规则,然后重复 2.b 至 2.f 子步骤来定义第二条选择规则,该规则适用于信用额度大于或等于 5000 的情况。对于运算符,选择大于或等于

    9. 对于然后下一个状态是:下拉列表,选择等待人工批准

    10. 默认规则框中,选择编辑图标以定义默认选择规则,然后从默认状态下拉列表中选择 Wait for human approval。您可以定义“默认规则”,以指定在 Choice 状态条件均未评估为 true 或 false 时要过渡到的下一个状态。

  3. 按如下方式配置等待人工批准状态:

    1. 配置选项卡中,对于主题,开始键入 Amazon SNS 主题的名称 TaskTokenTopic,然后选择下拉列表中显示的名称。

    2. 对于消息,从下拉列表中选择输入消息。在消息字段中,您可以指定要发布到 Amazon SNS 主题的消息。在本教程中,您将任务令牌作为消息发布。

      使用任务令牌,您可以暂停标准类型的 Step Functions 工作流,直到外部流程完成并返回任务令牌。通过指定 .waitForTaskToken 服务集成模式Task 状态指定为回调任务时,会在任务启动时生成任务令牌并将其放置在上下文对象中。上下文对象是执行期间可用的内部 JSON 结构,包含有关状态机及其执行的信息。有关上下文对象的更多信息,请参阅Context 对象

    3. 在出现的框中,将以下内容作为消息输入:

      { "TaskToken.$": "$$.Task.Token" }
    4. 选中等待回调复选框。

    5. 在随后显示的对话框中,选择完成

  4. 保持此窗口处于打开状态,然后继续阅读下一个教程以进行后续操作。

后续步骤

在下一个教程中,您将学习如何并行执行多个任务。