

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

# 在 Step Functions 执行中Redriving Map Run
<a name="redrive-map-run"></a>

您可以通过[redriving](redrive-executions.md)[父工作流](state-map-distributed.md#dist-map-orchestrate-parallel-workloads-key-terms)，重新启动未成功的子工作流执行。redriven父工作流会redrives所有未成功的状态，包括分布式 Map。如果父工作流完成执行时没有与状态的 `<stateType>Exited` 事件相对应的 `<stateType>Entered` 事件，则父工作流会重新驱动未成功的状态。例如，如果事件历史记录不包含与 `MapStateEntered` 事件对应的 `MapStateExited` 事件，则可以redrive父工作流，以便redrive Map Run 中所有未成功的子工作流执行。

当状态机没有访问 [ItemReader （地图）](input-output-itemreader.md)、[ResultWriter （地图）](input-output-resultwriter.md) 或两者所需的权限时，Map Run 要么未启动，要么在原始执行尝试中失败。如果 Map Run 没有在父工作流的原始执行尝试中启动，则redriving父工作流将首次启动 Map Run。为解决这个问题，请向状态机角色添加所需的权限，然后redrive父工作流程。如果在未添加所需权限的情况下redrive父工作流，则会尝试启动新的 Map Run 运行，但会再次失败。有关可能需要的权限信息，请参阅[使用分布式 Map 状态的 IAM 策略](iam-policies-eg-dist-map.md)。

**Contents**
+ [Map Run 中子工作流的Redrive资格](#redrive-eligibility-map-run)
+ [子工作流执行redrive行为](#redrive-child-workflow-behavior)
+ [Map Run redrive时使用的输入场景](#maprun-redrive-input)
+ [redrive Map Run 的 IAM 权限](#maprun-iam-permission)
+ [在控制台中Redriving Map Run](#redrive-maprun-console)
+ [使用 API Redriving Map Run](#redrive-maprun-api)

## Map Run 中子工作流的Redrive资格
<a name="redrive-eligibility-map-run"></a>

如果满足以下条件，您可以在 Map Run 中redrive未成功的子工作流执行：
+ 在 2023 年 11 月 15 日或之后启动父工作流执行。在此日期之前开始的执行不符合redrive资格。
+ 您没有超过给定 Map Run 的 1000 次redrives硬限制。如果已超过此限制，则会收到 `States.Runtime` 错误消息。
+ 父工作流是redrivable。如果父工作流无法redrivable，则无法在 Map Run 中redrive子工作流。有关工作流redrive资格的更多信息，请参阅[未成功执行的Redrive资格](redrive-executions.md#redrive-eligibility)。
+ Map Run 中标准类型的子工作流执行未超过 2.5 万个执行事件历史记录上限。超过事件历史记录上限的子工作流执行将计入[容许的故障阈值](state-map-distributed.md#maprun-fail-threshold)并被视为失败。有关执行redrive资格的更多信息，请参阅[未成功执行的Redrive资格](redrive-executions.md#redrive-eligibility)。

在以下情况下，即使 Map Run 在原始执行尝试中失败，也会启动新的 Map Run，而不会redriven现有的地图运行：
+ 由于 `States.DataLimitExceeded` 错误，Map Run 失败。
+ 由于 JSON 数据插值错误 (`States.Runtime`)，Map Run 失败。例如，您在 [使用 OutputPath 筛选状态输出](input-output-example.md#input-output-outputpath) 中选择了一个不存在的 JSON 节点。

即使在父工作流停止或超时后，Map Run 仍可以继续运行。在这些情况下，redrive不会立即发生：
+ Map Run 可能仍在取消正在进行的标准类型子工作流执行，或者等待快速类型子工作流执行完成执行。
+ 如果您将 Map Run 配置为导出结果，它可能仍在向 [ResultWriter （地图）](input-output-resultwriter.md) 中写入结果。

在这些情况下，正在运行的 Map Run 会在尝试redrive之前完成其操作。

## 子工作流执行redrive行为
<a name="redrive-child-workflow-behavior"></a>

Map Run 中的redriven子工作流执行表现出下表所述的行为。


| 快速子工作流 | 标准子工作流 | 
| --- | --- | 
| 所有在原始执行尝试中失败或超时的子工作流程执行均使用 [StartExecution](https://docs.aws.amazon.com/step-functions/latest/apireference/API_StartExecution.html)API 操作启动。首先运行 [ItemProcessor](state-map-distributed.md#distitemprocessor) 中的第一个状态。 | 所有在原始执行尝试中失败、超时或取消的子工作流执行均使用 [https://docs.aws.amazon.com/step-functions/latest/apireference/API_RedriveExecution.html](https://docs.aws.amazon.com/step-functions/latest/apireference/API_RedriveExecution.html)API 操作redriven。这些子工作流程redriven来自导致其执行失败的最后一个状态。 ItemProcessor  | 
|  未成功的执行可始终redriven。这是因为 Express 子工作流程执行总是使用 StartExecution API 操作作为新执行启动。  | 未成功的标准子工作流执行并不总是可以redriven。如果执行无法redrivable，就不会再尝试执行。执行的最后一个错误或输出是永久性的。当执行的历史事件超过 2.5 万个，或可redrivable的 14 天期限已过，就有可能出现这种情况。 redrivable如果父工作流执行在 14 天内关闭，但子工作流执行在 14 天前关闭，则标准子工作流执行可能无法。 | 
| 快速子工作流执行使用与原始执行尝试相同的执行 ARN，但无法明确识别其单独的redrives。 | 标准子工作流执行使用与原始执行尝试相同的执行 ARN。您可以在控制台redrives中清楚地识别个人身份 APIs，并使用诸如[GetExecutionHistory](https://docs.aws.amazon.com/step-functions/latest/apireference/API_GetExecutionHistory.html)和。[DescribeExecution](https://docs.aws.amazon.com/step-functions/latest/apireference/API_DescribeExecution.html)有关更多信息，请参阅 [检查redriven执行](redrive-executions.md#examine-redriven-executions)。 | 

如果您redriven一个 Map Run，并且已达到其并发数上限，则该 Map Run 中的子工作流执行会过渡到待处理状态。Map Run 的执行状态也会转换为**待redrive**状态。在指定的并发数上限允许运行更多子工作流执行之前，该执行将一直处于**待redrive**状态。

例如，工作流中分布式 Map 的并发数上限为 3000，而需要重新运行的子工作流数量为 6000。这会导致 3000 个子工作流并行运行，而其余 3000 个工作流程仍处于**待重启**状态。在第一批 3000 个子工作流完成执行后，剩余的 3000 个子工作流才会开始运行。

当 Map Run 完成执行或中止时，处于**待redrive**状态的子工作流执行计数将重置为 0。

## Map Run redrive时使用的输入场景
<a name="maprun-redrive-input"></a>

根据您在原始执行尝试中向分布式 Map 提供输入的方式，redriven Map Run 将使用下表中描述的输入。


| 原始执行尝试中的输入 | Map Run redrive时使用的输入 | 
| --- | --- | 
| 从上一状态传递的输入或执行输入。 | redriven Map Run 使用相同的输入。 | 
| 由于以下条件之一为 true，使用 [ItemReader （地图）](input-output-itemreader.md) 传递的输入和 Map Run 未启动子工作流执行：[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/step-functions/latest/dg/redrive-map-run.html)  | redriven Map Run 使用 Amazon S3 存储桶中的输入。 | 
| 使用传递的输入 ItemReader。启动或尝试启动子工作流执行后，Map Run 失败。 | redriven Map Run 使用的输入与原始执行尝试中提供的输入相同。 | 

## redrive Map Run 的 IAM 权限
<a name="maprun-iam-permission"></a>

Step Functions 需要适当的权限才能redrive Map Run。以下 IAM 策略示例向状态机授予了redriving Map Run 所需的最低权限。请记住用您的资源特定信息替换*italicized*文本。

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "states:RedriveExecution"
      ],
      "Resource": "arn:aws:states:us-east-2:123456789012:execution:myStateMachineName/myMapRunLabel:*"
    }
  ]
}
```

## 在控制台中Redriving Map Run
<a name="redrive-maprun-console"></a>

下图显示了包含分布式 Map 的状态机执行图。Map Run 失败，导致此执行失败。要redrive Map Run，必须redrive父工作流。

![\[由于 Map Run 失败导致的状态机执行失败的图表。\]](http://docs.aws.amazon.com/zh_cn/step-functions/latest/dg/images/redrive-eg-failed-maprun.png)


**从控制台中redrive Map Run 的操作步骤**

1. 打开 [Step Functions 控制台](https://console.aws.amazon.com/states/home?region=us-east-1#/)，然后选择一个包含执行失败的分布式 Map 的现有状态机。

1. 在状态机详细信息页面的**执行**下，选择此状态机的失败执行实例。

1. 选择**Redrive**。

1. 在**Redrive**对话框中，选择**Redrive执行**。
**提示**  
您也可以从*执行详细信息* 或 *Map Run 详细信息* 页面redrive Map Run。  
如果您在*执行详细信息* 页面上，请进行以下操作之一来redrive执行：  
选择**恢复**，然后**从故障中Redrive**。
选择**操作**，然后选择**Redrive**。
如果您在 *Map Run 详细信息* 页面上，请选择**恢复**，然后选择**从故障中Redrive**。

   请注意，redrive将使用相同的状态机定义和 ARN。它从原始执行失败的步骤开始继续执行。在此示例中，失败的步骤是名为 **Map** 的分布式 Map 步骤和其中的**处理输入**步骤。重新启动 Map Run 未成功的子工作流执行后，redrive将继续执行**完成**步骤。

1. 在*执行详细信息* 页面中，选择 **Map Run**，查看redriven Map Run 的详细信息。

   在此页面上，您可以查看redriven执行的结果。例如，在该 [Map Run 执行摘要](concepts-examine-map-run.md#map-run-exec-summary)部分中，您可以看到**Redrive计数**，它表示redriven Map Run 的次数。在**事件**部分，可以看到与redrive相关的执行事件附加到原始执行尝试的事件中。有关示例，请参阅 `MapRunRedriven` 事件。

完成 Map Run 后，您可以在控制台中或使用[GetExecutionHistory](https://docs.aws.amazon.com/step-functions/latest/apireference/API_GetExecutionHistory.html)和 [DescribeExecution](https://docs.aws.amazon.com/step-functions/latest/apireference/API_DescribeExecution.html)API 操作查看其redrive详细信息。redriven有关检查redriven执行的更多信息，请参阅[检查redriven执行](redrive-executions.md#examine-redriven-executions)。

## 使用 API Redriving Map Run
<a name="redrive-maprun-api"></a>

您可以使用父工作流上的 [https://docs.aws.amazon.com/step-functions/latest/apireference/API_RedriveExecution.html](https://docs.aws.amazon.com/step-functions/latest/apireference/API_RedriveExecution.html) API redrive[符合条件的](#redrive-eligibility-map-run) Map Run。此 API 可重启 Map Run 中未成功的子工作流执行。

在 AWS Command Line Interface (AWS CLI) 中，运行以下命令来redrive未成功的状态机执行。请记住用您的资源特定信息替换*italicized*文本。

```
aws stepfunctions redrive-execution --execution-arn arn:aws:states:us-east-2:account-id:execution:myStateMachine:foo
```

完成 Map Run 后，您可以在控制台中或使用 [DescribeMapRun](https://docs.aws.amazon.com/step-functions/latest/apireference/API_DescribeMapRun.html)API 操作查看其redrive详细信息。redriven要在 Map Run 中查看标准工作流程执行的redrive详细信息，您可以使用[GetExecutionHistory](https://docs.aws.amazon.com/step-functions/latest/apireference/API_GetExecutionHistory.html)或 [DescribeExecution](https://docs.aws.amazon.com/step-functions/latest/apireference/API_DescribeExecution.html)API 操作。有关检查redriven执行的更多信息，请参阅[检查redriven执行](redrive-executions.md#examine-redriven-executions)。

如果在父工作流上启用了日志记录功能，则可以在 [Step Functions 控制台](https://console.aws.amazon.com/states/home?region=us-east-1#/)中检查 Map Run 中快速工作流执行的redrive详细信息。有关更多信息，请参阅 [在 Step Functions 中使用 CloudWatch 日志记录执行历史记录](cw-logs.md)。