

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

# 在 Step Functions 中使用redrive来重新启动状态机执行
<a name="redrive-executions"></a>

可以使用redrive来重新启动过去 14 天内未成功完成的标准工作流程执行。其中包括执行失败、中止或超时的执行。

当您redrive执行时，Step Functions 将从未成功的步骤继续进行失败的执行，并使用相同的输入。Step Functions 会保留成功步骤的结果和执行历史记录，在redrive执行时不会重新运行这些步骤。例如，假设您的工作流包含两个状态：一个[Pass 工作流程状态](state-pass.md) 状态，后跟一个 [Task 工作流程状态](state-task.md) 状态。如果您的工作流执行在 Task 状态下失败，而您redrive执行，那么执行会重新安排时间，然后重新运行 Task 状态。

Redriven执行使用与原始执行尝试相同的状态机定义和执行 ARN。如果您原始执行尝试与[版本](concepts-state-machine-version.md)、[别名](concepts-state-machine-alias.md)或两者相关联，则redriven执行将与相同的版本、别名或两者相关联。即使更新别名指向其他版本，redriven执行也会继续使用与原始执行尝试相关联的版本。由于redriven执行使用相同的状态机定义，因此如果您更新状态机定义，则必须启动新的执行。

redrive执行时，状态机级别的超时（如果已定义）将重置为 0。有关状态机级别超时的更多信息，请参阅 `TimeoutSeconds`。

执行redrives被视为状态转换。有关状态转换如何影响计费的信息，请参阅 [Step Functions 定价](https://www.amazonaws.cn/step-functions/pricing/)。

## 未成功执行的Redrive资格
<a name="redrive-eligibility"></a>

如果您原始执行尝试满足以下条件，则可以redrive执行：
+ 在 2023 年 11 月 15 日或之后启动执行。在此日期之前开始的执行不符合redrive资格。
+ 执行状态不是 `SUCCEEDED`。
+ 工作流执行未超过 14 天的redrivable期限。Redrivable期限是指可以redrive给定执行的时间。这段时间从状态机完成执行的当天开始计算。
+ 工作流执行未超过一年的最长开放时间。有关状态机执行配额的信息，请参见[与状态机执行相关的配额](service-quotas.md#service-limits-state-machine-executions)。
+ 执行事件历史记录计数小于 24999。Redriven执行会将其事件历史记录附加到现有的事件历史记录中。确保您的工作流执行包含少于 24,999 个事件，从而可以容纳 `ExecutionRedriven` 历史事件和至少一个其他历史事件。

## 单个状态的Redrive行为
<a name="redrive-behavior-states"></a>

根据工作流中失败的状态，所有失败状态的redrive行为会有所不同。下表描述了所有状态的redrive行为。


| 状态名称 | Redrive执行行为 | 
| --- | --- | 
| [Pass 工作流程状态](state-pass.md) |  如果前面的步骤失败或状态机超时，Pass 状态将退出且不会在redrive上面执行。  | 
| [Task 工作流程状态](state-task.md) |  重新安排和启动 Task 状态。 redrive重新运行 Task 状态的执行时，该状态的 `TimeoutSeconds`（如果已定义）将重置为 0。有关超时的更多信息，请参阅 [Task 状态](state-task.md#task-state-fields)。  | 
| [Choice 工作流程状态](state-choice.md) | 重新评估 Choice 状态规则。 | 
| [Wait 工作流程状态](state-wait.md) |  如果状态指定的 `Timestamp` 或 `TimestampPath` 指向过去的时间戳，redrive会退出 Wait 状态并进入 `Next` 字段中指定的状态。  | 
| [Succeed 工作流程状态](state-succeed.md) |  进入 Succeed 状态的状态机执行不会redrive。  | 
| [Fail 工作流程状态](state-fail.md) |  重新进入 Fail 状态并再次失败。  | 
| [Parallel 工作流程状态](state-parallel.md) |  仅重新安排和redrives失败或中止的分支。 如果状态由于 `States.DataLimitExceeded` 错误而失败，则会重新运行 Parallel 状态，包括在原始执行尝试中成功的分支。  | 
| [内联 Map 状态](state-map-inline.md) |  仅重新安排和redrives失败或中止的迭代。 如果状态由于 `States.DataLimitExceeded` 错误而失败，则会重新运行内联 Map 状态，包括在原始执行尝试中成功的迭代。  | 
| [分布式 Map 状态](state-map-distributed.md) |  redrives [Map Run](concepts-examine-map-run.md) 中未成功执行的子工作流。有关更多信息，请参阅 [在 Step Functions 执行中Redriving Map Run](redrive-map-run.md)。 如果状态因 `States.DataLimitExceeded` 错误而失败，则重新运行分布式 Map 状态。这包括在原始执行尝试中成功的子工作流。  | 

## redrive执行的 IAM 权限
<a name="redrive-iam-permission"></a>

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

****  

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

有关redrive Map Run 所需权限的示例，请参阅[redriving分布式 Map 的 IAM 策略示例](iam-policies-eg-dist-map.md#iam-policy-redrive-dist-map)。

## 在控制台中Redriving执行
<a name="redrive-execution-console"></a>

您可以从 Step Functions 控制台中redrive符合条件的执行。

例如，假设您运行一个状态机，而 Parallel 状态运行失败。

下图显示了 **Parallel** 状态中名为 **Do square number** 的 **Lambda 调用**步骤已返回且失败。这导致了 **Parallel** 状态也失败。正在执行或未启动的分支将停止，状态机执行失败。

![\[失败的状态机执行的示例图。\]](http://docs.amazonaws.cn/step-functions/latest/dg/images/redrive-eg-failed-workflow.png)


**从控制台redrive执行**

1. 打开 [Step Functions 控制台](https://console.amazonaws.cn/states/home?region=us-east-1#/)，然后选择执行失败的现有状态机。

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

1. 选择**Redrive**。

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

   请注意，redrive将使用相同的状态机定义和 ARN。它从原始执行失败的步骤开始继续执行。在这个例子中，这里的步骤是 **Parallel** 状态下的 **Do square number** 步骤和 **Wait 3 sec** 分支。在 **Parallel** 状态下重新开始执行这些未成功的步骤后，redrive将继续执行到 **Done** 步骤。

1. 选择该执行，打开*执行详细信息* 页面。

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

## 使用 API Redriving执行
<a name="redrive-execution-api"></a>

您可以使用 [RedriveExecution](https://docs.amazonaws.cn/step-functions/latest/apireference/API_RedriveExecution.html)API 进行redrive[符合条件](#redrive-eligibility)的执行。此 API 会从失败、中止或超时的步骤中重新启动标准工作流的未成功执行。

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

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

## 检查redriven执行
<a name="examine-redriven-executions"></a>

您可以在控制台中检查redriven执行情况，也可以使用 APIs:[GetExecutionHistory](https://docs.amazonaws.cn/step-functions/latest/apireference/API_GetExecutionHistory.html)和[DescribeExecution](https://docs.amazonaws.cn/step-functions/latest/apireference/API_DescribeExecution.html)。

**在控制台中检查redriven执行**

1. 打开 [Step Functions 控制台](https://console.amazonaws.cn/states/home?region=us-east-1#/)，然后选择已redriven执行的现有状态机。

1. 打开*执行详细信息* 页面。

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

**使用检查redriven执行情况 APIs**  
如果您执行redriven了状态机，则可以使用以下方式之一 APIs 来查看有关redriven执行的详细信息。请记住用您的资源特定信息替换*italicized*文本。
+ GetExecutionHistory — 以事件列表的形式返回指定执行的历史记录。此 API 还会返回有关执行redrive尝试的详细信息（如果有）。

  在中 Amazon CLI，运行以下命令。

  ```
  aws stepfunctions get-execution-history --execution-arn arn:aws:states:us-east-2:account-id:execution:myStateMachine:foo
  ```
+ DescribeExecution — 提供有关状态机执行的信息。这可以是与执行关联的状态机、执行输入和输出、执行redrive详细信息（如果有）以及相关的执行元数据。

  在中 Amazon CLI，运行以下命令。

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

## redriven执行的重试行为
<a name="redrive-retry-behavior"></a>

如果redriven执行重新运行了已定义[重试](concepts-error-handling.md#error-handling-retrying-after-an-error)的 [Task 工作流程状态](state-task.md)、[Parallel 工作流程状态](state-parallel.md) 或[内联 Map 状态](state-map-inline.md)，这些状态的重试尝试计数将重置为 0，以便允许redrive上的最大尝试次数。对于redriven执行，您可以使用控制台跟踪这些状态的单个重试尝试。

**在控制台中检查单个重试尝试**

1. 在 [Step Functions 控制台](https://console.amazonaws.cn/states/home?region=us-east-1#/)的*执行详细信息* 页面上，选择redrive上已重试过的状态。

1. 选择**重试次数和redrives**选项卡。

1. 选择每次重试尝试旁边的箭头键来查看其详细信息。如果重试尝试成功，则可以在下拉框中显示的 **输出** 中查看结果。

下图举例说明了在原始执行尝试和redrives执行尝试中对某个状态执行的重试次数。在此图像中，原始执行尝试和redrive执行尝试中进行了三次重试。第四次redrive尝试执行成功并返回输出 16。

![\[说明性屏幕截图显示了三次失败的重试和第四次重试成功。\]](http://docs.amazonaws.cn/step-functions/latest/dg/images/task-retry-redrive.png)
