继续回滚更新
有时,当 CloudFormation 尝试回滚堆栈更新时,可能无法回滚在更新过程中所做的全部更改。这被称为 UPDATE_ROLLBACK_FAILED
状态。例如,您可能有一个堆栈开始回滚到已在 CloudFormation 之外删除的旧数据库实例。CloudFormation 并不知道此数据库已删除,因此,它假定此数据库实例仍存在并尝试回滚到此实例,从而导致更新回滚失败。
处于 UPDATE_ROLLBACK_FAILED
状态的堆栈无法更新,但可以将其回滚到工作状态(UPDATE_ROLLBACK_COMPLETE
)。将堆栈恢复到其初始设置后,您可以尝试再次更新。
在大多数情况下,您必须修复导致更新回滚失败的错误,然后才能继续回滚堆栈。但在某些情况 (如堆栈操作超时) 下,您可在不做任何更改的情况下继续执行回滚操作。
注意
如果您使用嵌套堆栈,则在回滚父堆栈时还会尝试回滚所有子堆栈。
继续回滚更新(控制台)
登录到 AWS Management Console 并打开 AWS CloudFormation 控制台 https://console.aws.amazon.com/cloudformation
。 -
在屏幕顶部的导航栏中,选择堆栈所在的 AWS 区域。
-
在堆栈页面上,选择要更新的堆栈,然后依次选择堆栈操作、继续更新回滚。
如果 纠正错误 中的解决方案都不起作用,则您可使用高级选项跳过 CloudFormation 无法成功回滚的资源。您必须查找并键入要跳过的资源的逻辑 ID。应只指定在
UpdateRollback
期间而不是转发更新期间进入UPDATE_FAILED
状态的资源。警告
CloudFormation 将指定资源的状态设置为
UPDATE_COMPLETE
并继续回滚堆栈。回滚完成后,已跳过资源的状态将与堆栈模板中资源的状态不一致。在执行另一个堆栈更新之前,您必须更新堆栈或资源以使其互相保持一致。如果您没有这样做,后续堆栈更新可能失败,并且堆栈将变得无法恢复。指定成功回滚堆栈所需的资源的最小数量。例如,失败的资源更新可能导致从属资源失败。在此情况下,可能不必跳过从属资源。
要跳过属于嵌套堆栈的资源,请使用以下格式:
。如果要在NestedStackName
.ResourceLogicalID
Type: AWS::CloudFormation::Stack
列表中指定堆栈资源 (ResourcesToSkip
) 的逻辑 ID,则其相应的嵌入式堆栈必须处于以下状态之一:DELETE_IN_PROGRESS
、DELETE_COMPLETE
或DELETE_FAILED
。
继续回滚更新 (AWS CLI)
-
在 continue-update-rollback 命令中使用
--stack-name
选项可指定要继续执行回滚操作的堆栈的 ID。
继续回滚失败的嵌套堆栈更新
如果相互之间有多个嵌套堆栈,则可能需要跳过多个嵌套级别的资源,才能使整个堆栈层次结构恢复到正常工作状态。
例如,您有一个名为 WebInfra
的根堆栈,其中包含两个较小的堆栈:WebInfra-Compute
和 WebInfra-Storage
。这两个堆栈中也有自己的嵌套堆栈。
如果更新期间出现问题并且更新过程失败,则整个堆栈层次结构最终可能会处于 UPDATE_ROLLBACK_FAILED
状态,如下图所示。
注意
为简单起见,本示例中的堆栈名称被截断了。子堆栈名称通常由 CloudFormation 生成,并且包含唯一的随机字符串,因此实际名称可能不够“用户友好”。
要使用 continue-update-rollback
命令将根堆栈置于正常工作状态,必须使用 --resources-to-skip
选项跳过回滚失败的资源。
以下 continue-update-rollback 示例从之前失败的堆栈更新中恢复回滚操作。在此示例中,--resources-to-skip
选项包含以下项目:
-
myCustom
-
WebInfra-Compute-Asg.myAsg
-
WebInfra-Compute-LB.myLoadBalancer
-
WebInfra-Storage.DB
对于根堆栈的资源,您只需要提供逻辑 ID 即可,例如
。但是,对于嵌套堆栈中包含的资源,您必须同时提供嵌套堆栈名称及其逻辑 ID,并以句点分隔。例如,myCustom
。WebInfra-Compute-Asg.myAsg
aws cloudformation continue-update-rollback --stack-name
WebInfra
\ --resources-to-skipmyCustom WebInfra-Compute-Asg.myAsg WebInfra-Compute-LB.myLoadBalancer WebInfra-Storage.DB
查找嵌套堆栈的堆栈名称
您可以在子堆栈的堆栈 ID 或 Amazon 资源名称(ARN)中找到此信息。
以下 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。有关更多信息,请参阅 从 CloudFormation 控制台查看堆栈信息。