InputPath、参数和 ResultSelector - AWS Step Functions

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

InputPath、参数和 ResultSelector

InputPathParametersResultSelector 字段提供了一种在 JSON 流经工作流时操纵它的方法。InputPath 可以通过使用路径筛选 JSON 表示法来限制传递的输入(请参阅路径)。Parameters 字段使您可以传递键值对的集合,其中值是您在状态机定义中定义的静态值,或者是使用路径从输入中选择的值。ResultSelector 字段提供了一种在应用 ResultPath 状态之前操作状态结果的方法。

AWS Step Functions 首先应用InputPath字段,然后应用字Parameters段。您可以先使用 InputPath 将原始输入筛选为所选内容,然后应用 Parameters 进一步操作该输入,或添加新值。然后,您可以在应用 ResultPath 状态之前使用 ResultSelector 字段来操作状态的输出。

提示

使用 Step Functions 控制台中的数据流模拟器来测试 JSON 路径语法,以更好地了解在状态下如何操作数据,并查看数据在状态之间是如何传递的。

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 来存储数据,并实施以下方法之一:

或者,您也可以调整实施,以便在执行中传递较少的有效负载。

ResultSelector

在应用 ResultPath 之前,使用 ResultSelector 字段来操作状态的结果。ResultSelector 字段可用于创建键值对的集合,其中值为静态值或从状态的结果中选择。使用 ResultSelector 字段,您可以选择要将状态结果的哪些部分传递给 ResultPath 字段。

注意

使用 ResultPath 字段,您可以将 ResultSelector 字段的输出添加到原始输入中。

ResultSelector 是处于以下状态的可选字段:

例如,除了结果中的有效负载外,Step Functions 服务集成还会返回元数据。ResultSelector 可以选择结果的某些部分并使用 ResultPath 将其与状态输入合并。在此示例中,我们只想选择 resourceTypeClusterId,然后将其与来自 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 选择 resourceTypeClusterId

"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" } }

展平由数组组成的数组

如果状态机中的 ParallelMap 状态返回由数组组成的数组,则可以使用 ResultSelector 字段将他们转换为一个平面数组。您可以将此字段包含在 Parallel 或 Map 状态定义中,以操纵这些状态的结果。

要展平数组,请在 ResultSelector 字段中使用 JMESPath 语法 [*],如下方的示例所示。

"ResultSelector": { "flattenArray.$": "$[*][*]" }

有关演示如何展平数组的示例,请参阅以下教程中的第 3 步