

# 监控堆栈进度
<a name="monitor-stack-progress"></a>

本节介绍如何监控当前正在进行的堆栈部署。CloudFormation 提供了按时间顺序排列的详细部署事件列表，显示部署进度和部署过程中遇到的任何问题。

**Topics**
+ [查看堆栈事件](view-stack-events.md)
+ [按操作查看堆栈事件](view-stack-events-by-operation.md)
+ [查看堆栈部署时间线图](stack-deployment-timeline-graph.md)
+ [了解堆栈创建事件](stack-resource-configuration-complete.md)
+ [监控堆栈更新](using-cfn-updating-stacks-monitor-stack.md)
+ [继续回滚更新](using-cfn-updating-stacks-continueupdaterollback.md)
+ [确定堆栈失败的原因](determine-root-cause-for-stack-failures.md)
+ [堆栈故障选项](stack-failure-options.md)

# 查看 CloudFormation 堆栈事件
<a name="view-stack-events"></a>

可以查看堆栈事件来监控堆栈及堆栈中资源的进度和状态。堆栈事件有助于您了解何时创建、更新或删除资源，以及堆栈部署是否按预期进行。

**Topics**
+ [查看堆栈事件（控制台）](#view-stack-events-console)
+ [查看堆栈事件（AWS CLI）](#view-stack-events-cli)
+ [堆栈状态代码](#cfn-console-view-stack-data-resources-status-codes)

## 查看堆栈事件（控制台）
<a name="view-stack-events-console"></a>

**查看堆栈事件**

1. 通过以下网址打开 CloudFormation 控制台：[https://console.aws.amazon.com/cloudformation](https://console.aws.amazon.com/cloudformation/)。

1. 在屏幕顶部的导航栏中，选择您在其中创建了堆栈的 AWS 区域。

1. 在 CloudFormation 控制台的 **Stacks**（堆栈）页面中，选择堆栈名称。CloudFormation 将显示选定堆栈的堆栈详细信息。

1. 选择**事件**选项卡以查看 CloudFormation 为堆栈生成的堆栈事件。

CloudFormation 每分钟自动刷新堆栈事件。此外，CloudFormation 会在新堆栈事件发生时显示**新事件可用**徽章。选择“刷新”图标可将这些事件加载到列表中。通过查看堆栈创建事件，您可以了解导致堆栈创建（或失败，如果您正在调试堆栈）的事件的顺序。

创建堆栈时，该堆栈会在**堆栈**页面列出，其状态为 `CREATE_IN_PROGRESS`。堆栈创建成功后，其状态将变为 `CREATE_COMPLETE`。

有关更多信息，请参阅[了解 CloudFormation 堆栈创建事件](stack-resource-configuration-complete.md)和[监控堆栈更新的进度](using-cfn-updating-stacks-monitor-stack.md)。

## 查看堆栈事件（AWS CLI）
<a name="view-stack-events-cli"></a>

您也可以在创建堆栈时使用 [describe-stack-events](https://docs.aws.amazon.com/cli/latest/reference/cloudformation/describe-stack-events.html) 命令查看所报告的事件。

以下 **describe-stack-events** 命令会描述 `my-stack` 堆栈事件。

```
aws cloudformation describe-stack-events --stack-name my-stack
```

以下为响应示例。

```
{
    "StackEvents": [
        {
            "StackId": "arn:aws:cloudformation:aws-region:123456789012:stack/my-stack/64726230-7edf-11f0-8a36-06453a64f325",
            "EventId": "7b755820-7edf-11f0-ab15-0673b09f3847",
            "StackName": "my-stack",
            "LogicalResourceId": "my-stack",
            "PhysicalResourceId": "arn:aws:cloudformation:aws-region:123456789012:stack/my-stack/64726230-7edf-11f0-8a36-06453a64f325",
            "ResourceType": "AWS::CloudFormation::Stack",
            "Timestamp": "2025-08-21T22:37:56.243000+00:00",
            "ResourceStatus": "CREATE_COMPLETE",
            "ClientRequestToken": "token"
        },
        {
            "StackId": "arn:aws:cloudformation:aws-region:123456789012:stack/my-stack/64726230-7edf-11f0-8a36-06453a64f325",
            "EventId": "WebServer-CREATE_COMPLETE-2025-08-21T22:37:54.356Z",
            "StackName": "my-stack",
            "LogicalResourceId": "WebServer",
            "PhysicalResourceId": "i-099df76cb31b866a9",
            "ResourceType": "AWS::EC2::Instance",
            "Timestamp": "2025-08-21T22:37:54.356000+00:00",
            "ResourceStatus": "CREATE_COMPLETE",
            "ResourceProperties": "{\"UserData\":\"IyEvYmluL2Jhc2gKeXVtIGluc3RhbGwgLXkgYXdzLWNmbi1ib290c3RyYXAKL29wdC9hd3MvYmluL2Nmbi1pbml0IC12IC0tc3RhY2sgc2Rmc2RhZnNhZHNka2wgLS1yZXNvdXJjZSBXZWJTZXJ2ZXIgLS1yZWdpb24gdXMtd2VzdC0yCg==\",\"ImageId\":\"ami-0bbc328167dee8f3c\",\"InstanceType\":\"t2.micro\",\"SecurityGroupIds\":[\"my-stack-WebServerSecurityGroup-n8A43bQT1ty2\"],\"Tags\":[{\"Value\":\"Bootstrap Tutorial Web Server\",\"Key\":\"Name\"}]}",
            "ClientRequestToken": "token"
        },
        {
            "StackId": "arn:aws:cloudformation:aws-region:123456789012:stack/my-stack/64726230-7edf-11f0-8a36-06453a64f325",
            "EventId": "WebServer-CREATE_IN_PROGRESS-2025-08-21T22:37:31.226Z",
            "StackName": "my-stack",
            "LogicalResourceId": "WebServer",
            "PhysicalResourceId": "i-099df76cb31b866a9",
            "ResourceType": "AWS::EC2::Instance",
            "Timestamp": "2025-08-21T22:37:31.226000+00:00",
            "ResourceStatus": "CREATE_IN_PROGRESS",
            "ResourceStatusReason": "Resource creation Initiated",
            "ResourceProperties": "{\"UserData\":\"IyEvYmluL2Jhc2gKeXVtIGluc3RhbGwgLXkgYXdzLWNmbi1ib290c3RyYXAKL29wdC9hd3MvYmluL2Nmbi1pbml0IC12IC0tc3RhY2sgc2Rmc2RhZnNhZHNka2wgLS1yZXNvdXJjZSBXZWJTZXJ2ZXIgLS1yZWdpb24gdXMtd2VzdC0yCg==\",\"ImageId\":\"ami-0bbc328167dee8f3c\",\"InstanceType\":\"t2.micro\",\"SecurityGroupIds\":[\"my-stack-WebServerSecurityGroup-n8A43bQT1ty2\"],\"Tags\":[{\"Value\":\"Bootstrap Tutorial Web Server\",\"Key\":\"Name\"}]}",
            "ClientRequestToken": "token"
        },
        {
            "StackId": "arn:aws:cloudformation:aws-region:123456789012:stack/my-stack/64726230-7edf-11f0-8a36-06453a64f325",
            "EventId": "WebServer-CREATE_IN_PROGRESS-2025-08-21T22:37:29.210Z",
            "StackName": "my-stack",
            "LogicalResourceId": "WebServer",
            "PhysicalResourceId": "",
            "ResourceType": "AWS::EC2::Instance",
            "Timestamp": "2025-08-21T22:37:29.210000+00:00",
            "ResourceStatus": "CREATE_IN_PROGRESS",
            "ResourceProperties": "{\"UserData\":\"IyEvYmluL2Jhc2gKeXVtIGluc3RhbGwgLXkgYXdzLWNmbi1ib290c3RyYXAKL29wdC9hd3MvYmluL2Nmbi1pbml0IC12IC0tc3RhY2sgc2Rmc2RhZnNhZHNka2wgLS1yZXNvdXJjZSBXZWJTZXJ2ZXIgLS1yZWdpb24gdXMtd2VzdC0yCg==\",\"ImageId\":\"ami-0bbc328167dee8f3c\",\"InstanceType\":\"t2.micro\",\"SecurityGroupIds\":[\"my-stack-WebServerSecurityGroup-n8A43bQT1ty2\"],\"Tags\":[{\"Value\":\"Bootstrap Tutorial Web Server\",\"Key\":\"Name\"}]}",
            "ClientRequestToken": "token"
        },
        {
            "StackId": "arn:aws:cloudformation:aws-region:123456789012:stack/my-stack/64726230-7edf-11f0-8a36-06453a64f325",
            "EventId": "WebServerSecurityGroup-CREATE_COMPLETE-2025-08-21T22:37:28.803Z",
            "StackName": "my-stack",
            "LogicalResourceId": "WebServerSecurityGroup",
            "PhysicalResourceId": "my-stack-WebServerSecurityGroup-n8A43bQT1ty2",
            "ResourceType": "AWS::EC2::SecurityGroup",
            "Timestamp": "2025-08-21T22:37:28.803000+00:00",
            "ResourceStatus": "CREATE_COMPLETE",
            "ResourceProperties": "{\"GroupDescription\":\"Allow HTTP access from my IP address\",\"SecurityGroupIngress\":[{\"CidrIp\":\"0.0.0.0/0\",\"Description\":\"HTTP\",\"FromPort\":\"80\",\"ToPort\":\"80\",\"IpProtocol\":\"tcp\"}]}",
            "ClientRequestToken": "token"
        },
        {
            "StackId": "arn:aws:cloudformation:aws-region:123456789012:stack/my-stack/64726230-7edf-11f0-8a36-06453a64f325",
            "EventId": "WebServerSecurityGroup-CREATE_IN_PROGRESS-2025-08-21T22:37:22.626Z",
            "StackName": "my-stack",
            "LogicalResourceId": "WebServerSecurityGroup",
            "PhysicalResourceId": "my-stack-WebServerSecurityGroup-n8A43bQT1ty2",
            "ResourceType": "AWS::EC2::SecurityGroup",
            "Timestamp": "2025-08-21T22:37:22.626000+00:00",
            "ResourceStatus": "CREATE_IN_PROGRESS",
            "ResourceStatusReason": "Resource creation Initiated",
            "ResourceProperties": "{\"GroupDescription\":\"Allow HTTP access from my IP address\",\"SecurityGroupIngress\":[{\"CidrIp\":\"0.0.0.0/0\",\"Description\":\"HTTP\",\"FromPort\":\"80\",\"ToPort\":\"80\",\"IpProtocol\":\"tcp\"}]}",
            "ClientRequestToken": "token"
        },
        {
            "StackId": "arn:aws:cloudformation:aws-region:123456789012:stack/my-stack/64726230-7edf-11f0-8a36-06453a64f325",
            "EventId": "WebServerSecurityGroup-CREATE_IN_PROGRESS-2025-08-21T22:37:20.186Z",
            "StackName": "my-stack",
            "LogicalResourceId": "WebServerSecurityGroup",
            "PhysicalResourceId": "",
            "ResourceType": "AWS::EC2::SecurityGroup",
            "Timestamp": "2025-08-21T22:37:20.186000+00:00",
            "ResourceStatus": "CREATE_IN_PROGRESS",
            "ResourceProperties": "{\"GroupDescription\":\"Allow HTTP access from my IP address\",\"SecurityGroupIngress\":[{\"CidrIp\":\"0.0.0.0/0\",\"Description\":\"HTTP\",\"FromPort\":\"80\",\"ToPort\":\"80\",\"IpProtocol\":\"tcp\"}]}",
            "ClientRequestToken": "token"
        },
        {
            "StackId": "arn:aws:cloudformation:aws-region:123456789012:stack/my-stack/64726230-7edf-11f0-8a36-06453a64f325",
            "EventId": "64740fe0-7edf-11f0-8a36-06453a64f325",
            "StackName": "my-stack",
            "LogicalResourceId": "my-stack",
            "PhysicalResourceId": "arn:aws:cloudformation:aws-region:123456789012:stack/my-stack/64726230-7edf-11f0-8a36-06453a64f325",
            "ResourceType": "AWS::CloudFormation::Stack",
            "Timestamp": "2025-08-21T22:37:17.819000+00:00",
            "ResourceStatus": "CREATE_IN_PROGRESS",
            "ResourceStatusReason": "User Initiated",
            "ClientRequestToken": "token"
        }
    ]
}
```

最新发生的事件先报告。下表列出了 **describe-stack-events** 命令返回的字段：


| 字段 | 说明 | 
| --- | --- | 
| EventId |  事件标识符。  | 
| StackName |  事件对应的堆栈名称。  | 
| StackId |  事件对应的堆栈标识符。  | 
| LogicalResourceId |  资源的逻辑标识符。  | 
| PhysicalResourceId |  资源的物理标识符。  | 
| ResourceProperties |  资源的属性。  | 
| ResourceType |  资源类型。  | 
| Timestamp |  事件发生的时间。  | 
| ResourceStatus |  资源的状态，可以是以下状态代码之一：`CREATE_COMPLETE` \$1 `CREATE_FAILED` \$1 `CREATE_IN_PROGRESS` \$1 `DELETE_COMPLETE` \$1 `DELETE_FAILED` \$1 `DELETE_IN_PROGRESS` \$1 `DELETE_SKIPPED` \$1 `IMPORT_COMPLETE` \$1 `IMPORT_IN_PROGRESS` \$1 `IMPORT_ROLLBACK_COMPLETE` \$1 `IMPORT_ROLLBACK_FAILED` \$1 `IMPORT_ROLLBACK_IN_PROGRESS` \$1 `REVIEW_IN_PROGRESS` \$1 `ROLLBACK_COMPLETE` \$1 `ROLLBACK_FAILED` \$1 `ROLLBACK_IN_PROGRESS` \$1 `UPDATE_COMPLETE` \$1 `UPDATE_COMPLETE_CLEANUP_IN_PROGRESS` \$1 `UPDATE_FAILED` \$1 `UPDATE_IN_PROGRESS` \$1 `UPDATE_ROLLBACK_COMPLETE` \$1 `UPDATE_ROLLBACK_COMPLETE_CLEANUP_IN_PROGRESS` \$1 `UPDATE_ROLLBACK_FAILED` \$1 `UPDATE_ROLLBACK_IN_PROGRESS` `DELETE_SKIPPED` 状态适用于带保留的删除策略属性的资源。  | 
| DetailedStatus |  堆栈的具体状态。如果 `CONFIGURATION_COMPLETE` 存在，则堆栈资源配置阶段已完成，资源的稳定化正在进行中。  | 
| ResourceStatusReason |  有关状态的更多信息。  | 

## 堆栈状态代码
<a name="cfn-console-view-stack-data-resources-status-codes"></a>

下表说明了堆栈状态代码：


| 堆栈状态和可选的详细状态 | 说明 | 
| --- | --- | 
|  `CREATE_COMPLETE`  |  成功创建一个或多个堆栈。  | 
|  `CREATE_IN_PROGRESS`  |  正在创建一个或多个堆栈。  | 
|  `CREATE_FAILED`  |  一个或多个堆栈创建失败。查看堆栈事件可了解所有相关错误消息。创建失败的可能原因包括：没有足够的权限使用堆栈中的所有资源，参数值被 AWS 服务拒绝，或者在资源创建期间超时。  | 
|  `DELETE_COMPLETE`  |  成功删除一个或多个堆栈。已删除的堆栈在 90 天内保留可供查看。  | 
|  `DELETE_FAILED`  |  一个或多个堆栈删除失败。由于删除失败，您可能有一些资源仍在运行，但是您无法使用或更新堆栈。再次删除堆栈或查看堆栈事件可了解所有相关错误消息。  | 
|  `DELETE_IN_PROGRESS`  |  正在删除一个或多个堆栈。  | 
| `REVIEW_IN_PROGRESS` | 正在创建一个或多个具有预期 StackId 但没有任何模板或资源的堆栈。 具有此状态代码的堆栈将针对[可能的最大堆栈数量](cloudformation-limits.md)进行计数。  | 
|  `ROLLBACK_COMPLETE`  |  在堆栈创建失败或明确取消堆栈创建后成功删除一个或多个堆栈。堆栈返回到之前的工作状态。在创建堆栈操作期间创建的所有资源都被删除。 此状态仅在堆栈创建失败后存在。它表示已适当清除未完全创建的堆栈中的所有操作。在此状态下，只能执行删除操作。  | 
|  `ROLLBACK_FAILED`  |  在堆栈创建失败或明确取消堆栈创建后删除一个或多个堆栈失败。删除堆栈或查看堆栈事件了解所有相关错误消息。  | 
|  `ROLLBACK_IN_PROGRESS`  |  在堆栈创建失败或明确取消堆栈创建后正在删除一个或多个堆栈。  | 
|  `UPDATE_COMPLETE`  | 成功更新一个或多个堆栈。 | 
|  `UPDATE_COMPLETE_CLEANUP_IN_PROGRESS`  |  成功更新一个或多个堆栈后正在删除堆栈的旧资源。对于需要替换资源的堆栈更新，CloudFormation 首先创建新资源，然后删除旧资源，以帮助减少堆栈中断。在这种状态下，堆栈已更新并且可用，但 CloudFormation 仍然会删除旧资源。  | 
|  `UPDATE_FAILED`  | 未成功更新一个或多个堆栈。查看堆栈事件可了解所有相关错误消息。 | 
|  `UPDATE_IN_PROGRESS`  |  正在更新一个或多个堆栈。  | 
|  `UPDATE_ROLLBACK_COMPLETE`  |  在堆栈更新失败后将一个或多个堆栈成功返回之前的工作状态。  | 
|  `UPDATE_ROLLBACK_COMPLETE_CLEANUP_IN_PROGRESS`  |  堆栈更新失败后正在删除一个或多个堆栈的新资源。在这种状态下，堆栈已回滚到之前的工作状态并且可用，但 CloudFormation 仍会删除它在堆栈更新期间创建的所有新资源。  | 
|  `UPDATE_ROLLBACK_FAILED`  |  在堆栈更新失败后将一个或多个堆栈返回之前的工作状态失败。在这种状态下，您可以删除堆栈或[继续回滚](using-cfn-updating-stacks-continueupdaterollback.md)。您可能需要修复错误，然后堆栈才能返回工作状态。您也可以联系 支持 将堆栈恢复到可用状态。  | 
|  `UPDATE_ROLLBACK_IN_PROGRESS`  |  堆栈更新失败后正在将一个或多个堆栈返回之前的工作状态。  | 
|  `IMPORT_IN_PROGRESS`  |  当前正在执行导入操作。  | 
|  `IMPORT_COMPLETE`  |  对于堆栈中支持 `resource import` 的所有资源，已成功完成导入操作。  | 
|  `IMPORT_ROLLBACK_IN_PROGRESS`  |  导入将回滚到以前的模板配置。  | 
|  `IMPORT_ROLLBACK_FAILED`  |  对于堆栈中的至少一个资源，导入回滚操作失败。将提供 CloudFormation 成功导入的资源的结果。  | 
|  `IMPORT_ROLLBACK_COMPLETE`  |  导入成功回滚到以前的模板配置。  | 

# 按操作查看堆栈事件
<a name="view-stack-events-by-operation"></a>

您可以查看按操作分组的堆栈事件，以更好地了解对您的堆栈所做更改的顺序和范围。基于操作的分组可帮助您一起跟踪相关事件，从而更轻松地监控进度并在问题发生时对其进行故障排查。

每个堆栈操作（创建、更新、删除、回滚）都会被分配一个唯一的操作 ID，用于对所有相关事件进行分组。这使您能够专注于特定的操作，并迅速找出故障的根本原因。

**Topics**
+ [先决条件](#view-stack-events-by-operation-prerequisites)
+ [按操作查看堆栈事件（控制台）](#view-stack-events-by-operation-console)
+ [按操作查看堆栈事件（AWS CLI）](#view-stack-events-by-operation-cli)
+ [堆栈状态代码](#stack-status-codes)

## 先决条件
<a name="view-stack-events-by-operation-prerequisites"></a>

要使用 `DescribeEvents` API，您必须具有必要 IAM 权限：`DescribeEvents`。

## 按操作查看堆栈事件（控制台）
<a name="view-stack-events-by-operation-console"></a>

**要查看按操作分组的堆栈事件**

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

1. 在屏幕顶部的导航栏中，选择您在其中创建了堆栈的 AWS 区域。

1. 在**堆栈**页面上，选择堆栈名称。CloudFormation 将显示选定堆栈的堆栈详细信息。

1. 选择**事件**选项卡以查看 CloudFormation 为堆栈生成的堆栈事件。

1. 事件会按照操作 ID 自动进行分组。每个操作都会以可展开的部分呈现，该部分会显示操作类型、状态以及时间戳。

1. 单击**操作 ID** 可打开详细视图，该视图仅显示与该特定操作相关的事件。

1. 在操作详细信息视图中，选中**仅显示故障**复选框，以仅显示用于根本原因分析的失败事件。

CloudFormation 每分钟自动刷新堆栈事件。新堆栈事件发生时显示**新堆栈事件可用**徽章。选择“刷新”图标可将这些事件加载到列表中。

通过查看按操作分组的堆栈事件，您可以了解每个操作的事件顺序，并快速确定哪个特定操作导致了问题（如果您正在调试堆栈）。

当您的堆栈操作正在运行时，其会被列出 `CREATE_IN_PROGRESS`、`UPDATE_IN_PROGRESS` 或 `DELETE_IN_PROGRESS` 状态。成功完成操作后，其状态将更改为 `CREATE_COMPLETE`、`UPDATE_COMPLETE` 或 `DELETE_COMPLETE`。

有关更多信息，请参阅[了解 CloudFormation 堆栈创建事件](stack-resource-configuration-complete.md)和[监控堆栈更新的进度](using-cfn-updating-stacks-monitor-stack.md)。

## 按操作查看堆栈事件（AWS CLI）
<a name="view-stack-events-by-operation-cli"></a>

您可以使用带有操作 ID 筛选功能的 `describe-events` 命令，以查看特定操作的事件。

### 获取上次操作 ID
<a name="get-last-operation-ids"></a>

通过 describe-stacks API 提供的堆栈描述现在包括显示最近的操作 ID 及其类型的 LastOperations 信息。这使得您能够迅速确定哪些操作已经完成以及它们的当前状态，而无需通过事件日志进行解析。

```
aws cloudformation describe-stacks --stack-name MyStack
```

以下是响应示例，显示最后一个操作是更新操作失败后的回滚。

```
{  
    "Stacks": [  
        {  
            "StackId": "arn:aws:cloudformation:us-east-1:123456789012:stack/MyStack/07580010-bb79-11f0-8f6c-0289bb5c804f",  
            "StackName": "MyStack",  
            "Description": "A simple CloudFormation template to create an S3 bucket.",  
            "CreationTime": "2025-11-07T01:28:13.778000+00:00",  
            "LastUpdatedTime": "2025-11-07T01:43:39.838000+00:00",  
            "RollbackConfiguration": {},  
            "StackStatus": "UPDATE_ROLLBACK_COMPLETE",  
            "DisableRollback": false,  
            "NotificationARNs": [],  
            "Tags": [],  
            "EnableTerminationProtection": false,  
            "DriftInformation": {  
                "StackDriftStatus": "NOT_CHECKED"  
            },  
            "LastOperations": [  
                {  
                    "OperationType": "ROLLBACK",  
                    "OperationId": "d0f12313-7bdb-414d-a879-828a99b36f29"  
                },  
                {  
                    "OperationType": "UPDATE_STACK",  
                    "OperationId": "1c211b5a-4538-4dc9-bfed-e07734371e57"  
                }  
            ]  
        }  
    ]  
}
```

### 按操作 ID 筛选事件
<a name="filter-events-by-operation-id"></a>

下面的 `describe-events` 命令描述了特定操作 ID 的事件：

```
aws cloudformation describe-events \
  --operation-id 1c211b5a-4538-4dc9-bfed-e07734371e57
```

要仅查看失败事件以进行故障排除，请使用 `--filter FailedEvents=true` 参数：

```
aws cloudformation describe-events \
  --operation-id 1c211b5a-4538-4dc9-bfed-e07734371e57 \
  --filter FailedEvents=true
```

新的操作 ID 筛选功能使您能够专注于特定操作及其相关事件。此功能特别适用于：
+ **对特定故障进行故障排除：**将事件与失败的操作隔离开来，以了解出了什么问题。
+ **监控长期运行的操作：**跟踪复杂的更新或大型堆栈部署的进度。
+ **审计更改：**审核与特定更新操作相关的所有事件。
+ **根本原因分析：**使用故障筛选器快速确定部署问题的根源。

## 堆栈状态代码
<a name="stack-status-codes"></a>

下表列出了 `describe-events` 命令在使用操作 ID 筛选时返回的字段：


| 字段 | 说明 | 
| --- | --- | 
| EventId | 事件标识符。 | 
| OperationId | 生成此事件的操作的唯一标识符。 | 
| StackName | 事件对应的堆栈名称。 | 
| StackId | 事件对应的堆栈标识符。 | 
| LogicalResourceId | 资源的逻辑标识符。 | 
| PhysicalResourceId | 资源的物理标识符。 | 
| ResourceProperties | 资源的属性。 | 
| ResourceType | 资源类型。 | 
| Timestamp | 事件发生的时间。 | 
| ResourceStatus | 资源的状态（CREATE\$1COMPLETE、UPDATE\$1FAILED 等）。 | 
| DetailedStatus | 堆栈的具体状态。如果 CONFIGURATION\$1COMPLETE 存在，则堆栈资源配置阶段已完成，资源的稳定化正在进行中。 | 
| ResourceStatusReason | 有关状态的更多信息。 | 

# 查看 CloudFormation 堆栈部署的时间线
<a name="stack-deployment-timeline-graph"></a>

堆栈部署时间线图以可视化形式表示堆栈部署时间线。该图显示堆栈及其各个资源的部署状态，以及每种状态的更改时间。堆栈部署状态用相应颜色表示。

**Topics**
+ [了解堆栈部署时间线图](#understanding-stack-deployment-timeline-graph)
+ [查看堆栈部署时间线图（控制台）](#viewing-stack-deployment-timeline-graph)

## 了解堆栈部署时间线图
<a name="understanding-stack-deployment-timeline-graph"></a>

下图显示由于 Amazon EC2 实例资源启动失败而未能进行堆栈部署的时间线图。

![\[堆栈部署失败的堆栈部署时间线图。\]](http://docs.aws.amazon.com/zh_cn/AWSCloudFormation/latest/UserGuide/images/deployment-timeline-graph.PNG)


堆栈资源的名称位于图中左侧，相对于部署时间的日期和时间位于图中顶部。

各个资源均以“**进行中**”的状态开头。每次成功部署后，状态栏都会更改为**完成**。资源部署失败时，状态栏更改为**失败**。当资源部署失败且堆栈部署也失败时，导致堆栈部署失败的资源将收到**可能为根失败**的状态。

堆栈部署操作失败后，成功部署的资源开始回滚并更改为**回滚中**的状态。资源完成回滚后，状态更改为**回滚完成**。

选中各个资源可以更精细地显示有关部署时间线的详细信息：

![\[堆栈部署时间线图弹出窗口，显示所选失败资源的部署详细信息。\]](http://docs.aws.amazon.com/zh_cn/AWSCloudFormation/latest/UserGuide/images/deployment-timeline-graph-root-cause.PNG)


选中资源会显示部署的**类型**、部署**开始时间**、部署**结束时间**和**总持续时间**。此外还可以在下面的下拉菜单中，找到每种部署状态的**开始时间**、**结束时间**和**持续时间**。如果资源部署失败，将提供**失败原因**。

有关堆栈状态的更多信息，请参阅[堆栈状态代码](view-stack-events.md#cfn-console-view-stack-data-resources-status-codes)。

## 查看堆栈部署时间线图（控制台）
<a name="viewing-stack-deployment-timeline-graph"></a>

查看堆栈部署时间线图：

1. 通过以下网址打开 CloudFormation 控制台：[https://console.aws.amazon.com/cloudformation](https://console.aws.amazon.com/cloudformation/)。

1. 在屏幕顶部的导航栏中，选择您在其中创建了堆栈的 AWS 区域。

1. 在 CloudFormation 控制台的**堆栈**页面中，选择堆栈名称。CloudFormation 将显示选定堆栈的堆栈详细信息。

1. 选择**事件**选项卡以查看 CloudFormation 为堆栈生成的堆栈事件。

1. 选择**时间线图**按钮查看堆栈的时间线图。

# 了解 CloudFormation 堆栈创建事件
<a name="stack-resource-configuration-complete"></a>

在堆栈部署期间，将会发生多个事件来创建、配置和验证堆栈模板中定义的资源。了解这些事件有助您优化堆栈创建过程并简化部署。
+ **资源创建事件** – 当每个资源的创建过程启动时，都会设置一个 `CREATE_IN_PROGRESS` 事件的**状态**。该事件指示正在预置该资源。
+ **最终一致性检查** – 在堆栈创建过程中，很大一部分时间都用于对堆栈所创建资源执行最终一致性检查。在此阶段，服务会执行内部一致性检查，以确保资源完全正常运行并符合各项 AWS 服务所定义的服务稳定性标准。
+ **配置完成事件** – 当每个资源完成预置的最终一致性检查阶段后，将会设置 `CONFIGURATION_COMPLETE` 事件的**详细状态**。
+ **资源创建完成事件** – 按规定创建和配置好资源，并且配置与模板中指定的内容一致后，将会设置 `CREATE_COMPLETE` 事件的**状态**。

在不需要资源最终一致性检查的情况下，例如验证预生产堆栈配置或跨堆栈预调配，您可以利用 `CONFIGURATION_COMPLETE` 事件来简化堆栈创建过程。您可以通过多种方式来使用此事件。例如，您可以将其用作视觉信号，以跳过等待资源的过程或堆栈一致性检查完成的过程。或者，您可以使用持续集成和持续交付（CI/CD）来创建自动机制，以触发其他操作。

**重要**  
虽然利用 `CONFIGURATION_COMPLETE` 事件可以加快堆栈创建时间，但您也应该注意其利弊。首先，只有支持偏差检测的少部分资源类型才支持该功能。有关支持偏差检测的资源类型的列表，请参阅 [资源类型支持](resource-import-supported-resources.md)。这种方法可能不适用于所有场景，尤其是资源需要彻底的最终一致性检查以确保整个云环境（例如，在生产环境）完全准备就绪的情况。建议您仔细评测您的部署要求，以及每种资源的一致性检查的重要程度。利用 `CONFIGURATION_COMPLETE` 事件来优化部署速度，同时不影响基础设施的完整性和可靠性。  
由于不能保证会设置 `CONFIGURATION_COMPLETE` 事件，因此任何使用该事件的场景都应准备好在未设置任何 `CONFIGURATION_COMPLETE` 事件时处理 `CREATE_COMPLETE` 事件。

![\[该图显示了堆栈中资源创建事件和最终一致性检查事件的顺序。\]](http://docs.aws.amazon.com/zh_cn/AWSCloudFormation/latest/UserGuide/images/configuration-complete.png)


堆栈部署开始时，`AWS::ECR::Repository` 和 `AWS::ECS::Cluster` 资源都会启动创建过程（`ResourceStatus` = `CREATE_IN_PROGRESS`）。当 `AWS::ECR::Repository` 资源类型开始最终一致性检查（`DetailedStatus` = `CONFIGURATION_COMPLETE`）后，`AWS::ECS::TaskDefinition` 资源就可以开始创建过程了。同样，一旦 `AWS::ECS::TaskDefinition` 资源开始最终一致性检查，`AWS::ECS::Service` 资源就会开始创建过程。

**`CREATE_IN_PROGRESS` 和 `CREATE_COMPLETE` 事件**
+ **[堆栈]：**`CREATE_IN_PROGRESS`
+ **[资源]：**ECR 存储库`CREATE_IN_PROGRESS`
+ **[资源]：**ECS 集群`CREATE_IN_PROGRESS`
+ **[资源]：**ECR 存储库 `CREATE_IN_PROGRESS`、`CONFIGURATION_COMPLETE`
+ **[资源]：**ECS 任务定义 `CREATE_IN_PROGRESS`
+ **[资源]：**ECS 集群 `CREATE_IN_PROGRESS`、`CONFIGURATION_COMPLETE`
+ **[资源]：**ECS 任务定义 `CREATE_IN_PROGRESS`、`CONFIGURATION_COMPLETE`
+ **[资源]：**ECS 服务 `CREATE_IN_PROGRESS`
+ **[资源]：**ECR 存储库`CREATE_COMPLETE`
+ **[资源]：**ECS 集群`CREATE_COMPLETE`
+ **[资源]：**ECS 服务 `CREATE_IN_PROGRESS`、`CONFIGURATION_COMPLETE`
+ **[堆栈]：**`CREATE_IN_PROGRESS`、`CONFIGURATION_COMPLETE`
+ **[资源]：**ECS 任务定义 `CREATE_COMPLETE`
+ **[资源]：**ECS 服务 `CREATE_COMPLETE`
+ **[堆栈]：**`CREATE_COMPLETE`

# 监控堆栈更新的进度
<a name="using-cfn-updating-stacks-monitor-stack"></a>

您可以通过查看堆栈事件来监控堆栈更新进度。堆栈的**事件**选项卡会显示堆栈创建和更新过程中的每个重要步骤（按照每个事件的时间排序排列，最新的事件显示在最上方）。有关更多信息，请参阅 [监控堆栈进度](monitor-stack-progress.md)。

**Topics**
+ [成功更新堆栈期间生成的事件](#using-cfn-updating-stacks-monitor-stack-update-events)
+ [资源更新失败时生成的事件](#using-cfn-updating-stacks-monitor-stack-update-failure)

## 成功更新堆栈期间生成的事件
<a name="using-cfn-updating-stacks-monitor-stack-update-events"></a>

堆栈更新过程开始时会为堆栈标记一个 `UPDATE_IN_PROGRESS` 事件：

```
2011-09-30 09:35 PDT AWS::CloudFormation::Stack MyStack UPDATE_IN_PROGRESS 
```

接下来显示的事件标明更新模板中已发生更改的各个资源的更新开始和完成。例如，更新名为 `MyDB` 的 [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-rds-dbinstance.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-rds-dbinstance.html) 资源将产生以下条目：

```
2011-09-30 09:35 PDT AWS::RDS::DBInstance MyDB UPDATE_COMPLETE
2011-09-30 09:35 PDT AWS::RDS::DBInstance MyDB UPDATE_IN_PROGRESS
```

当 CloudFormation 报告已开始更新资源时，将会记录一个 `UPDATE_IN_PROGRESS` 事件。在资源创建成功时，将记录 `UPDATE_COMPLETE` 事件。

CloudFormation 成功更新堆栈时，您会看到以下事件：

```
2011-09-30 09:35 PDT AWS::CloudFormation::Stack MyStack UPDATE_COMPLETE 
```

**重要**  
在堆栈更新操作期间，如果 CloudFormation 需要替换现有资源，它会首先创建一个新资源，然后删除旧资源。但是，在某些情况下，CloudFormation 可能无法删除旧资源（例如，当用户不具有删除给定类型的资源的权限时）。  
CloudFormation 会尝试删除旧资源三次。如果 CloudFormation 无法删除旧资源，其会将旧资源从堆栈中移除并继续更新堆栈。堆栈更新完成后，CloudFormation 会发出 `UPDATE_COMPLETE` 堆栈事件，但同时会包含一个 `StatusReason`，以说明无法删除一个或多个资源。CloudFormation 还会针对特定资源发布一个 `DELETE_FAILED` 事件，以及相应的 `StatusReason`，以详细说明 CloudFormation 未能删除资源的原因。  
旧资源仍然存在并会继续产生费用，但无法再通过 CloudFormation 进行访问。要删除旧资源，请使用基础服务的控制台或 API 直接访问旧资源。  
对于已从堆栈模板中移除的资源也是如此，因此将在堆栈更新期间从堆栈中将它们删除。

## 资源更新失败时生成的事件
<a name="using-cfn-updating-stacks-monitor-stack-update-failure"></a>

如果资源更新失败，CloudFormation 将报告一个包含失败原因的 `UPDATE_FAILED` 事件。例如，假设您的更新模板指定了资源不支持的属性更改，如缩减 [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-rds-dbinstance.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-rds-dbinstance.html) 资源的 `AllocatedStorage` 大小，则将看到与以下类似的事件：

```
2011-09-30 09:36 PDT AWS::RDS::DBInstance MyDB UPDATE_FAILED Size cannot be less than current size; requested: 5; current: 10
2011-09-30 09:35 PDT AWS::RDS::DBInstance MyDB UPDATE_IN_PROGRESS
```

如果资源更新失败，CloudFormation 会将升级期间更新的所有资源回滚到更新前的配置。下面列出了您将在更新回滚期间看到的事件示例：

```
2011-09-30 09:38 PDT AWS::CloudFormation::Stack MyStack UPDATE_ROLLBACK_COMPLETE
2011-09-30 09:38 PDT AWS::RDS::DBInstance MyDB UPDATE_COMPLETE
2011-09-30 09:37 PDT AWS::RDS::DBInstance MyDB UPDATE_IN_PROGRESS
2011-09-30 09:37 PDT AWS::CloudFormation::Stack MyStack UPDATE_ROLLBACK_IN_PROGRESS The following resource(s) failed to update: [MyDB]
```

# 继续回滚更新
<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)。

# 确定堆栈失败的原因
<a name="determine-root-cause-for-stack-failures"></a>

如果堆栈创建失败，CloudFormation 可帮助您确定可能是堆栈失败根本原因的事件。根据场景和您的权限，如果**事件**中提供的**状态原因**不明确，AWS CloudTrail 事件可以提供有关根本原因的更多详细信息。

**确定堆栈失败的根本原因**

1. 通过以下网址打开 CloudFormation 控制台：[https://console.aws.amazon.com/cloudformation](https://console.aws.amazon.com/cloudformation/)。

1. 在**堆栈**页面上，选择失败的堆栈。

1. 选择**事件**选项卡。

1. 选择**检测根本原因**。CloudFormation 会分析失败，并通过向特定事件**状态**添加**可能的根本原因**标签，指出可能是失败原因的事件。有关 CloudFormation 控制台中状态的进一步说明，请参阅**状态原因**。

1. 选择标签为**可能的根本原因**的失败**状态**，了解有关失败原因的更多信息。视场景和您的权限而定，您可以查看详细的 CloudTrail 事件。选择**状态**可能会产生以下结果
   + 提供与此问题相关的、并且可能有助于解决问题的 CloudTrail 事件。查看 CloudTrail 事件。
   + 找不到与此问题相关的任何有助于解决问题的 CloudTrail 事件。
   + 当前权限不允许您查看 CloudTrail 事件。了解更多。
   + 正在检查可用的 CloudTrail 事件，请在几分钟后再次检查。
   + 获取 CloudTrail 事件时发生错误。如需执行手动检查，请访问 CloudTrail 控制台。

1. 如果**状态原因**中提供的原因不明确，并且根本原因显示指向 CloudTrail 控制台的链接，请打开该链接查看事件，以查找关于根本原因的详细信息。

有关 CloudTrail 事件的更多信息，请参阅 [Understanding CloudTrail events](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/cloudtrail-events.html) 和 [CloudTrail record contents](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/cloudtrail-event-reference-record-contents.html)。

有关 CloudTrail 事件历史记录的更多信息，请参阅 [Working with CloudTrail Event history](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/view-cloudtrail-events.html)。

**注意**  
嵌套堆栈不支持**检测根本原因**。

# 选择预置资源时如何处理失败
<a name="stack-failure-options"></a>

如果堆栈操作失败，您无需每次都回滚已成功预置的资源并从头开始。相反，您可以对处于 `CREATE_FAILED` 或 `UPDATE_FAILED` 状态的资源进行问题排查，然后出现问题的位置恢复预置。

要执行操作，必须启用“保留已成功预置的资源”选项。此选项适用于所有堆栈部署和更改集操作。
+ 对于堆栈创建，如果您选择**保留已成功预置的资源**选项，CloudFormation 将保留已成功创建的资源的状态，并将失败的资源保持在失败状态，直到执行下一次更新操作为止。
+ 在更新和更改集操作过程中，选择**保留已成功预置的资源**将保留已成功资源的状态，同时将失败的资源回滚到上一个已知的稳定状态。失败的资源将处于 `UPDATE_FAILED` 状态。没有上一个已知稳定状态的资源将在下一次堆栈操作时删除。

**Topics**
+ [堆栈故障选项概述](#stack-failure-options-overview)
+ [暂停堆栈回滚的必需条件](#stack-failure-options-conditions)
+ [保留成功预置的资源（控制台）](#stack-failure-options-console)
+ [保留成功预置的资源（AWS CLI）](#stack-failure-options-cli)

## 堆栈故障选项概述
<a name="stack-failure-options-overview"></a>

在从 CloudFormation 控制台、API 或 AWS CLI 发出操作之前，请指定预置资源失败时的行为。然后，继续进行资源的部署过程，无需进行任何其他修改。如果发生操作故障，CloudFormation 会在每条独立预置路径中的第一个故障处停止。CloudFormation 识别资源之间的依赖关系以并行处理独立的预置操作。然后继续在每条独立的预置路径上预置资源，直到遇到故障。一条路径中的故障不会影响其他预置路径。CloudFormation 将继续预置资源，直到完成或因其他故障而停止。

修复任何问题以继续部署过程。CloudFormation 在对之前无法成功预置的资源重试预置操作之前执行必要的更新。您可以通过提交 **Retry**（重试）、**Update**（更新）或 **Roll back**（回滚）操作来修复问题。例如，如果您预置 Amazon EC2 实例并且 EC2 实例在创建操作期间失败，您可能想要调查错误，而不是立即回滚失败的资源。您可以查看系统状态检查和实例状态检查，然后在问题解决后选择 **Retry**（重试）操作。

如果堆栈操作失败，并且您已从 **Stack failure options**（堆栈故障选项）菜单中指定 **Preserve successfully provisioned resources**（保留成功预置的资源），您可以选择以下选项。
+ **Retry**（重试）- 重试失败资源的预置操作并继续预置模板，直到堆栈操作成功完成或下一次失败。如果资源由于不需要修改模板的问题（例如 AWS Identity and Access Management（IAM）权限）而无法预置，请选择此选项。
+ **Update**（更新）- 已预置的资源在模板更新时进行更新。将重试未能创建或更新的资源。如果由于模板错误而无法预置资源，并且您已修改模板，请选择此选项。更新处于 `FAILED` 状态的堆栈时，必须为 **Stack failure options**（堆栈故障选项）选择 **Preserve successfully provisioned resources**（保留成功预置的资源）才能继续更新您的堆栈。
+ **Roll back**（回滚）- CloudFormation 将堆栈回滚到上一个已知的稳定状态。

## 暂停堆栈回滚的必需条件
<a name="stack-failure-options-conditions"></a>

要阻止 CloudFormation 自动回滚和删除已成功创建的资源，必须满足以下条件。

1. 创建或更新堆栈时，必须选择**保留已成功预置的资源**选项。该选项会告诉 CloudFormation 不要删除已成功创建的资源，即使整个堆栈操作失败。

1. 堆栈操作必须已经失败，这意味着堆栈状态为 `CREATE_FAILED` 或 `UPDATE_FAILED`。

**注意**  
不支持不可变的更新类型。

## 保留成功预置的资源（控制台）
<a name="stack-failure-options-console"></a>

------
#### [ Create stack ]

**在创建堆栈操作期间保留成功预置的资源**

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

1. 在**堆栈**页面，选择右上角的**创建堆栈**，然后选择**使用新资源（标准）**。

1. 在**先决条件 – 准备模板**中，选择**选择现有模板**。

1. 在 **Specify template (指定模板)** 下，选择指定包含堆栈模板的 S3 存储桶的 URL，或者上传堆栈模板文件。然后选择**下一步**。

1. 在 **Specify stack details**（指定堆栈详细信息）页面上，在 **Stack name**（堆栈名称）框中输入堆栈名称。

1. 在 **Parameters**（参数）部分中，指定在堆栈模板中定义的参数。

   您可使用或更改带默认值的任何参数。

1. 如果对参数值满意，选择 **Next**（下一步）。

1. 在 **Configure stack options**（配置堆栈选项）页面上，可以设置堆栈的其他选项。

1. 对于 **Stack failure options**（堆栈故障选项），选择 **Preserve successfully provisioned resources**（保留成功预置的资源）。

1. 如果对堆栈选项满意，选择 **Next**（下一步）。

1. 在 **Review**（审核）页面上查看堆栈，然后选择 **Create stack**（创建堆栈）。

*结果*：创建失败的资源将堆栈状态转换为 `CREATE_FAILED`，以防止堆栈操作遇到故障时堆栈回滚。成功预置的资源处于 `CREATE_COMPLETE` 状态。您可在 **Stack events**（堆栈事件）选项卡中监控堆栈。

------
#### [ Update stack ]

**在更新堆栈操作期间保留成功预置的资源**

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

1. 选择要更新的堆栈，然后选择 **Update**（更新）。

1. 在 **Update stack**（更新堆栈）页面上，使用以下选项之一选择堆栈模板：
   + **使用现有模板**
   + **替换当前模板**
   + **在基础设施编辑器中编辑模板**

   接受您的设置并选择 **Next**（下一步）。

1. 在 **Specify stack details**（指定堆栈详细信息）页面上，指定在堆栈模板中定义的参数。

   您可使用或更改带默认值的任何参数。

1. 如果对参数值满意，选择 **Next**（下一步）。

1. 在 **Configure stack options**（配置堆栈选项）页面上，可以设置堆栈的其他选项。

1. 对于 **Behavior on provisioning failure**（预置失败时的行为），选择 **Preserve successfully provisioned resources**（保留成功预置的资源）。

1. 如果对堆栈选项满意，选择 **Next**（下一步）。

1. 在 **Review**（查看）页面上查看堆栈，然后选择 **Update stack**（更新堆栈）。

*结果*：更新失败的资源将堆栈状态转换为 `UPDATE_FAILED`，并回滚到上一个已知的稳定状态。没有上一个已知稳定状态的资源将在下一次堆栈操作时被 CloudFormation 删除。成功预置的资源处于 `CREATE_COMPLETE` 或 `UPDATE_COMPLETE` 状态。您可在 **Stack events**（堆栈事件）选项卡中监控堆栈。

------
#### [ Change set ]

**注意**  
您可以为状态为 `CREATE_FAILED` 或 `UPDATE_FAILED` 的堆栈启动更改集，但不能为状态为 `UPDATE_ROLLBACK_FAILED` 的堆栈启动更改集。

**在更改集操作期间保留成功预置的资源**

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

1. 选择包含要启动的更改集的堆栈，然后选择 **Change sets**（更改集）选项卡。

1. 选择更改集，然后选择 **Execute**（执行）。

1. 对于 **Execute change set**（执行更改集），选择 **Preserve successfully provisioned resources**（保留成功预置的资源）选项。

1. 选择 **Execute change set**（执行更改集）。

*结果*：更新失败的资源将堆栈状态转换为 `UPDATE_FAILED`，并回滚到上一个已知的稳定状态。没有上一个已知稳定状态的资源将在下一次堆栈操作时被 CloudFormation 删除。成功预置的资源处于 `CREATE_COMPLETE` 或 `UPDATE_COMPLETE` 状态。您可在 **Stack events**（堆栈事件）选项卡中监控堆栈。

------

## 保留成功预置的资源（AWS CLI）
<a name="stack-failure-options-cli"></a>

------
#### [ Create stack ]

**在堆栈创建操作期间保留成功预置的资源**

在 [create-stack](https://docs.aws.amazon.com/cli/latest/reference/cloudformation/create-stack.html) 操作期间指定 `--disable-rollback` 选项或 `on-failure DO_NOTHING` 枚举。

1. 为 **create-stack** 命令提供堆栈名称和模板并采用 `--disable-rollback` 选项。

   ```
   aws cloudformation create-stack --stack-name myteststack \
       --template-body file://template.yaml \
       --disable-rollback
   ```

   该命令将返回以下输出。

   ```
   {
       "StackId": "arn:aws:cloudformation:us-east-1:123456789012:stack/myteststack/466df9e0-0dff-08e3-8e2f-5088487c4896"
   }
   ```

1. 使用 **describe-stacks** 命令描述堆栈状态。

   ```
   aws cloudformation describe-stacks --stack-name myteststack
   ```

   该命令将返回以下输出。

   ```
   {
       "Stacks":  [
           {
               "StackId": "arn:aws:cloudformation:us-east-1:123456789012:stack/myteststack/466df9e0-0dff-08e3-8e2f-5088487c4896",
               "Description": "AWS CloudFormation Sample Template",
               "Tags": [],
               "Outputs": [],
               "StackStatusReason": “The following resource(s) failed to create: [MyBucket]”,
               "CreationTime": "2013-08-23T01:02:15.422Z",
               "Capabilities": [],
               "StackName": "myteststack",
               "StackStatus": "CREATE_FAILED",
               "DisableRollback": true
           }
       ]
   }
   ```

------
#### [ Update stack ]

**在堆栈更新操作期间保留成功预置的资源**

1. 为 **update-stack** 命令提供现有堆栈名称和模板并采用 `--disable-rollback` 选项。

   ```
   aws cloudformation update-stack --stack-name myteststack \
       --template-url https://s3.amazonaws.com/amzn-s3-demo-bucket/updated.template --disable-rollback
   ```

   该命令将返回以下输出。

   ```
   {
       "StackId": "arn:aws:cloudformation:us-east-1:123456789012:stack/myteststack/466df9e0-0dff-08e3-8e2f-5088487c4896"
   }
   ```

1. 使用 **describe-stacks** 或 **describe-stack-events** 命令描述堆栈状态。

   ```
   aws cloudformation describe-stacks --stack-name myteststack
   ```

   该命令将返回以下输出。

   ```
   {
       "Stacks":  [
           {
               "StackId": "arn:aws:cloudformation:us-east-1:123456789012:stack/myteststack/466df9e0-0dff-08e3-8e2f-5088487c4896",
               "Description": "AWS CloudFormation Sample Template",
               "Tags": [],
               "Outputs": [],
               "CreationTime": "2013-08-23T01:02:15.422Z",
               "Capabilities": [],
               "StackName": "myteststack",
               "StackStatus": "UPDATE_COMPLETE",
               "DisableRollback": true
           }
       ]
   }
   ```

------
#### [ Change set ]

**注意**  
您可以为状态为 `CREATE_FAILED` 或 `UPDATE_FAILED` 的堆栈启动更改集，但不能为状态为 `UPDATE_ROLLBACK_FAILED` 的堆栈启动更改集。

**在更改集操作期间保留成功预置的资源**

在 [execute-change-set](https://docs.aws.amazon.com/cli/latest/reference/cloudformation/execute-change-set.html) 操作期间指定 `--disable-rollback` 选项。

1. 为 **execute-change-set** 命令提供堆栈名称和模板并采用 `--disable-rollback` 选项。

   ```
   aws cloudformation execute-change-set --stack-name myteststack \
       --change-set-name my-change-set --template-body file://template.yaml
   ```

   该命令将返回以下输出。

   ```
   {
    "Id": "arn:aws:cloudformation:us-east-1:123456789012:changeSet/my-change-set/bc9555ba-a949-xmpl-bfb8-f41d04ec5784",
    "StackId": "arn:aws:cloudformation:us-east-1:123456789012:stack/myteststack/466df9e0-0dff-08e3-8e2f-5088487c4896"
   }
   ```

1. 启动更改集并采用 `--disable-rollback` 选项。

   ```
   aws cloudformation execute-change-set --stack-name myteststack \
       --change-set-name my-change-set -–disable-rollback
   ```

1. 使用 **describe-stacks** 或 **describe-stack-events** 命令确定堆栈状态。

   ```
   aws cloudformation describe-stack-events --stack-name myteststack
   ```

   该命令将返回以下输出。

   ```
   {
      "StackEvents": [
        {
           "StackId": "arn:aws:cloudformation:us-east-1:123456789012:stack/myteststack/466df9e0-0dff-08e3-8e2f-5088487c4896",
           "EventId": "49c966a0-7b74-11ea-8071-024244bb0672",
           "StackName": "myteststack",
           "LogicalResourceId": " MyBucket",
           "PhysicalResourceId": "myteststack-MyBucket-abcdefghijk1",
           "ResourceType": "AWS::S3::Bucket",
           "Timestamp": "2020-04-10T21:43:17.015Z",
           "ResourceStatus": "UPDATE_FAILED"
           "ResourceStatusReason": "User XYZ is not allowed to perform S3::UpdateBucket on MyBucket"
        }
   }
   ```

1. 修复权限错误并重试该操作。

   ```
   aws cloudformation update-stack --stack-name myteststack \
       --use-previous-template --disable-rollback
   ```

   该命令将返回以下输出。

   ```
   {
       "StackId": "arn:aws:cloudformation:us-east-1:123456789012:stack/myteststack/466df9e0-0dff-08e3-8e2f-5088487c4896"
   }
   ```

1. 使用 **describe-stacks** 或 **describe-stack-events** 命令描述堆栈状态。

   ```
   aws cloudformation describe-stacks --stack-name myteststack
   ```

   该命令将返回以下输出。

   ```
   {
       "Stacks":  [
           {
               "StackId": "arn:aws:cloudformation:us-east-1:123456789012:stack/myteststack/466df9e0-0dff-08e3-8e2f-5088487c4896",
               "Description": "AWS CloudFormation Sample Template",
               "Tags": [],
               "Outputs": [],
               "CreationTime": "2013-08-23T01:02:15.422Z",
               "Capabilities": [],
               "StackName": "myteststack",
               "StackStatus": "UPDATE_COMPLETE",
               "DisableRollback": true
           }
       ]
   }
   ```

------

### 回滚堆栈
<a name="roll-back-stack-cli"></a>

您可以使用 [rolback-stack](https://docs.aws.amazon.com/cli/latest/reference/cloudformation/rollback-stack.html) 命令将堆栈状态为 `CREATE_FAILED` 或 `UPDATE_FAILED` 的堆栈回滚到上一个稳定状态。

以下 **rollback-stack** 命令将会回滚指定的堆栈。

```
aws cloudformation rollback-stack --stack-name myteststack
```

该命令将返回以下输出。

```
{
    "StackId": "arn:aws:cloudformation:us-east-1:123456789012:stack/myteststack/466df9e0-0dff-08e3-8e2f-5088487c4896"
}
```

**注意**  
如果堆栈不包含上一个已知的稳定状态，则 **rollback-stack** 操作将删除该堆栈。