本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
映射
Map
状态 "Type": "Map"
) 可用于为输入数组的每个元素运行一组步骤。尽管 Parallel
状态使用相同的输入执行步骤的多个分支,但 Map
状态将对状态输入中数组的多个条目执行相同的步骤。
有关使用 Map
状态的介绍,请参阅映射状态教程。
除了常用状态字段之外,Map
状态还包括这些额外字段。
-
Iterator
(必需) -
此
Iterator
字段的值是一个对象,该对象定义一个状态机,该状态机将处理数组的每个元素。 -
ItemsPath
(可选) -
ItemsPath
字段的值是一个参考路径,标识在有效输入中找到数组字段的位置。有关更多信息,请参阅ItemsPath:Iterator
字段内的状态只能相互转换,而Iterator
字段外的任何状态都不能转换为其内部的状态。如果任何迭代失败,整个映射状态会失败,并终止所有迭代。
-
MaxConcurrency
(可选) -
MaxConcurrency
字段的值是一个整数,它提供迭代器可以并行运行的调用数量上限。例如,MaxConcurrency
值为 10 将限制您的Map
状态同时运行 10 个并发迭代。注意 并行迭代可能会受到限制。发生这种情况时,某些迭代要等到先前的迭代完成后才会开始。当您的输入数组包含超过 40 个项目时,发生这种情况的可能性就会增加。
要实现更高的并发数,可以考虑使用级联
Map
状态的嵌套状态机。例如,要实现 1024 的并发度,您可以构建一个包含迭代 32 次Map
状态的状态机,然后将该状态机嵌套到迭代 32 次的更高级别状态机的状态。Map
默认值为
0
,这对并行性没有配额,并且尽可能并发地调用迭代。MaxConcurrency
值为1
时,将为每个数组元素按其在输入中出现的顺序调用Iterator
一次,并且在前一个数组完成之前不会开始新的迭代。 -
ResultPath
(可选) -
指定 (输入中) 用于放置分支输出的位置。接下来,输入将按照
OutputPath
字段(如果存在)指定的内容进行筛选,然后再用作状态输出。有关更多信息,请参阅输入和输出处理。 -
ResultSelector
(可选) -
传递一组键值对,其中,这些值是静态的或从结果中选择的。有关更多信息,请参阅ResultSelector:
-
Retry
(可选) -
一个称为重试器的对象的数组,定义在状态遇到运行时错误的情况下的重试策略。有关更多信息,请参阅使用重试和使用 Catch 的示例:
注意 如果您为
Map
状态定义了 Retriers,则重试策略适用于所有Map
状态迭代,而不仅仅是失败的迭代。例如,如果您的Map
状态包含三个迭代,其中一次失败,并且您已经为该Map
状态定义了Retry
字段,则重试策略适用于所有Map
状态迭代,而不仅仅是失败的迭代。 -
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
字段中数组的每个项目调用一次 Amazon 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-val
Lambda 函数的输出)。
带参数的 Map 状态示例
假设前面示例中的ship-val
Lambda 函数还需要有关货件快递公司以及每次迭代的数组中物品的信息。您可以包括来自输入的信息,以及特定于映射状态的当前迭代的信息。请注意下面示例中的 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
字段的快递员信息。以下是单次迭代的输入示例,该输入传递给 Lship-val
ambda 函数的调用。
{
"parcel": {
"prod": "R31",
"dest-code": 9511,
"quantity": 1344
},
"courier": "UQS"
}
在前面的Map
状态示例中,该ResultPath字段生成的输出与输入相同,但该detail.shipped
字段被一个数组覆盖,其中每个元素都是每次迭代的ship-val
Lambda 函数的输出。
有关更多信息,请参阅下列内容。
映射状态输入和输出处理
对于映射状态,InputPath 的工作原理与其他状态类型一样,同时选择输入的子集。
Map
状态的输入必须包含一个 JSON 数组,并且它将对该数组中的每个项目运行一次 Iterator
部分。您可以指定ItemsPath字段,该字段选择输入中的哪个位置以查找用于迭代的数组。如果未指定,ItemsPath
的值为 $
,而 Iterator
部分预期此数组是唯一的输入。如果您指定ItemsPath
字段,则其值必须是参考路径,该路径应用于有效输入(应用后InputPath
),并且它必须标识值为 JSON 数组的字段。
默认情况下,每次迭代的输入都是由 ItemsPath
值标识的数组字段的单个元素。可以使用 Parameters
字段覆盖该元素。
完成后,Map
状态的输出是一个 JSON 数组,其中每个项目都是迭代的输出。
有关更多信息,请参阅下列内容。
要向您的部署Map
状态示例Amazon Web Services 账户,请参阅模块 5-Amazon Step Functions 工作室的选择状态和地图状态