示例:在 Step Functions 工作流中操作带路径的状态数据 - Amazon Step Functions
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

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

示例:在 Step Functions 工作流中操作带路径的状态数据

管理状态和转换数据

本主题包含有关如何使用 InputPath、ResultPath 和 OutputPath 字段来操作状态输入和输出 JSON 的示例。

Fail 工作流程状态Succeed 工作流程状态 状态外的任何状态,都可以包含输入和输出处理字段,如 InputPathResultPathOutputPath。此外,Wait 工作流程状态Choice 工作流程状态 状态不支持 ResultPath 字段。通过这些字段,您可以使用 JsonPath 来筛选在工作流中移动的 JSON 数据。

您还可以使用 Parameters 字段在 JSON 数据在工作流中移动时对其进行操作。有关使用 Parameters 的信息,请参阅 在 Step Functions 工作流中操作参数

例如,从Amazon Lambda教程中所述的 创建使用 Lambda 的 Step Functions 状态机 函数和状态机开始。修改状态机,以便它包含以下 InputPathResultPathOutputPath

{ "Comment": "A Hello World example of the Amazon States Language using an Amazon Lambda function", "StartAt": "HelloWorld", "States": { "HelloWorld": { "Type": "Task", "Resource": "arn:aws:lambda:region:123456789012:function:HelloFunction", "InputPath": "$.lambda", "ResultPath": "$.data.lambdaresult", "OutputPath": "$.data", "End": true } } }

使用以下输入开始执行。

{ "comment": "An input comment.", "data": { "val1": 23, "val2": 17 }, "extra": "foo", "lambda": { "who": "AWS Step Functions" } }

假设可以丢弃 commentextra 节点,但您想要包含 Lambda 函数的输出以及保留 data 节点中的信息。

在更新后的状态机中,Task 状态将更改以处理任务输入。

"InputPath": "$.lambda",

状态机定义中的此行将任务输入限制为仅状态输入中的 lambda 节点。Lambda 函数仅接收输入形式的 JSON 对象 {"who": "AWS Step Functions"}

"ResultPath": "$.data.lambdaresult",

ResultPath 指示状态机将 Lambda 函数的结果插入名为 lambdaresult、作为原始状态机输入中 data 节点的子级的节点中。因为您没有使用 OutputPath 对原始输入和结果执行任何其它操作,所以现在状态的输出包括 Lambda 函数的结果以及原始输入。

{ "comment": "An input comment.", "data": { "val1": 23, "val2": 17, "lambdaresult": "Hello, AWS Step Functions!" }, "extra": "foo", "lambda": { "who": "AWS Step Functions" } }

但是,我们的目标是仅保留 data 节点,并且包含 Lambda 函数的结果。OutputPath 将先筛选此组合的 JSON,然后再将其传递到状态输出。

"OutputPath": "$.data",

这将仅选择原始输入中要传递到输出的 data 节点(包括 lambdaresult 插入的 ResultPath 子节点)。状态输出将筛选为以下内容。

{ "val1": 23, "val2": 17, "lambdaresult": "Hello, AWS Step Functions!" }

在该 Task 状态中:

  1. InputPath 仅将输入中的 lambda 节点发送至 Lambda 函数。

  2. ResultPath 将结果作为 data 节点的子级插入原始输入。

  3. OutputPath 将筛选状态输入(现在包含 Lambda 函数的结果),以便它仅将 data 节点传递到状态输出。

例使用 JsonPath 操作原始状态机输入、结果和最终输出

考虑以下状态机器,它可以验证保险申请人的身份和地址。

注意

要查看完整的示例,请参阅 How to use JSON Path in Step Functions

{ "Comment": "Sample state machine to verify an applicant's ID and address", "StartAt": "Verify info", "States": { "Verify info": { "Type": "Parallel", "End": true, "Branches": [ { "StartAt": "Verify identity", "States": { "Verify identity": { "Type": "Task", "Resource": "arn:aws:states:::lambda:invoke", "Parameters": { "Payload.$": "$", "FunctionName": "arn:aws:lambda:us-east-2:111122223333:function:check-identity:$LATEST" }, "End": true } } }, { "StartAt": "Verify address", "States": { "Verify address": { "Type": "Task", "Resource": "arn:aws:states:::lambda:invoke", "Parameters": { "Payload.$": "$", "FunctionName": "arn:aws:lambda:us-east-2:111122223333:function:check-address:$LATEST" }, "End": true } } } ] } } }

如果您使用以下输入运行此状态机,则执行将失败,因为执行验证的 Lambda 函数只期望需要验证的数据作为输入。因此,您必须使用适当的 JsonPath 指定包含待验证信息的节点。

{ "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" }, "interests": [ { "category": "home", "type": "own", "yearBuilt": 2004 }, { "category": "boat", "type": "snowmobile", "yearBuilt": 2020 }, { "category": "auto", "type": "RV", "yearBuilt": 2015 }, ] } }

要指定 check-identity Lambda 函数必须使用的节点,请使用 InputPath 字段,如下所示:

"InputPath": "$.data.identity"

要指定 check-address Lambda 函数必须使用的节点,请使用 InputPath 字段,如下所示:

"InputPath": "$.data.address"

现在,如果要将验证结果存储在原始状态机输入中,请使用 ResultPath 字段,如下所示:

"ResultPath": "$.results"

但是,如果您只需要身份和验证结果并丢弃原始输入,请使用 OutputPath 字段,如下所示:

"OutputPath": "$.results"

有关更多信息,请参阅 在 Step Functions 中处理输入和输出

使用 OutputPath 筛选状态输出

使用 OutputPath,可以选择状态输出的一部分以传递到下一个状态。通过此方法,可以筛选掉不需要的信息,而仅传递您需要的这部分 JSON。

如果您未指定 OutputPath,则默认值是 $。这会将整个 JSON 节点(由状态输入、任务结果和 ResultPath 确定)传递到下一个状态。