

# 继续回滚更新
<a name="using-cfn-updating-stacks-continueupdaterollback"></a>

有时，当 CloudFormation 尝试回滚堆栈更新时，可能无法回滚在更新过程中所做的全部更改。这被称为 `UPDATE_ROLLBACK_FAILED` 状态。例如，您可能有一个堆栈开始回滚到已在 CloudFormation 之外删除的旧数据库实例。CloudFormation 并不知道此数据库已删除，因此，它假定此数据库实例仍存在并尝试回滚到此实例，从而导致更新回滚失败。

处于 `UPDATE_ROLLBACK_FAILED` 状态的堆栈无法更新，但可以将其回滚到工作状态（`UPDATE_ROLLBACK_COMPLETE`）。将堆栈恢复到其初始设置后，您可以尝试再次更新。

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

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

**继续回滚更新（控制台）**

1. 登录到 AWS 管理控制台 并打开 CloudFormation 控制台 [https://console.aws.amazon.com/cloudformation](https://console.aws.amazon.com/cloudformation/)。

1. 在屏幕顶部的导航栏中，选择堆栈所在的 AWS 区域。

1. 在**堆栈**页面上，选择要更新的堆栈，然后依次选择**堆栈操作**、**继续更新回滚**。

   如果 [错误故障排除](troubleshooting.md#troubleshooting-errors) 中的解决方案都不起作用，则您可使用高级选项跳过 CloudFormation 无法成功回滚的资源。您必须[查找](cfn-console-view-stack-data-resources.md)并键入要跳过的资源的逻辑 ID。应只指定在 `UpdateRollback` 期间而不是转发更新期间进入 `UPDATE_FAILED` 状态的资源。
**警告**  
CloudFormation 将指定资源的状态设置为 `UPDATE_COMPLETE` 并继续回滚堆栈。回滚完成后，已跳过资源的状态将与堆栈模板中资源的状态不一致。在执行另一个堆栈更新之前，您必须更新堆栈或资源以使其互相保持一致。如果您没有这样做，后续堆栈更新可能失败，并且堆栈将变得无法恢复。

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

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

**继续回滚更新 (AWS CLI)**
+ 在 [https://docs.aws.amazon.com/cli/latest/reference/cloudformation/continue-update-rollback.html](https://docs.aws.amazon.com/cli/latest/reference/cloudformation/continue-update-rollback.html) 命令中使用 `--stack-name` 选项可指定要继续执行回滚操作的堆栈的 ID。

## 继续回滚失败的嵌套堆栈更新
<a name="nested-stacks"></a>

如果相互之间有多个嵌套堆栈，则可能需要跳过多个嵌套级别的资源，才能使整个堆栈层次结构恢复到正常工作状态。

例如，您有一个名为 `WebInfra` 的根堆栈，其中包含两个较小的堆栈：`WebInfra-Compute` 和 `WebInfra-Storage`。这两个堆栈中也有自己的嵌套堆栈。

如果更新期间出现问题并且更新过程失败，则整个堆栈层次结构最终可能会处于 `UPDATE_ROLLBACK_FAILED` 状态，如下图所示。

![\[显示三层嵌套堆栈层次结构的图。\]](http://docs.aws.amazon.com/zh_cn/AWSCloudFormation/latest/UserGuide/images/cfn-update-stack-continue-update-rollback_nested-stacks.png)


**注意**  
为简单起见，本示例中的堆栈名称被截断了。子堆栈名称通常由 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 即可，例如 `myCustom`。但是，对于嵌套堆栈中包含的资源，您必须同时提供嵌套堆栈名称及其逻辑 ID，并以句点分隔。例如 `WebInfra-Compute-Asg.myAsg`。

```
aws cloudformation continue-update-rollback --stack-name WebInfra \
    --resources-to-skip myCustom 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 控制台查看堆栈信息](cfn-console-view-stack-data-resources.md)。