

# 使用 Express Mode 更快地部署 Amazon CloudFormation 堆栈
<a name="cloudformation-express-mode"></a>

借助 CloudFormation Express Mode，您可以在 CloudFormation 应用资源配置后立即完成堆栈操作，无需等待资源完全稳定。在迭代开发工作流程中，使用 Express Mode 可以更快地创建、更新和删除堆栈。

Express Mode 适用于所有现有的 CloudFormation 模板。您无需进行任何模板更改即可使用 Express Mode。

**Topics**
+ [何时使用 Express Mode](#express-mode-when-to-use)
+ [Express Mode 的工作原理](#express-mode-how-it-works)
+ [CloudFormation 在 Express Mode下如何处理依赖关系](#express-mode-dependencies)
+ [Express Mode 入门](#express-mode-getting-started)
+ [Express Mode 下的回滚行为](#express-mode-rollback)
+ [Express Mode 和嵌套堆栈](#express-mode-nested-stacks)
+ [资源就绪性注意事项](#express-mode-resource-readiness)
+ [不支持的功能和限制](#express-mode-unsupported)
+ [与 Amazon CDK 热交换部署的对比](#express-mode-comparison-cdk-hotswap)
+ [相关资源](#express-mode-related-resources)

## 何时使用 Express Mode
<a name="express-mode-when-to-use"></a>

在开发和迭代工作流程中，当速度比等待资源完全稳定更为重要时，可使用 Express Mode。在以下情况下，可使用 Express Mode：
+ 在开发过程中，您需要对模板更改进行迭代。
+ 您希望更快地获得有关资源配置是否有效的反馈。
+ 在继续操作之前，您无需等待资源完全投入运行。

对于生产环境部署，若您需要在确认资源已完全稳定并正常运行后才将部署视为完成，可使用默认部署模式。

## Express Mode 的工作原理
<a name="express-mode-how-it-works"></a>

在默认部署模式下，CloudFormation 会等待每个资源达到完全稳定的状态，然后再将该资源报告为“已完成”。例如，在创建 Amazon EC2 实例时，CloudFormation 会等待该实例进入 `running` 状态。

在 Express Mode 下，CloudFormation 通常会在用于创建、更新或删除资源的 API 调用成功后，立即将该资源操作视为已完成。在大多数情况下，CloudFormation 不会等待资源达到最终运行状态。

这意味着在 Express Mode 下的堆栈操作完成后：
+ 资源可能仍在初始化或传播更改。
+ 资源可能尚未准备好处理流量或接受连接。
+ 删除操作可能仍在进行中。

## CloudFormation 在 Express Mode下如何处理依赖关系
<a name="express-mode-dependencies"></a>

Express Mode 会遵循模板中定义的资源依赖关系。如果某个资源引用了另一个资源的 ID 或属性（通过 `Ref` 或 `Fn::GetAtt`），CloudFormation 会在启动被引用资源之前，确认该资源的配置已应用完毕。如果某个依赖资源因被引用的资源尚未就绪而遇到临时故障，CloudFormation 会重试该操作。

彼此之间没有依赖关系的资源可以并行执行。

Express Mode 不会改变资源的依赖顺序。该顺序会在堆栈操作报告“完成”时发生变化。

## Express Mode 入门
<a name="express-mode-getting-started"></a>

您可以将 Express Mode 与 Amazon Command Line Interface (Amazon CLI)、Amazon Cloud Development Kit (Amazon CDK) (Amazon CDK)、CloudFormation 控制台和更改集一起使用。以下各节介绍了如何通过每种方法启用 Express Mode。

### 将 Express Mode 与 Amazon CLI 结合使用
<a name="express-mode-cli"></a>

要在将 Express Mode 与 Amazon CLI 结合使用，请将 `--deployment-config` 参数添加到您的堆栈操作命令中。

**使用 Express Mode 来创建堆栈**  
以下命令使用 Express Mode 来创建堆栈：

```
aws cloudformation create-stack --stack-name {{my-stack}} \
    --template-body {{file://my-template.yaml}} \
    --deployment-config '{"mode": "EXPRESS"}'
```

**使用 Express Mode 来更新堆栈**  
以下命令使用 Express Mode 来更新堆栈：

```
aws cloudformation update-stack --stack-name {{my-stack}} \
    --template-body {{file://my-template.yaml}} \
    --deployment-config '{"mode": "EXPRESS"}'
```

**使用 Express Mode 来删除堆栈**  
以下命令使用 Express Mode 来删除堆栈：

```
aws cloudformation delete-stack --stack-name {{my-stack}} \
    --deployment-config '{"mode": "EXPRESS"}'
```

### 将 Express Mode 与 Amazon CDK 结合使用
<a name="express-mode-cdk"></a>

要将 Express Mode 与 Amazon Cloud Development Kit (Amazon CDK) (Amazon CDK) 结合使用，请在 `cdk deploy` 命令中使用 `--express` 标志：

```
cdk deploy --express
```

### 将 Express Mode 与 Amazon SAM 结合使用
<a name="express-mode-sam"></a>

要将 Express Mode 与 Amazon SAM CLI 结合使用，请在您的部署或同步命令中添加 `--express` 标志：

```
sam deploy --express
```

```
sam sync --express
```

要在项目配置中保留该设置，请使用 `--save-params`：

```
sam deploy --express --save-params
```

这会将 `express = true` 保存到您的 `samconfig.toml` 文件中，以便后续部署时自动使用 Express Mode。

启用 Express Mode 后，Amazon SAM CLI 会将部署配置传递给 CloudFormation。`--disable-rollback` 标志控制部署配置中的回滚行为。

### 将 Express Mode 与控制台结合使用
<a name="express-mode-console"></a>

在 CloudFormation 控制台中创建或更新堆栈时，您可以在**配置堆栈选项**步骤中启用 Express Mode。在**“部署选项”**下，将部署模式选为**“Express”**。

### 将 Express Mode 与更改集结合使用
<a name="express-mode-change-sets"></a>

您可以在创建更改集时指定部署配置，从而将 Express Mode 与更改集结合使用：

```
aws cloudformation create-change-set --stack-name {{my-stack}} \
    --change-set-name {{my-change-set}} \
    --template-body {{file://my-template.yaml}} \
    --deployment-config '{"mode": "EXPRESS"}'
```

当您执行更改集时，CloudFormation 会应用在创建更改集时指定的 Express Mode 部署配置。

## Express Mode 下的回滚行为
<a name="express-mode-rollback"></a>

当您使用 Express Mode 时，CloudFormation 会默认禁用回滚功能。如果资源操作失败，CloudFormation 不会自动回滚所做的更改。

要在使用 Express Mode 时重新启用回滚，请在 `--deployment-config` 参数中将 `disableRollback` 设置为 `false`：

```
aws cloudformation create-stack --stack-name {{my-stack}} \
    --template-body {{file://my-template.yaml}} \
    --deployment-config '{"mode": "EXPRESS", "disableRollback": false}'
```

## Express Mode 和嵌套堆栈
<a name="express-mode-nested-stacks"></a>

当您在父堆栈上使用“Express Mode”时，该设置会传播到层次结构中的所有嵌套堆栈。您不需要为每个嵌套堆栈分别指定 Express Mode。根堆栈及其嵌套堆栈中的所有资源，一旦其配置被应用，便立即完成。

## 资源就绪性注意事项
<a name="express-mode-resource-readiness"></a>

Express Mode 会在资源达到完全稳定状态之前就完成资源操作，因此任何资源都可能需要额外的时间才能完全准备好处理流量或完成跨区域传播。下表通过不同资源类型的示例，说明了您可以预期的资源行为类型。这些示例仅供说明，并不代表所支持资源的完整列表。


| 资源类型 | 操作 | 就绪行为 | 
| --- | --- | --- | 
| Amazon CloudFront 分配 | 创建/更新 | 配置被应用后，分发可能需要几分钟才能在全球范围内部署完成。 | 
| Amazon EC2 实例 | 创建 | 堆栈操作完成后，实例可能仍在初始化中（运行用户数据脚本、状态检查）。 | 
| Amazon Lambda 函数 | 删除 | 删除操作报告“完成”后，函数资源可能仍在进行清理。 | 
| Amazon Elastic Container Service (Amazon ECS) 服务 | 创建/更新 | 在堆栈操作完成后，服务任务可能仍在启动中，或正进入稳定状态。 | 

## 不支持的功能和限制
<a name="express-mode-unsupported"></a>

以下功能和服务在 Express Mode 下不受支持：

CloudFormation StackSets  
CloudFormation 不支持将 Express Mode 与 StackSets 操作结合使用。

以下资源在 Express Mode 下具有特定的行为：

自定义资源  
自定义资源（包括 `AWS::CloudFormation::CustomResource` 和 `Custom::*` 资源）遵循其默认行为。即使在 Express Mode 下，CloudFormation 也会等待自定义资源发送响应信号，才会将该操作视为“完成”。要防止运行缓慢或卡住的自定义资源延迟快速迭代的工作流，请使用 `ServiceTimeout` 属性来设置最大等待时间。有关更多信息，请参阅 [响应超时](template-custom-resources.md#response-timeout)。

## 与 Amazon CDK 热交换部署的对比
<a name="express-mode-comparison-cdk-hotswap"></a>

下表将 Express Mode 与 Amazon CDK 热交换部署进行对比。


| 功能 | Express Mode | Amazon CDK 热交换 | 
| --- | --- | --- | 
| 部署机制 | 所有资源操作均使用 CloudFormation | 绕过 CloudFormation 并直接调用服务 API | 
| 模板兼容性 | 适用于所有现有的 CloudFormation 模板 | 支持有限的资源类型 | 
| 堆栈状态 | 堆栈状态与模板保持一致 | 堆栈状态可能会偏离模板 | 
| 回滚支持 | 支持回滚（默认禁用） | 不支持回滚 | 
| 资源覆盖范围 | 所有 CloudFormation 资源类型 | 有限的资源类型（Amazon Lambda, Amazon ECS、Amazon Step Functions 等） | 
| 推荐用途 | 开发和迭代工作流 | 仅使用受支持资源的开发工作流 | 

## 相关资源
<a name="express-mode-related-resources"></a>
+ [选择预置资源时如何处理失败](stack-failure-options.md)
+ [嵌套堆栈](using-cfn-nested-stacks.md)
+ [使用更改集更新堆栈](using-cfn-updating-stacks-changesets.md)
+ *《Amazon CloudFormation API 参考》*中的 [CreateStack](https://docs.amazonaws.cn/AWSCloudFormation/latest/APIReference/API_CreateStack.html)。