InputPath、ResultPath 和 OutputPath 示例 - Amazon Step Functions
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

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

InputPath、ResultPath 和 OutputPath 示例

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

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

例如,从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:us-east-1: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 节点(包括 ResultPath 插入的 lambdaresult 子节点)。状态输出将筛选为以下内容。

{ "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 中的输入和输出处理