继续回滚更新 - Amazon CloudFormation
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

继续回滚更新

Amazon CloudFormation 无法回滚更新期间的所有变更时,堆栈会进入 UPDATE_ROLLBACK_FAILED 状态。例如,您可能有一个堆栈开始回滚到已在 CloudFormation 之外删除的旧数据库实例。CloudFormation 并不知道此数据库已删除,因此,它假定此数据库实例仍存在并尝试回滚到此实例,从而导致更新回滚失败。

当堆栈处于 UPDATE_ROLLBACK_FAILED 状态时,您可以继续执行回滚操作,使其恢复到工作状态 (UPDATE_ROLLBACK_COMPLETE)。您无法更新处于 UPDATE_ROLLBACK_FAILED 状态的堆栈。但是,如果您能够继续回滚堆栈,则可使其回到初始设置,然后尝试再次更新它。

在大多数情况下,您必须修复导致更新回滚失败的错误,然后才能继续回滚堆栈。有关更多信息,请参阅 。但在某些情况 (如堆栈操作超时) 下,您可在不做任何更改的情况下继续执行回滚操作。

注意

如果您使用嵌套堆栈,则在回滚父堆栈时还会尝试回滚所有子堆栈。

继续回滚更新(控制台)
  1. 打开 Amazon CloudFormation 控制台,地址:https://console.aws.amazon.com/cloudformation

  2. 选择要更新的堆栈,然后依次选择 Stack actions (堆栈操作)Continue update rollback (继续更新回滚)

    如果 纠正错误 中的解决方案都不起作用,则您可使用高级选项跳过 CloudFormation 无法成功回滚的资源。您必须查找并键入要跳过的资源的逻辑 ID。应只指定在 UpdateRollback 期间而不是转发更新期间进入 UPDATE_FAILED 状态的资源。

    警告

    CloudFormation 将指定资源的状态设置为 UPDATE_COMPLETE 并继续回滚堆栈。回滚完成后,已跳过资源的状态将与堆栈模板中资源的状态不一致。在执行另一个堆栈更新之前,您必须更新堆栈或资源以使其互相保持一致。如果您没有这样做,后续堆栈更新可能失败,并且堆栈将变得无法恢复。

    指定成功回滚堆栈所需的资源的最小数量。例如,失败的资源更新可能导致从属资源失败。在此情况下,可能不必跳过从属资源。

    要跳过属于嵌套堆栈的资源,请使用以下格式:NestedStackName.ResourceLogicalID。如果要在 Type: AWS::CloudFormation::Stack 列表中指定堆栈资源 (ResourcesToSkip) 的逻辑 ID,则其相应的嵌入式堆栈必须处于以下状态之一:DELETE_IN_PROGRESSDELETE_COMPLETEDELETE_FAILED

继续回滚更新 (Amazon CLI)

使用 ResourcesToSkip 恢复嵌套堆栈层次结构

下图是一个处于 UPDATE_ROLLBACK_FAILED 状态的嵌套堆栈层次结构。在该示例中,WebInfra 根堆栈包含两个嵌套堆栈:WebInfra-ComputeWebInfra-Storage,它们又包含一个或多个嵌套堆栈。


        显示三层嵌套堆栈层次结构的图。
注意

为简单起见,本示例中的堆栈名称被截断了。子堆栈名称通常由 CloudFormation 生成,并且包含唯一的随机字符串,因此实际名称可能不够“用户友好”。

要使用 continue-update-rollback 成功地将根堆栈置于可操作状态,必须使用 resources-to-skip 参数跳过无法回滚的资源。在本示例中,resources-to-skip 包含以下项目:

  1. myCustom

  2. WebInfra-Compute-Asg.myAsg

  3. WebInfra-Compute-LB.myLoadBalancer

  4. WebInfra-Storage.DB

以下示例是完整的 Amazon CLI 命令:

$ aws cloudformation continue-update-rollback --stack-name WebInfra \ --resources-to-skip myCustom WebInfra-Compute-Asg.myAsg WebInfra-Compute-LB.myLoadBalancer WebInfra-Storage.DB

我们通过使用 NestedStackName.ResourceLogicalID 格式指定了嵌套堆栈的资源,但对于根堆栈的资源 (例如 myCustom),我们只指定了逻辑 ID。

查找嵌套堆栈的堆栈名称

您可以在子堆栈的堆栈 ID 或 Amazon 资源名称(ARN) 中找到其名称。在以下示例中,堆栈名称为 WebInfra-Storage-Z2VKC706XKXT

arn:aws:cloudformation:us-east-1:123456789012:stack/WebInfra-Storage-Z2VKC706XKXT/ea9e7f90-54f7-11e6-a032-028f3d2330bd

查找嵌套堆栈的逻辑 ID

您可以在子堆栈父级的模板定义中找到子堆栈的逻辑 ID。在该图中,WebInfra-Storage-DB 子堆栈的 LogicalId 是其父级 WebInfra-Storage 中的 DB

在 CloudFormation 控制台中,您还可以在 Resources(资源)选项卡或 Events(事件)选项卡上堆栈资源的 Logical ID(逻辑 ID)列中找到该逻辑 ID。