ResultPath - Amazon Step Functions
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

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

ResultPath

状态的输出可以是其输入的副本、其生成的结果(例如,Task 状态的 Lambda 函数的输出)或其输入和结果的组合。使用 ResultPath 可控制传递到状态输出的上述两种内容的组合。

以下状态类型可以生成结果且包含 ResultPath:

使用 ResultPath 可将任务结果与任务输入组合,或可选择二者之一。提供给 ResultPath 的路径控制将传递到输出的信息。

注意

ResultPath 限制为使用限制范围的引用路径,以便它可以仅标识 JSON 中的单一节点。请参阅 Amazon States Language 中的 引用路径

这些示例基于创建使用 Lambda 的 Step Functions 状态机教程中所述的状态机和 Lambda 函数。演练此教程并通过在 ResultPath 字段中尝试不同的路径来测试不同的输出。

提示

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

用于 ResultPath 用结果替换输入

如果没有指定 ResultPath,则默认行为是已指定 "ResultPath": "$"。由于这将指示状态将整个输入替换为结果,因此状态输入将由来自任务结果的结果完全替换。

下图显示了 ResultPath 如何将输入完全替换为任务的结果。


        将输入替换为 ResultPath。

使用创建使用 Lambda 的 Step Functions 状态机中所述的状态机和 Lambda 函数,并将 Lambda 函数的服务集成类型更改为 Amazon 开发工具包集成。为此,请在 Task 状态 Resource 字段中指定 Lambda 函数 Amazon 资源名称 (ARN),如下例所示。使用 Amazon SDK 集成可确保Task状态结果仅包含 Lambda 函数输出,不包含任何元数据。

{ "StartAt":"CallFunction", "States":{ "CallFunction": { "Type":"Task", "Resource":"arn:aws:lambda:us-east-2:123456789012:function:HelloFunction", "End": true } } }

然后,传递以下输入:

{ "comment": "This is a test of the input and output of a Task state.", "details": "Default example", "who": "AWS Step Functions" }

Lambda 函数提供以下结果。

"Hello, AWS Step Functions!"
提示

您可以在 Step Functions 控制台上查看此结果。为此,请在控制台的执行详细信息 页面上,在图表视图中选择 Lambda 函数。然后,在 步骤详细信息 窗格中选择输出选项卡以查看此结果。

如果状态中未指定 ResultPath,或者已设置 "ResultPath": "$",则状态的输入将由 Lambda 函数的结果取代,并且状态的输出为以下内容。

"Hello, AWS Step Functions!"
注意

ResultPath 用于包含结果内容与输入,然后再将其传递到输出。但是,如果未指定 ResultPath,则默认为替换整个输入。

丢弃结果并保留原始输入

如果将 ResultPath 设置为 null,它会将原始输入传递给输出。使用 "ResultPath": null 时,状态的输入有效负载将直接复制到输出中,而不考虑结果。

下图显示了 null ResultPath 如何将输入直接复制到输出。


        使用将输入复制到输出 ResultPath。

用于 ResultPath 将结果包含在输入中

下图显示了 ResultPath 如何包含结果与输入。


        将输入包括在内  ResultPath

使用在创建使用 Lambda 的 Step Functions 状态机教程中介绍的状态机和 Lambda 函数,我们可以传递以下输入。

{ "comment": "This is a test of the input and output of a Task state.", "details": "Default example", "who": "AWS Step Functions" }

Lambda 函数的结果为以下内容。

"Hello, AWS Step Functions!"

要保留输入,插入 Lambda 函数的结果,然后将组合的 JSON 传递到下一个状态,我们可以将 ResultPath 设置如下。

"ResultPath": "$.taskresult"

这包括 Lambda 函数的结果与原始输入。

{ "comment": "This is a test of input and output of a Task state.", "details": "Default behavior example", "who": "AWS Step Functions", "taskresult": "Hello, AWS Step Functions!" }

Lambda 函数的输出将作为 taskresult 的值追加到原始输入中。输入(包括新插入的值)将传递到下一个状态。

还可以将结果插入输入的子节点。将 ResultPath 设置为以下内容。

"ResultPath": "$.strings.lambdaresult"

使用以下输入开始执行。

{ "comment": "An input comment.", "strings": { "string1": "foo", "string2": "bar", "string3": "baz" }, "who": "AWS Step Functions" }

Lambda 函数的结果将作为输入中 strings 节点的子级插入。

{ "comment": "An input comment.", "strings": { "string1": "foo", "string2": "bar", "string3": "baz", "lambdaresult": "Hello, AWS Step Functions!" }, "who": "AWS Step Functions" }

状态输出现在包含原始输入 JSON 与作为子节点的结果。

ResultPath 用于使用结果更新输入中的节点

下图显示了 ResultPath 如何将输入中现有 JSON 节点的值更新为任务结果中的值。


        将输入替换为  ResultPath

使用在创建使用 Lambda 的 Step Functions 状态机教程中介绍的状态机和 Lambda 函数示例,我们可以传递以下输入。

{ "comment": "This is a test of the input and output of a Task state.", "details": "Default example", "who": "AWS Step Functions" }

Lambda 函数的结果为以下内容。

Hello, AWS Step Functions!

我们可覆盖现有节点,从而代替保留输入和将结果作为新节点插入 JSON。

例如,正如忽略或设置 "ResultPath": "$" 可覆盖整个节点一样,您可以指定单个节点来覆盖结果。

"ResultPath": "$.comment"

由于 comment 节点已存在于状态输入中,因此将 ResultPath 设置为 "$.comment" 会将输入中的该节点替换为 Lambda 函数的结果。如果未按 OutputPath 进一步筛选,则以下信息将传递到输出。

{ "comment": "Hello, AWS Step Functions!", "details": "Default behavior example", "who": "AWS Step Functions", }

comment 节点的值 "This is a test of the input and output of a Task state." 将由状态输出中 Lambda 函数的结果 "Hello, AWS Step Functions!" 替换。

ResultPath 用于在 a 中同时包含错误和输入 Catch

使用状态机处理 Step Functions 函数错误情形教程演示如何使用状态机捕获错误。在某些情况下,您可能希望保留原始输入与错误。在 Catch 中使用 ResultPath 可包含错误与原始输入,而不是替换它。

"Catch": [{ "ErrorEquals": ["States.ALL"], "Next": "NextTask", "ResultPath": "$.error" }]

如果上一 Catch 语句捕获错误,则它将在状态输入的 error 节点中包含结果。例如,对于以下输入:

{"foo": "bar"}

捕获错误时,状态输出为以下内容。

{ "foo": "bar", "error": { "Error": "Error here" } }

有关错误处理的更多信息,请参阅以下内容: