在 Step Functions 工作流程中添加条件逻辑 - AWS Step Functions

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

在 Step Functions 工作流程中添加条件逻辑

在上一主题中整合服务,您集成了一个 Lambda 函数。在本主题中,您将在中设置 if-els e 条件。Choice state选择状态根据特定条件确定工作流程的执行路径。

您将添加根据 L RandomNumberforCredit ambda 函数返回的已应用信用额选择路径的逻辑。如果金额在阈值范围内,则信用申请将自动获得批准并进入下一步。如果该值超过阈值限制,则工作流程将需要人工批准才能继续该工作流程。

您将通过暂停工作流程执行直到返回任务令牌来模拟人机交互步骤。为此,您需要将任务令牌传递给 AWS SDK与 Amazon 简单通知服务集成。工作流程执行将暂停,直到它通过SendTaskSuccessAPI调用收到返回的任务令牌。有关使用任务令牌与其他服务集成的信息,请参阅服务等待带有任务令牌的回调内集成模式。

创建原型状态机时,您定义了人工批准和自动批准步骤。现在,您必须创建一个接收回调令牌的 Amazon SNS 主题。然后,创建一个 Lambda 函数来实现回调功能。最后,您可以通过添加工作流程原型的详细信息来更新工作流程原型 AWS 服务 集成。

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

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

  1. 打开 A mazon SNS 控制台并创建标准主题类型。有关创建主题的信息,请参阅《亚马逊简单通知服务开发者指南》中的创建亚马逊SNS主题

  2. 将主题名称指定为 TaskTokenTopic

  3. 请务必复制该主题ARN并将其保存在文本文件中。在为 “等待人工审批” 状态指定服务集成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 函数来处理回调

在此函数中,您将处理信用额度批准请求,并通过SendTaskSuccessAPI呼叫将请求的结果返回为成功。此 Lambda 函数还将返回它从亚马逊SNS主题收到的任务令牌。

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

  1. 在新选项卡或窗口中,打开 Lambda 控制台并创建名为的 Node.js Lambda 函数callback-human-approval有关使用控制台创建 Lambda 函数的信息,请参阅中的在控制台中创建 Lambda 函数 AWS Lambda 开发者指南

  2. callback-human-approval页面上,将 “代码源” 区域中的现有代码替换为以下代码。

    // Lambda function that will automatically approve any task // in a message published to an Amazon SNS topic console.log('Loading function'); const AWS = require('aws-sdk'); const resultMessage = "Successful"; export const handler = async (event) => { 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:添加亚马逊SNS主题作为 Lambda 函数的触发器

当您使用任务令牌发布到 Amazon SNS 主题时,将使用已发布消息的有效负载调用 Lambda 函数。有关为 Lambda 函数配置触发器的更多信息,请参阅中的配置触发器 AWS 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. 在 “执行角色” 下,选择角色名称以导航到 AWS 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 变量的值进行比较,请使用以下过程所示的 $ 语法。

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

注意

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

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

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

  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. 保持此窗口处于打开状态,然后继续下一个主题。

后续步骤

在下一个主题中,定义并行任务您将学习如何并行执行多项任务。