

# 了解堆栈部署时间
<a name="stack-deployment-time"></a>

当您创建、更新或删除堆栈时，CloudFormation 会预置模板中的各项资源，待资源准备就绪、能够处理流量时，它会报告堆栈操作已完成。本主题介绍了 CloudFormation 如何预置堆栈、哪些因素影响堆栈操作的耗时以及如何缩短部署时间。

**Topics**
+ [CloudFormation 如何预置堆栈](#how-cloudformation-provisions-a-stack)
+ [哪些因素影响部署时间](#what-affects-deployment-time)
+ [缩短部署时间的方法](#ways-to-shorten-deployment-time)
+ [相关资源](#stack-deployment-time-related-resources)

## CloudFormation 如何预置堆栈
<a name="how-cloudformation-provisions-a-stack"></a>

CloudFormation 会读取模板中资源之间的依赖项。通过 `Ref`、`Fn::GetAtt` 或 `DependsOn` 引用其他资源的资源将在其引用的资源之后预置。彼此之间没有依赖项的资源会并行预置。

对于每个资源，CloudFormation 都会应用资源配置，然后确认该资源已准备就绪、能够处理流量。每个资源准备就绪后，CloudFormation 就会向前推进，因此依赖资源会尽早启动。因此，依赖链较长的堆栈的改进幅度最大。当堆栈中的所有资源均准备就绪时，CloudFormation 会报告堆栈操作已完成。

此行为会自动应用于堆栈操作。您无需更改模板，也无需设置任何参数。

## 哪些因素影响部署时间
<a name="what-affects-deployment-time"></a>

依赖链  
相互依赖的最长资源链设置了堆栈操作的最短时间。不属于该链的资源是并行预置的，通常不会增加总时间。

需要更长时间才能准备就绪的资源  
在包含 Amazon RDS 数据库实例、Elastic Load Balancing 负载均衡器、NAT 网关或 Amazon CloudFront 分配等资源的工作负载中，大部分部署时间都花在等待这些资源准备就绪并能够处理流量上。

引用资源属性的输出  
如果堆栈输出引用了某个资源属性（例如使用 `Fn::GetAtt`），则 CloudFormation 会等到该属性值可用后再完成堆栈操作。这段等待可能会增加操作所需的时间。

## 缩短部署时间的方法
<a name="ways-to-shorten-deployment-time"></a>
+ **使用快速模式进行开发迭代。**一旦 CloudFormation 应用了资源配置，快速模式就会完成堆栈操作，并且资源在后台继续准备就绪。有关更多信息，请参阅 [Express Mode](cloudformation-express-mode.md)。
+ **根据资源的更改频率对其进行分组。**将准备就绪耗时较长的资源（例如数据库）与经常更新的资源分置于不同的堆栈中。随后对频繁更改的堆栈所做的更新将不包含那些运行时间较长的资源。
+ **移除不需要的依赖项。**仅在资源必须等待其他资源时声明 `DependsOn`。更少的依赖项使 CloudFormation 能够并行预置更多资源。
+ **仅在需要时在输出中引用资源属性。**引用资源属性的输出可以扩展堆栈操作，直到这些值可用。

## 相关资源
<a name="stack-deployment-time-related-resources"></a>
+ [CloudFormation 的工作原理](cloudformation-overview.md)
+ [Express Mode](cloudformation-express-mode.md)
+ [使用更改集更新 CloudFormation 堆栈](using-cfn-updating-stacks-changesets.md)