在 Step Functions 中配置工作流程输入和输出 - AWS Step Functions

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

在 Step Functions 中配置工作流程输入和输出

在上一主题中运行工作流 ,您学习了如何运行工作流程。在本主题中,您将学习如何在数据在状态之间传递时选择、筛选和操作数据。

Step Functions 执行将JSON文本作为输入接收,并将该输入传递到工作流程中的第一个状态。工作流中的各个状态接收JSON数据作为输入,通常会将JSON数据作为输出传递到下一个状态。默认情况下,除非您已配置输入和/或输出,否则数据会从工作流中的一个状态传递到下一个状态。了解信息如何在状态之间流动,并了解如何筛选和处理此数据,这对在 Step Functions 中高效设计和实施工作流至关重要。

Step Functions 提供以下过滤器来控制状态之间的输入和输出数据流:

注意

根据您的使用案例,您可能不需要在工作流中应用所有这些筛选条件。

InputPath

选择整个输入负载WHAT的一部分用作任务的输入。如果您指定了此字段,Step Functions 将首先应用此字段。

参数

指定HOW在调用任务之前的输入应该是什么样子。使用该Parameters字段,您可以创建键值对的集合,这些键值对作为输入传递给 AWS 服务 集成,例如 AWS Lambda function。这些值可以是静态的,也可以从状态输入或工作流上下文对象中动态选择。

ResultSelector

WHAT决定从任务的输出中进行选择。使用 ResultSelector 字段,您可以创建一个键值对的集合,这些键值对用于替换状态的结果并将该集合传递给 ResultPath

在 Step Functions 工作流程 ResultPath 中使用指定状态输出

WHERE决定放置任务的输出。使用 ResultPath 来确定状态的输出是其输入的副本、其产生的结果还是两者的组合。

在 Step Functions 工作流程 OutputPath 中使用筛选状态输出

决定发送WHAT到下一个状态。使用OutputPath,您可以筛选出不需要的信息,只传递您关心的那部分JSON数据。

提示

ParametersResultSelector筛选器通过构造来工作JSON,而InputPathOutputPath筛选器通过筛选JSON数据对象中的特定节点来工作,ResultPath过滤器通过创建一个可以在其下添加输出的字段来工作。

有关在工作流中配置输入和输出的更多信息,请参阅 在 Step Functions 中处理输入和输出

使用 InputPath 过滤器选择原始输入的特定部分

使用 InputPath 筛选条件,选择输入有效负载的特定部分。

如果您未指定 InputPath,则其值默认为 $,这会导致状态的任务将引用整个原始输入而不是特定部分。

第 1 步:创建状态机

重要

确保您的状态机处于相同状态 AWS 账户和区域是您之前创建的 Lambda 函数。

  1. 使用您在教程 4 中学到的 Parallel 状态示例来创建新的状态机。确保工作流原型类似于以下原型。

  2. check-identitycheck-address Lambda 函数配置集成。有关创建 Lambda 函数并在状态机中使用函数的信息,请参阅第 1 步:创建 Lambda 函数执行所需的检查第 2 步:更新工作流 – 添加要执行的并行任务

  3. 对于有效负载,请确保保留使用状态输入作为有效负载的默认选择。

  4. 选择下一步,然后执行教程 5 第 1 步:保存状态机中的第 1 至 3 步,来创建新的zhuang't状态机。在本教程中,请将状态机命名为 WorkflowInputOutput

第 2 步:运行状态机

  1. WorkflowInputOutput页面上,选择开始执行

  2. (可选)输入自定义执行名称以覆盖生成的默认值。

    非ASCII姓名和日志

    Step Functions 接受状态机、执行、活动和包含非ASCII字符的标签的名称。由于此类字符不适用于亚马逊 CloudWatch,因此我们建议您仅使用ASCII字符,以便您可以跟踪中的指标 CloudWatch。

  3. 输入区域中,添加以下JSON数据作为执行输入。

    { "data": { "firstname": "Jane", "lastname": "Doe", "identity": { "email": "jdoe@example.com", "ssn": "123-45-6789" }, "address": { "street": "123 Main St", "city": "Columbus", "state": "OH", "zip": "43219" } } }
  4. 选择启动执行

  5. 状态机执行出现错误,这是因为您尚未指定 check-identitycheck-address Lambda 函数必须使用执行输入的哪一部分来执行所需的身份和地址验证。

  6. 继续执行本教程的第 3 步,以便修复错误。

第 3 步:使用 InputPath 筛选条件选择执行输入的特定部分

  1. 执行详细信息页面上,选择编辑状态机

  2. 要验证第 2 步:运行状态机中提供的执行输入中提及的申请人身份,请按如下方式编辑 Verify identity 任务定义:

    ... { "StartAt": "Verify identity", "States": { "Verify identity": { "Type": "Task", "Resource": "arn:aws:states:::lambda:invoke", "InputPath": "$.data.identity", "Parameters": { "Payload.$": "$", "FunctionName": "arn:aws:lambda:us-east-2:123456789012:function:check-identity:$LATEST" }, "End": true } } } ...

    因此,以下JSON数据可用作该check-identity函数的输入。

    { "email": "jdoe@example.com", "ssn": "123-45-6789" }
  3. 要验证执行输入中提及的申请人地址,请按如下方式编辑 Verify address 任务定义:

    ... { "StartAt": "Verify address", "States": { "Verify address": { "Type": "Task", "Resource": "arn:aws:states:::lambda:invoke", "InputPath": "$.data.address", "Parameters": { "Payload.$": "$", "FunctionName": "arn:aws:lambda:us-east-1:123456789012:function:check-address:$LATEST" }, "End": true } } } ...

    因此,以下JSON数据可用作该check-address函数的输入。

    { "street": "123 Main St", "city": "Columbus", "state": "OH", "zip": "43219" }
  4. 选择启动执行。状态机执行现在成功完成。

使用 Parameters 筛选条件处理选定的输入

虽然InputPath过滤器可以帮助你限制你提供的原始JSON输入,但使用Parameters过滤器,你可以将一组键值对作为输入传递。这些键值对可以是您在状态机定义中定义的静态值,也可以是使用 InputPath 从原始输入中选择的值。

在您的工作流中,Parameters 将在 InputPath 之后应用。Parameters 帮助您指定底层任务接受其输入有效负载的方式。例如,如果 check-address Lambda 函数接受字符串参数而不是JSON数据作为输入,则可以使用Parameters筛选器来转换输入。

在以下示例中,Parameters 筛选条件接收您在第 3 步:使用 InputPath 筛选条件选择执行输入的特定部分中使用 InputPath 选择的输入,并将内置函数 States.Format 应用于输入项,用于创建名为 addressString 的字符串。内置函数可帮助您对给定输入执行基本的数据处理操作。有关更多信息,请参阅 用于 Step Functions 工作流程的 Amazon States 语言中的内在函数

"Parameters": { "addressString.$": "States.Format('{}. {}, {} - {}', $.street, $.city, $.state, $.zip)" }

因此,将创建以下字符串并将其作为输入提供给 check-address Lambda 函数。

{ "addressString": "123 Main St. Columbus, OH - 43219" }

使用 ResultSelector ResultPath、和 OutputPath 过滤器配置输出

WorkflowInputOutput状态机中调用 check-address Lambda 函数时,该函数将在执行地址验证后返回输出有效负载。在执行详细信息页面上,选择验证地址步骤,然后在步骤详细信息窗格的任务结果中查看输出有效负载。

{ "ExecutedVersion": "$LATEST", "Payload": { "statusCode": 200, "body": "{\"approved\":true,\"message\":\"identity validation passed\"}" }, "SdkHttpMetadata": { "AllHttpHeaders": { "X-Amz-Executed-Version": [ "$LATEST" ], ... ... "StatusCode": 200 }

使用 ResultSelector

如果您需要向工作流程中的以下状态提供身份和地址验证的结果,则可以在输出中选择 p ayload.body 节点,JSON然后使用ResultSelector过滤器中的StringToJson内部函数根据需要格式化数据。

ResultSelector 从任务输出中选择所需的内容在以下示例中,获ResultSelector$.payload.body 中的字符串,并应用States.StringToJson内部函数将字符串转换为身份节点,并将结果放入标识JSON节点中。JSON

"ResultSelector": { "identity.$": "States.StringToJson($.Payload.body)" }

因此,将创建以下JSON数据。

{ "identity": { "approved": true, "message": "Identity validation passed" } }

在使用这些输入和输出过滤器时,可能会看到由无效JSONpath表达式引起的运行时错误。

使用 ResultPath

您可以使用 ResultPath 字段在初始输入有效负载中指定一个位置,来保存状态的任务处理结果。如果您未指定 ResultPath,则采用默认值 $,这会导致初始输入有效负载被原始任务结果替换。如果指定 ResultPathnull,则原始结果将被丢弃,初始输入有效负载将成为有效输出。

如果将该ResultPath字段应用于使用该ResultSelector字段创建JSON的数据,则任务结果将添加到输入负载的结果节点内,如以下示例所示:

{ "data": { "firstname": "Jane", "lastname": "Doe", "identity": { "email": "jdoe@example.com", "ssn": "123-45-6789" }, "address": { "street": "123 Main St", "city": "Columbus", "state": "OH", "zip": "43219" }, "results": { "identity": { "approved": true } } }

使用 OutputPath

在应用 ResultPath 之后,您可以选择状态输出的一部分以传递到下一个状态。通过这种方法,你可以过滤掉不需要的信息,只传递你需要的那一部分。JSON

在以下示例中,OutputPath 字段将状态输出保存在结果节点内:"OutputPath": "$.results"。因此,该状态的最终输出可以传递到下一个状态,如下所示:

{ "addressResult": { "approved": true, "message": "address validation passed" }, "identityResult": { "approved": true, "message": "identity validation passed" } }

使用控制台特征可视化输入和输出数据流

您可以使用 Step Functions 控制台的数据流模拟器或“执行详细信息”页面中的“高级”视图选项,直观显示工作流中各状态之间的输入和输出数据流。

使用 “参数” 字段操作选定的输入

虽然该InputPath字段可以帮助您限制所提供的原始JSON输入,但使用该Parameters字段,您可以将一组键值对作为输入传递。这些键值对可以是您在状态机定义中定义的静态值,也可以是使用 InputPath 从原始输入中选择的值。

在您的工作流程中Parameters,将在之后应用InputPathParameters帮助您指定底层任务如何接受其输入负载。例如,假设如果 check-address Lambda 函数接受字符串参数而不是JSON数据作为输入,则可以使用该Parameters字段来转换输入。

在以下示例InputPath中,该Parameters字段接收您在使用 InputPath 过滤器选择原始输入的特定部分部分中选择的输入,并将内部函数States.Format应用于输入项以创建名为的字符串。addressString内置函数可帮助您对给定输入执行基本的数据处理操作。有关更多信息,请参阅内部函数

"Parameters": { "addressString.$": "States.Format('{}. {}, {} - {}', $.street, $.city, $.state, $.zip)" }

因此,将创建以下字符串并将其作为输入提供给校验地址 Lambda 函数。

注意

如果您使用此示例更新输入并运行状态机,则会返回错误,因为 Lambda 函数不接受更新格式的输入。

{ "addressString.$": "123 Main St. Columbus, OH - 43219" }

后续步骤

在最后一个主题中调试错误,您将学习如何调试 Step Functions 工作流程中的错误。