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

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

Redriving Map Run

您可以通过redriving父工作流,重新启动未成功的子工作流执行。redriven父工作流会redrives所有未成功的状态,包括分布式 Map。如果父工作流完成执行时没有与状态的 <stateType>Exited 事件相对应的 <stateType>Entered 事件,则父工作流会重新驱动未成功的状态。例如,如果事件历史记录不包含与 MapStateEntered 事件对应的 MapStateExited 事件,则可以redrive父工作流,以便redrive Map Run 中所有未成功的子工作流执行。

当状态机没有访问 ItemReaderResultWriter 或两者所需的权限时,Map Run 要么未启动,要么在原始执行尝试中失败。如果 Map Run 没有在父工作流的原始执行尝试中启动,则redriving父工作流将首次启动 Map Run。要解决这个问题,请在状态机角色中添加所需的权限,然后redrive父工作流。如果在未添加所需权限的情况下redrive父工作流,则会尝试启动新的 Map Run 运行,但会再次失败。有关可能需要的权限信息,请参阅使用分布式 Map 状态的 IAM 策略

Map Run 中子工作流的Redrive资格

如果满足以下条件,您可以在 Map Run 中redrive未成功的子工作流执行:

  • 在 2023 年 11 月 15 日或之后启动父工作流执行。在此日期之前开始的执行不符合redrive资格。

  • 您没有超过给定 Map Run 的 1000 次redrives硬限制。如果已超过此限制,则会收到 States.Runtime 错误消息。

  • 父工作流是redrivable。如果父工作流无法redrivable,则无法在 Map Run 中redrive子工作流。有关工作流redrive资格的更多信息,请参阅未成功执行的Redrive资格

  • Map Run 中标准类型的子工作流执行未超过 2.5 万个执行事件历史记录上限。超过事件历史记录上限的子工作流执行将计入容许的故障阈值并被视为失败。有关执行redrive资格的更多信息,请参阅未成功执行的Redrive资格

在以下情况下,即使 Map Run 在原始执行尝试中失败,也会启动新的 Map Run,而不会redriven现有的地图运行:

即使在父工作流停止或超时后,Map Run 仍可以继续运行。在这些情况下,redrive不会立即发生:

  • Map Run 可能仍在取消正在进行的标准类型子工作流执行,或者等待快速类型子工作流执行完成执行。

  • 如果您将 Map Run 配置为导出结果,它可能仍在向 ResultWriter 中写入结果。

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

子工作流执行redrive行为

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

快速子工作流 标准子工作流
所有在原始执行尝试中失败或超时的子工作流程执行均使用 StartExecutionAPI 操作启动。首先运行 ItemProcessor 中的第一个状态。 所有在原始执行尝试中失败、超时或取消的子工作流执行均使用 RedriveExecution API 操作redriven。这些子工作流程redriven来自导致其执行失败的最后一个状态。 ItemProcessor

未成功的执行可始终redriven。这是因为 Express 子工作流程执行总是使用 StartExecution API 操作作为新执行启动。

未成功的标准子工作流执行并不总是可以redriven。如果执行无法redrivable,就不会再尝试执行。执行的最后一个错误或输出是永久性的。当执行的历史事件超过 2.5 万个,或可redrivable的 14 天期限已过,就有可能出现这种情况。

redrivable如果父工作流执行在 14 天内关闭,但子工作流执行在 14 天前关闭,则标准子工作流执行可能无法。

快速子工作流执行使用与原始执行尝试相同的执行 ARN,但无法明确识别其单独的redrives。 标准子工作流执行使用与原始执行尝试相同的执行 ARN。您可以在控制台redrives中使用 API(例如GetExecutionHistoryDescribeExecution)清楚地识别个人身份。有关更多信息,请参阅检查redriven执行

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

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

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

Map Run redrive时使用的输入场景

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

原始执行尝试中的输入 Map Run redrive时使用的输入
从上一状态传递的输入或执行输入。 redriven Map Run 使用相同的输入。
由于以下条件之一为 true,使用 ItemReader 传递的输入和 Map Run 未启动子工作流执行:
redriven Map Run 使用 Amazon S3 存储桶中的输入。
使用传递的输入 ItemReader。启动或尝试启动子工作流执行后,Map Run 失败。 redriven Map Run 使用的输入与原始执行尝试中提供的输入相同。

redrive Map Run 的 IAM 权限

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

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

在控制台中Redriving Map Run

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


                由于 Map Run 失败导致的状态机执行失败的图表。
从控制台中redrive Map Run 的操作步骤
  1. 打开 Step Functions 控制台,然后选择一个包含执行失败的分布式 Map 的现有状态机。

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

  3. 选择Redrive

  4. Redrive对话框中,选择Redrive执行

    提示

    您也可以从执行详细信息Map Run 详细信息 页面redrive Map Run。

    如果您在执行详细信息 页面上,请进行以下操作之一来redrive执行:

    • 选择恢复,然后从故障中Redrive

    • 选择操作,然后选择Redrive

    如果您在 Map Run 详细信息 页面上,请选择恢复,然后选择从故障中Redrive

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

  5. 执行详细信息 页面中,选择 Map Run,查看redriven Map Run 的详细信息。

    在此页面上,您可以查看redriven执行的结果。例如,在该 Map Run 执行摘要部分中,您可以看到Redrive计数,它表示redriven Map Run 的次数。在事件部分,可以看到与redrive相关的执行事件附加到原始执行尝试的事件中。有关示例,请参阅 MapRunRedriven 事件。

完成 Map Run 后,您可以在控制台中或使用GetExecutionHistoryDescribeExecutionAPI 操作查看其redrive详细信息。redriven有关检查redriven执行的更多信息,请参阅检查redriven执行

使用 API Redriving Map Run

您可以使用父工作流上的 RedriveExecution API redrive符合条件的 Map Run。此 API 可重启 Map Run 中未成功的子工作流执行。

在 Amazon Command Line Interface (Amazon CLI) 中,运行以下命令来redrive未成功的状态机执行。切记用特定资源信息替换斜体 文本。

aws stepfunctions redrive-execution --execution-arn arn:aws:states:us-east-2:123456789012:execution:myStateMachine:foo

完成 Map Run 后,您可以在控制台中或使用 DescribeMapRunAPI 操作查看其redrive详细信息。redriven要在 Map Run 中查看标准工作流程执行的redrive详细信息,您可以使用GetExecutionHistoryDescribeExecutionAPI 操作。有关检查redriven执行的更多信息,请参阅检查redriven执行

如果在父工作流上启用了日志记录功能,则可以在 Step Functions 控制台中检查 Map Run 中快速工作流执行的redrive详细信息。有关更多信息,请参阅 使用 CloudWatch Logs 进行日志记录