Map - AWS Step Functions
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

如果我们为英文版本指南提供翻译,那么如果存在任何冲突,将以英文版本指南为准。在提供翻译时使用机器翻译。

Map

Map 状态 "Type": "Map") 可用于为输入数组的每个元素运行一组步骤。尽管 Parallel 状态使用相同的输入执行步骤的多个分支,但 Map 状态将对状态输入中数组的多个条目执行相同的步骤。

有关使用 Map 状态的介绍,请参阅映射状态教程

除了常用状态字段之外,Map 状态还包括这些额外字段。

Iterator (必填)

Iterator 字段的值是一个对象,该对象定义一个状态机,该状态机将处理数组的每个元素。

ItemsPath (可选)

ItemsPath 字段的值是一个参考路径,标识在有效输入中找到数组字段的位置。有关更多信息,请参阅 ItemsPath。)

Iterator 字段内的状态只能相互转换,而 ItemsPath 字段外的任何状态都不能转换为其内部的状态。

如果任何迭代失败,整个映射状态会失败,并终止所有迭代。

MaxConcurrency (可选)

MaxConcurrency 字段的值是一个整数,它提供迭代器可以并行运行的调用数量上限。例如,MaxConcurrency 值为 10 将限制您的 Map 状态同时运行 10 个并发迭代。

注意

并行迭代可能受到限制。发生这种情况时,在完成以前的迭代之前,不会开始一些迭代。当输入阵列有超过40个项目时,发生这种情况的可能性会增加。

默认值为 0,这对并行性没有配额,并且尽可能并发地调用迭代。

MaxConcurrency 值为 1 时,将为每个数组元素按其在输入中出现的顺序调用 Iterator 一次,并且在前一个数组完成之前不会开始新的迭代。

ResultPath (可选)

指定 (输入中) 用于放置分支输出的位置。接下来,输入将按照 OutputPath 字段(如果存在)指定的内容进行筛选,然后再用作状态输出。有关更多信息,请参阅输入和输出处理

ResultSelector (可选)

通过一系列键值对,其中值是静态的或从结果中选择。有关更多信息,请参阅 ResultSelector。)

Retry (可选)

一个称为重试器的对象的数组,定义在状态遇到运行时错误的情况下的重试策略。有关更多信息,请参阅 使用 Retry 和使用 Catch 的示例。)

Catch (可选)

一个称为捕获器的对象的数组,定义在状态遇到运行时错误并且其重试策略已耗尽或者未定义的情况下执行的回退状态。有关更多信息,请参阅回退状态

映射状态示例

请考虑 Map 状态的以下输入数据。

{ "ship-date": "2016-03-14T01:59:00Z", "detail": { "delivery-partner": "UQS", "shipped": [ { "prod": "R31", "dest-code": 9511, "quantity": 1344 }, { "prod": "S39", "dest-code": 9511, "quantity": 40 }, { "prod": "R31", "dest-code": 9833, "quantity": 12 }, { "prod": "R40", "dest-code": 9860, "quantity": 887 }, { "prod": "R40", "dest-code": 9511, "quantity": 1220 } ] } }

给定前面的输入,以下示例中的 Map 状态将为 shipped 字段中数组的每个项目调用一次 AWS Lambda 函数 (ship-val)。

"Validate-All": { "Type": "Map", "InputPath": "$.detail", "ItemsPath": "$.shipped", "MaxConcurrency": 0, "Iterator": { "StartAt": "Validate", "States": { "Validate": { "Type": "Task", "Resource": "arn:aws:lambda:us-east-1:123456789012:function:ship-val", "End": true } } }, "ResultPath": "$.detail.shipped", "End": true }

Map 状态的每次迭代都会将数组中的一个项目(通过 ItemsPath 字段选择)作为输入发送到 Lambda 函数。例如,一个 Lambda 调用的输入如下所示。

{ "prod": "R31", "dest-code": 9511, "quantity": 1344 }

完成后,Map 状态的输出是一个 JSON 数组,其中每个项目都是迭代的输出(在这种情况下,是 ship-valLambda 函数的输出)。

带参数的 Map 状态示例

假设上一个示例中的 ship-valLambda 函数还需要有关货件快递员以及每次迭代的数组中项目的信息。您可以包括来自输入的信息,以及特定于映射状态的当前迭代的信息。请注意下面示例中的 Parameters 字段。

"Validate-All": { "Type": "Map", "InputPath": "$.detail", "ItemsPath": "$.shipped", "MaxConcurrency": 0, "ResultPath": "$.detail.shipped", "Parameters": { "parcel.$": "$$.Map.Item.Value", "courier.$": "$.delivery-partner" }, "Iterator": { "StartAt": "Validate", "States": { "Validate": { "Type": "Task", "Resource": "arn:aws:lambda:us-east-1:123456789012:function:ship-val", "End": true } } }, "End": true }

Parameters 块用一个 JSON 节点替换了迭代的输入,该节点既包含上下文对象中的当前项目数据,又包含 Map 状态输入中 delivery-partner 字段的快递员信息。以下是单个迭代的输入的示例,输入内容传递给 ship-valLambda 函数的调用。

{ "parcel": { "prod": "R31", "dest-code": 9511, "quantity": 1344 }, "courier": "UQS" }

在前面的 Map 状态示例中,ResultPath 字段产生的输出与输入相同,但是 detail.shipped 字段被一个数组覆盖,此数组中的每个元素对于每次迭代都是 ship-valLambda 函数的输出。

有关更多信息,请参阅以下内容:。

映射状态输入和输出处理

对于映射状态,InputPath 的工作原理与其他状态类型一样,同时选择输入的子集。

Map 状态的输入必须包含一个 JSON 数组,并且它将对该数组中的每个项目运行一次 Iterator 部分。您可以使用 ItemsPath 字段指定在输入中查找该数组的位置。如果未指定,ItemsPath 的值为 $,而 Iterator 部分预期此数组是唯一的输入。Map 状态也可以包括一个 ItemsPath 字段,其值必须是参考路径ItemsPath 字段选择要在输入中查找用于迭代的数组的位置。引用路径应用于有效输入(应用 InputPath 之后),并且必须标识其值为 JSON 数组的字段。

默认情况下,每次迭代的输入都是由 ItemsPath 值标识的数组字段的单个元素。可以使用 Parameters 字段覆盖该元素。

完成后,Map 状态的输出是一个 JSON 数组,其中每个项目都是迭代的输出。

有关更多信息,请参阅以下内容:。