本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
InputPath、参数和 ResultSelector
InputPath
、Parameters
和 ResultSelector
字段提供了一种在 JSON 流经工作流时操纵它的方法。InputPath
可以通过使用路径筛选 JSON 表示法来限制传递的输入(请参阅路径)。Parameters
字段使您可以传递键值对的集合,其中值是您在状态机定义中定义的静态值,或者是使用路径从输入中选择的值。ResultSelector
字段提供了一种在应用 ResultPath
状态之前操作状态结果的方法。
AWS 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 字段的不同方式。
键值对
使用 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
字段还可以将信息传递给连接的资源。例如,如果您的任务状态为编排 AWS Batch 任务,则可以将相关的 API 参数直接传递给该服务的 API 操作。有关更多信息,请参阅:
Amazon S3
如果您在各状态之间传递的 Lambda 函数数据可能增长到超过 262,144 字节,我们建议使用 Amazon S3 来存储数据,并实施以下方法之一:
在工作流中使用分布式 Map 状态,以便
Map
状态可以直接从 Amazon S3 数据来源读取输入。有关更多信息,请参阅使用分布式模式下的 Map 状态。解析
Payload
参数中存储桶的 Amazon 资源名称 (ARN),以获取存储桶名称和键值。有关更多信息,请参阅使用 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"
}
}
然后,您可以使用 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": {
"ResourceType": "elasticmapreduce",
"ClusterId": "AKIAIOSFODNN7EXAMPLE"
}
}
展平由数组组成的数组
如果状态机中的 Parallel 或 Map 状态返回由数组组成的数组,则可以使用 ResultSelector 字段将他们转换为一个平面数组。您可以将此字段包含在 Parallel 或 Map 状态定义中,以操纵这些状态的结果。
要展平数组,请在 ResultSelector
字段中使用 JMESPath 语法 [*]
"ResultSelector": { "flattenArray.$": "$[*][*]" }
有关演示如何展平数组的示例,请参阅以下教程中的第 3 步: