本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
InputPath、参数和 ResultSelector
InputPath
、Parameters
和ResultSelector
字段提供了一种在 JSON 在工作流程中移动时对其进行操作的方法。 InputPath
可以通过使用路径筛选 JSON 表示法来限制传递的输入(参见路径)。Parameters
字段使您可以传递键值对的集合,其中值是您在状态机定义中定义的静态值,或者是使用路径从输入中选择的值。该ResultSelector
字段提供了一种在应用状态之前操作ResultPath
状态结果的方法。
Amazon Step Functions 首先应用 InputPath
字段,然后是 Parameters
字段。您可以先使用 InputPath
将原始输入筛选为所选内容,然后应用 Parameters
进一步操纵该输入,或添加新值。然后,在应用状态之前ResultPath
,您可以使用该ResultSelector
字段来操作状态的输出。
提示
使用 Step Functions 控制台中的数据流模拟器
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
字段创建作为输入传递的键值对的集合。每个键值对的值可以是您在状态机定义中包含的静态值,也可以是使用路径从输入或上下文对象中选择的值。对于使用路径选择值的键值对,键名必须以 .$
结尾。
例如,假设您提供以下输入。
{
"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"
}
},
除了输入之外,您还可以访问一个特殊的 JSON 对象,称为上下文对象。上下文对象包含有关状态机执行的信息。请参阅 Context 对象。
连接的资源
Parameters
字段还可以将信息传递给连接的资源。例如,如果您的任务状态是编排 Amazon Batch 作业,则可以将相关 API 参数直接传递给该服务的 API 操作。有关更多信息,请参阅:
Amazon S3
如果您在各州之间传递的 Lambda 函数数据可能增长到超过 262,144 字节,我们建议使用 Amazon S3 来存储数据,并实现以下方法之一:
在工作流程中使用分布式地图状态,以便该
Map
状态可以直接从 Amazon S3 数据源读取输入。有关更多信息,请参阅在分布式模式下使用地图状态:在参数中解析存储桶的亚马逊资源名称 (ARN) 以获取存储桶名称和密钥值。
Payload
有关更多信息,请参阅使用 Amazon S3 ARN 代替传递大型有效负载:
或者,您可以调整实现以在执行中传递较小的有效负载。
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"
}
}
然后,你可以选择resourceType
并ClusterId
使用ResultSelector
:
"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": {
"ResourceType": "elasticmapreduce",
"ClusterId": "AKIAIOSFODNN7EXAMPLE"
}
}
扁平化数组数组
如果映射状态机中的Parallel或状态返回数组数组,则可以将它们转换为带有该ResultSelector字段的平面数组。您可以将此字段包含在 Parallel 或 Map 状态定义中,以操纵这些状态的结果。
要扁平化数组,请在ResultSelector
字段[*]
中使用 JMESPath 语法
"ResultSelector": { "flattenArray.$": "$[*][*]" }
有关演示如何扁平化数组的示例,请参阅以下教程中的步骤 3: