本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
在 Step Functions 工作流程中操作参数
管理状态和转换数据
Step Functions 最近添加了变量JSONata,用于管理状态和转换数据。
了解如何使用变量传递数据和使用转换数据JSONata。
InputPath
、Parameters
和ResultSelector
字段提供了一种在工作流程中移动时进行操作JSON的方法。 InputPath
可以通过使用路径筛选JSON符号来限制传递的输入(参见使用JSONPath路径)。使用该Parameters
字段,您可以使用静态值或使用路径从输入中选择的值来传递一组键值对。
ResultSelector
字段提供了一种在应用 ResultPath
状态之前操作状态结果的方法。
Amazon Step Functions 首先应用InputPath
字段,然后应用字Parameters
段。您可以先使用 InputPath
将原始输入筛选为所选内容,然后应用 Parameters
进一步操作该输入,或添加新值。然后,您可以在应用 ResultPath
状态之前使用 ResultSelector
字段来操作状态的输出。
InputPath
使用 InputPath
选择状态输入的一部分。
例如,假设状态输入包括以下内容。
{
"comment": "Example for InputPath.",
"dataset1": {
"val1": 1,
"val2": 2,
"val3": 3
},
"dataset2": {
"val1": "a",
"val2": "b",
"val3": "c"
}
}
您可以应用 InputPath
。
"InputPath": "$.dataset2",
对于前InputPath
一个,以下JSON是作为输入传递的内容。
{
"val1": "a",
"val2": "b",
"val3": "c"
}
注意
一条路径可以生成一系列值。考虑以下示例。
{ "a": [1, 2, 3, 4] }
如果您应用路径 $.a[0:2]
,结果如下。
[ 1, 2 ]
参数
本部分介绍您可以使用 Parameters 字段的不同方式。
键值对
使用 Parameters
字段创建作为输入传递的键值对集合。每个值可以是包含在状态机定义中的静态值,也可以是从输入或带有路径的 Context 对象中选择的。对于使用路径选择值的键值对,键名必须以 .$
结尾。
例如,假设您提供以下输入。
{
"comment": "Example for Parameters.",
"product": {
"details": {
"color": "blue",
"size": "small",
"material": "cotton"
},
"availability": "in stock",
"sku": "2317",
"cost": "$23"
}
}
要选择一些信息,您可以在状态机定义中指定这些参数。
"Parameters": {
"comment": "Selecting what I care about.",
"MyDetails": {
"size.$": "$.product.details.size",
"exists.$": "$.product.availability",
"StaticValue": "foo"
}
},
给定之前的输入和Parameters
字段,JSON这就是传递的。
{
"comment": "Selecting what I care about.",
"MyDetails": {
"size": "small",
"exists": "in stock",
"StaticValue": "foo"
}
},
除了输入之外,您还可以访问一个名为 Con JSON text 对象的特殊对象。Context 对象包含有关您的状态机执行的信息。请参阅 在 Step Functions 中从 Context 对象访问执行数据 。
连接的资源
Parameters
字段还可以将信息传递给连接的资源。例如,如果您的任务状态为编排 Amazon Batch 任务,则可以将相关API参数直接传递给该API服务的操作。有关更多信息,请参阅:
Amazon S3
如果您在各状态之间传递的 Lambda 函数数据可能增长到超过 262,144 字节,我们建议使用 Amazon S3 来存储数据,并实施以下方法之一:
在工作流中使用分布式 Map 状态,以便
Map
状态可以直接从 Amazon S3 数据来源读取输入。有关更多信息,请参阅 分布式模式。在
Payload
参数中解析存储桶的 Amazon 资源名称 (ARN) 以获取存储桶名称和密钥值。有关更多信息,请参阅 使用 Amazon S3 ARNs 而不是在 Step Functions 中传递大型有效负载。
或者,您也可以调整实施,以便在执行中传递较少的有效负载。
ResultSelector
在应用 ResultPath
之前,使用 ResultSelector
字段来操作状态的结果。ResultSelector
字段可用于创建键值对的集合,其中值为静态值或从状态的结果中选择。使用 ResultSelector
字段,您可以选择要将状态结果的哪些部分传递给 ResultPath
字段。
注意
使用 ResultPath
字段,您可以将 ResultSelector
字段的输出添加到原始输入中。
ResultSelector
是处于以下状态的可选字段:
例如,除了结果中的有效负载外,Step Functions 服务集成还会返回元数据。ResultSelector
可以选择结果的某些部分并使用 ResultPath
将其与状态输入合并。在此示例中,我们只想选择resourceType
和ClusterId
,然后将其与来自 Amazon EMR createCluster .sync 的状态输入合并。给定以下内容:
{
"resourceType": "elasticmapreduce",
"resource": "createCluster.sync",
"output": {
"SdkHttpMetadata": {
"HttpHeaders": {
"Content-Length": "1112",
"Content-Type": "application/x-amz-JSON-1.1",
"Date": "Mon, 25 Nov 2019 19:41:29 GMT",
"x-amzn-RequestId": "1234-5678-9012"
},
"HttpStatusCode": 200
},
"SdkResponseMetadata": {
"RequestId": "1234-5678-9012"
},
"ClusterId": "AKIAIOSFODNN7EXAMPLE"
}
}
然后,您可以使用 ResultSelector
选择 resourceType
和 ClusterId
:
"Create Cluster": {
"Type": "Task",
"Resource": "arn:aws:states:::elasticmapreduce:createCluster.sync",
"Parameters": {
<some parameters>
},
"ResultSelector": {
"ClusterId.$": "$.output.ClusterId",
"ResourceType.$": "$.resourceType"
},
"ResultPath": "$.EMROutput",
"Next": "Next Step"
}
使用给定的输入,使用 ResultSelector
会产生:
{
"OtherDataFromInput": {},
"EMROutput": {
"ClusterId": "AKIAIOSFODNN7EXAMPLE",
"ResourceType": "elasticmapreduce",
}
}
展平由数组组成的数组
如果状态机中的 Parallel 工作流程状态 或 Map 状态工作流程。 状态返回由数组组成的数组,则可以使用 ResultSelector 字段将他们转换为一个平面数组。您可以将此字段包含在 Parallel 或 Map 状态定义中,以操纵这些状态的结果。
要扁平化数组,请在ResultSelector
字段[*]
中使用语法:,如下例所示。
"ResultSelector": { "flattenArray.$": "$[*][*]" }
有关演示如何展平数组的示例,请参阅以下教程中的第 3 步: