

# 更新堆栈模板
<a name="using-cfn-updating-stacks-get-template"></a>

要修改 CloudFormation 堆栈中的资源或属性，您必须更新堆栈的模板。以该堆栈的现有模板为基础，然后对其进行更改。如果模板存储在源控制系统中，请以该模板的副本为起点。否则，您可以从 CloudFormation 获取该模板的副本。

如果只需要修改堆栈的参数或设置（如堆栈的 Amazon SNS 主题），则可以重复使用现有的模板，而不获取副本。

您可以使用文本编辑器或 [基础架构编辑器](infrastructure-composer-for-cloudformation.md)来修改 CloudFormation 堆栈模板。

**使用基础设施编辑器更新现有的堆栈模板**

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

1. 在**堆栈**页面上，选择要更新的堆栈的名称。

1. 选择**模板**选项卡，然后选择**在基础架构编排器中查看**。

   CloudFormation 将在基础设施编辑器中打开该模板。

1. 使用以下方法之一更新模板：
   + **画布**界面：在此界面中，您可以从**资源**面板中拖放。通过双击卡片打开**资源属性**面板即可配置资源。根据需要连接资源。有关使用**画布**界面的详细说明，请参阅 [How to compose in AWS 基础架构编辑器](https://docs.aws.amazon.com/infrastructure-composer/latest/dg/using-composer-basics.html)。
   + **模板**界面：从**画布**切换到**模板**界面。对模板代码执行内联更新。根据需要在 JSON 到 YAML 格式之间切换。

1. 选择**验证**以检查模板中的任何语法错误。

1. 准备好将更改导出到 CloudFormation 后，请选择**更新模板**。

**使用 AWS CLI 更新现有的堆栈模板**

1. 要获取要更新的堆栈的模板，请使用 [get-template](https://docs.aws.amazon.com/cli/latest/reference/cloudformation/get-template.html) CLI 命令。

1. 将模板复制并粘贴到文本文件中，进行修改，然后保存它。*只* 复制模板。该命令将模板括在引号中，但是不得复制模板两端的引号。模板本身以左括号开始，以右括号结束。指定对本文件中堆栈资源的更改。

更改模板时应记住以下几点：
+ 您无法添加、修改或删除不支持更新的资源使用的参数。
+ 对于大多数资源，更改资源的逻辑名称相当于删除该资源并将其替换为新资源。与重命名的资源关联的任何其他资源也需要更新，并且可能会导致它们被替换。其他资源需要您更新属性（不仅仅是逻辑名称）才能启动更新。
+ 某些资源可能对您可以为某些属性设置的值有限制。例如，对 RDS 数据库实例的 `AllocatedStorage` 属性的更改必须大于当前值。如果您的更新违反了这些规则，该部分将会失败。
+ 更新一个资源也会影响引用该资源的其他资源。如果您使用 [`Ref` 函数](resources-section-structure.md#resource-properties-ref) 或 [`Fn::GetAtt` 函数](resources-section-structure.md#resource-properties-getatt) 之类的函数来设置基于其他资源的属性，则当被引用的资源发生更改时，CloudFormation 也会更新引用资源。
+ 要了解更新特定资源属性的影响，请参阅 [AWS 资源和属性类型参考](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-template-resource-type-ref.html)。对于每种属性，更新将产生以下一种影响：
  + *更新要求*：[没有中断](using-cfn-updating-stacks-update-behaviors.md#update-no-interrupt)
  + *更新要求*：[时而中断](using-cfn-updating-stacks-update-behaviors.md#update-some-interrupt)
  + *更新要求*：[替换](using-cfn-updating-stacks-update-behaviors.md#update-replacement)
+ 您可以使用 [validate-template](service_code_examples.md#validate-template-sdk) CLI 命令或通过在控制台上指定模板来验证模板的 JSON 或 YAML 语法。控制台会自动执行验证。但这些方法仅会验证模板的语法，而不会验证您为资源指定的属性值对于该资源是否有效。要进行更复杂的验证或查看最佳实践，您还可以使用其他工具，例如 [CloudFormation Linter（cfn-lint）](https://github.com/aws-cloudformation/cfn-lint)和 [CloudFormation Rain（rain fmt）](https://github.com/aws-cloudformation/rain)。

**注意**  
有时，CloudFormation 不允许您尝试进行某些更改，并且会告诉您不允许进行更改。然而，该消息可能是异步出现的，因为在默认情况下，CloudFormation 创建和更新资源的顺序是不确定的。