本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
在 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数据。
提示
Parameters
和ResultSelector
筛选器通过构造来工作JSON,而InputPath
和OutputPath
筛选器通过筛选JSON数据对象中的特定节点来工作,ResultPath
过滤器通过创建一个可以在其下添加输出的字段来工作。
有关在工作流中配置输入和输出的更多信息,请参阅 在 Step Functions 中处理输入和输出。
筛选和操作输入和结果
使用 InputPath 过滤器选择原始输入的特定部分
使用 InputPath
筛选条件,选择输入有效负载的特定部分。
如果您未指定 InputPath
,则其值默认为 $
,这会导致状态的任务将引用整个原始输入而不是特定部分。
要学习如何使用 InputPath 筛选条件,请执行以下步骤:
第 1 步:创建状态机
重要
确保您的状态机处于相同状态 AWS 账户和区域是您之前创建的 Lambda 函数。
-
使用您在教程 4 中学到的
Parallel
状态示例来创建新的状态机。确保工作流原型类似于以下原型。 -
为
check-identity
和check-address
Lambda 函数配置集成。有关创建 Lambda 函数并在状态机中使用函数的信息,请参阅第 1 步:创建 Lambda 函数执行所需的检查和第 2 步:更新工作流 – 添加要执行的并行任务。 -
对于有效负载,请确保保留使用状态输入作为有效负载的默认选择。
-
选择下一步,然后执行教程 5 第 1 步:保存状态机中的第 1 至 3 步,来创建新的zhuang't状态机。在本教程中,请将状态机命名为
WorkflowInputOutput
。
第 2 步:运行状态机
-
在WorkflowInputOutput页面上,选择开始执行。
-
(可选)输入自定义执行名称以覆盖生成的默认值。
非ASCII姓名和日志
Step Functions 接受状态机、执行、活动和包含非ASCII字符的标签的名称。由于此类字符不适用于亚马逊 CloudWatch,因此我们建议您仅使用ASCII字符,以便您可以跟踪中的指标 CloudWatch。
-
在输入区域中,添加以下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" } } }
-
选择启动执行。
-
状态机执行出现错误,这是因为您尚未指定
check-identity
和check-address
Lambda 函数必须使用执行输入的哪一部分来执行所需的身份和地址验证。 -
继续执行本教程的第 3 步,以便修复错误。
第 3 步:使用 InputPath
筛选条件选择执行输入的特定部分
-
在执行详细信息页面上,选择编辑状态机。
-
要验证第 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" }
-
要验证执行输入中提及的申请人地址,请按如下方式编辑
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" }
-
选择启动执行。状态机执行现在成功完成。
使用 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
,则采用默认值 $
,这会导致初始输入有效负载被原始任务结果替换。如果指定 ResultPath
为 null
,则原始结果将被丢弃,初始输入有效负载将成为有效输出。
如果将该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
,将在之后应用InputPath
。 Parameters
帮助您指定底层任务如何接受其输入负载。例如,假设如果 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 工作流程中的错误。