

# 理解堆栈资源的更新行为
<a name="using-cfn-updating-stacks-update-behaviors"></a>

提交更新时，Amazon CloudFormation 会基于提交的内容与堆栈当前模板之间的差异来更新资源。尚未更改的资源在更新过程中会不中断地运行。对于更新后的资源，Amazon CloudFormation 使用下列更新行为之一：

**无中断更新**  <a name="update-no-interrupt"></a>
Amazon CloudFormation 更新资源时不会中断该资源的运行，也不会更改该资源的物理 ID。例如，如果您更新 [AWS::CloudTrail::Trail](https://docs.amazonaws.cn/AWSCloudFormation/latest/TemplateReference/aws-resource-cloudtrail-trail.html) 资源的某些属性，则 Amazon CloudFormation 会更新跟踪而不会出现中断。

**有部分中断的更新**  <a name="update-some-interrupt"></a>
Amazon CloudFormation 更新资源，并且出现一些中断。例如，如果您对 [AWS::EC2::Instance](https://docs.amazonaws.cn/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-instance.html) 资源更新特定属性，则在 Amazon CloudFormation 和 Amazon EC2 重新配置实例期间，该实例可能有时会中断。

**替换**  <a name="update-replacement"></a>
Amazon CloudFormation 会在更新过程中重新创建资源，这还会生成新的物理 ID。Amazon CloudFormation 通常会先创建替换资源，将对其他相关资源的引用更改为指向替换资源，然后删除旧资源。例如，如果您更新 [AWS::EC2::Instance](https://docs.amazonaws.cn/AWSCloudFormation/latest/TemplateReference/aws-resource-ec2-instance.html) 资源类型的 `AvailabilityZone` 属性，则 Amazon CloudFormation 会创建新资源并将当前 EC2 实例资源替换为新资源。  
如果您添加或移除需要替换的属性，则它也会触发更新。即使属性的实际值没有改变，也会进行更新。

Amazon CloudFormation 使用的方法取决于您为给定资源类型更新的属性。[Amazon 资源和属性类型参考](https://docs.amazonaws.cn/AWSCloudFormation/latest/TemplateReference/aws-template-resource-type-ref.html)中介绍了每个属性的更新行为。

根据更新行为，您可以决定何时修改资源以减小这些更改对应用程序产生的影响。具体来说，您可以计划好更新过程中必须*替换* 资源的时间。例如，如果您更新 [AWS::RDS::DBInstance](https://docs.amazonaws.cn/AWSCloudFormation/latest/TemplateReference/aws-resource-rds-dbinstance.html) 资源类型的 `Port` 属性，则 Amazon CloudFormation 将通过使用更新后的端口设置创建新数据库实例来替换数据库实例并删除旧的数据库实例。在更新之前，您可以计划执行以下操作来准备好进行数据库替换：
+ 拍摄当前数据库的快照。
+ 准备一个策略，指定使用该数据库实例的应用程序在数据库实例替换期间将如何处理中断。
+ 确保使用该数据库实例的应用程序考虑更新的端口设置以及您进行的任何其他更新。
+ 使用数据库快照在新数据库实例上还原数据库。

该示例并不详尽，但它旨在让您了解针对在更新过程中替换资源的情况，需要计划的事项。

**注意**  
如果模板包括一个或多个[嵌套堆栈](using-cfn-nested-stacks.md)，则 Amazon CloudFormation 也会为每个嵌套堆栈启动更新。这对于确定嵌套堆栈是否已修改是必要的。Amazon CloudFormation 只更新嵌套堆栈中那些在相应模板中指定了更改的资源。