本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
示例:在 Step Functions 工作流程中操作状态数据
本主题包含如何JSON使用 InputPath、 ResultPath和 OutputPath 字段操作状态输入和输出的示例。
除 失败工作流状态 或 成功的工作流程状态 状态外的任何状态,都可以包含输入和输出处理字段,如 InputPath
、ResultPath
或 OutputPath
。此外,等待工作流程状态 和 选择工作流程状态 状态不支持 ResultPath
字段。通过这些字段,您可以在JSON数据在JsonPath
您还可以在JSON数据在工作流程中移动时使用该Parameters
字段对其进行操作。有关使用 Parameters
的信息,请参阅 使用 Step Functions 工作流程中的参数操作状态数据。
例如,从 AWS Lambda 创建使用 Lambda 的 Step Functions 状态机教程中描述的函数和状态机。修改状态机,以便它包含以下 InputPath
、ResultPath
和 OutputPath
。
{
"Comment": "A Hello World example of the Amazon States Language using an AWS 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"
}
}
假设可以丢弃comment
和extra
节点,但您希望包含 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
状态中:
-
InputPath
仅将输入中的lambda
节点发送至 Lambda 函数。 -
ResultPath
将结果作为data
节点的子级插入原始输入。 -
OutputPath
将筛选状态输入(现在包含 Lambda 函数的结果),以便它仅将data
节点传递到状态输出。
例 使用操作原始状态机输入、结果和最终输出 JsonPath
考虑以下状态机器,它可以验证保险申请人的身份和地址。
注意
要查看完整的示例,请参阅如何在 Step Functi JSON ons 中使用路径
{ "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 }, ] } }
要指定
Lambda 函数必须使用的节点,请使用 check-identity
InputPath
字段,如下所示:
"InputPath": "$.data.identity"
要指定
Lambda 函数必须使用的节点,请使用 check-address
InputPath
字段,如下所示:
"InputPath": "$.data.address"
现在,如果要将验证结果存储在原始状态机输入中,请使用 ResultPath
字段,如下所示:
"ResultPath": "$.results"
但是,如果您只需要身份和验证结果并丢弃原始输入,请使用 OutputPath
字段,如下所示:
"OutputPath": "$.results"
有关更多信息,请参阅 在 Step Functions 中处理输入和输出。