

# 使用 CloudFormation 模板
<a name="template-guide"></a>

AWS CloudFormation 模板定义了您要在堆栈中创建、更新或删除的 AWS 资源。模板由多个部分组成，但唯一必须具备的是 [Resources](resources-section-structure.md) 部分，其中必须至少声明一种资源。

您可以使用以下方法创建模板：
+ **AWS 基础架构编辑器** – 用于设计模板的可视化界面。
+ **文本编辑器** – 直接使用 JSON 或 YAML 语法编写模板。
+ **IaC 生成器** – 利用您账户中已预置但当前不由 CloudFormation 管理的资源生成模板。IaC 生成器适用于云管控 API 在您所在区域支持的多种资源类型。

本部分提供有关如何使用 CloudFormation 模板的不同部分以及如何开始创建堆栈模板的全面指南。其涵盖以下主题：

**Topics**
+ [模板的存储位置](#where-they-get-stored)
+ [验证模板](#template-validation)
+ [开始使用模板](#getting-started)
+ [示例模板](#sample-templates)
+ [模板格式](template-formats.md)
+ [模板部分](template-anatomy.md)
+ [基础架构编辑器](infrastructure-composer-for-cloudformation.md)
+ [AWS CloudFormation 语言服务器](ide-extension.md)
+ [IaC 生成器](generate-IaC.md)
+ [获取存储在其他服务中的值](dynamic-references.md)
+ [获取 AWS 值](pseudo-parameter-reference.md)
+ [获取堆栈输出](using-cfn-stack-exports.md)
+ [在运行时指定现有资源](cloudformation-supplied-parameter-types.md)
+ [演练](walkthroughs.md)
+ [模板代码段](template-snippets.md)
+ [基于 Windows 的堆栈](cfn-windows-stacks.md)
+ [使用 CloudFormation 提供的资源类型](cloudformation-supplied-resource-types.md)
+ [使用模块创建可重复使用的资源配置](modules.md)

## 模板的存储位置
<a name="where-they-get-stored"></a>

**Amazon S3 存储桶**  
您可以将 CloudFormation 模板存储在 Amazon S3 存储桶中。创建或更新堆栈时，您可以指定模板的 S3 URL，而不是直接上传模板。

如果您通过 AWS 管理控制台 或 AWS CLI 直接上传模板，系统将自动为您创建一个 S3 存储桶。有关更多信息，请参阅 [通过 CloudFormation 控制台创建堆栈](cfn-console-create-stack.md)。

**Git 存储库**  
使用 [Git sync](git-sync.md)，您可以将模板存储在 Git 存储库中。创建或更新堆栈时，您可以指定 Git 存储库位置和包含模板的分支，而不是直接上传模板或引用 S3 URL。CloudFormation 会自动监控指定的存储库和分支以查找模板更改。有关更多信息，请参阅 [使用 Git 同步从存储库源代码创建堆栈](git-sync-create-stack-from-repository-source-code.md)。

## 验证模板
<a name="template-validation"></a>

**语法验证**  
您可以使用 [validate-template](service_code_examples.md#validate-template-sdk) CLI 命令或通过在控制台上指定模板来验证模板的 JSON 或 YAML 语法。控制台会自动执行验证。有关更多信息，请参阅 [通过 CloudFormation 控制台创建堆栈](cfn-console-create-stack.md)。

但这些方法仅会验证模板的语法，而不会验证您为资源指定的属性值。

**其他验证工具**  
要进行更复杂的验证和最佳实践检查，您可以使用其他工具，例如：
+ [CloudFormation Linter（cfn-lint）](https://github.com/aws-cloudformation/cfn-lint)：根据 [CloudFormation 资源提供程序架构](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/resource-type-schemas.html)验证模板。其中包括检查资源属性的有效值以及最佳实践。
+ [CloudFormation Rain（rain fmt）](https://github.com/aws-cloudformation/rain)– 按统一的标准格式化 CloudFormation 模板，或者将模板从 JSON 重新格式化为 YAML（或从 YAML 格式化为 JSON）。这会在使用 YAML 时会保留注释，并尽可能将内置函数转换为简短语法。

## 开始使用模板
<a name="getting-started"></a>

要开始创建 CloudFormation 模板，请遵循以下步骤：

1. **选择资源** – 确定要包含在堆栈中的 AWS 资源，例如 EC2 实例、VPC、安全组等。

1. **编写模板** – 以 JSON 或 YAML 格式编写模板，定义资源及其属性。

1. **保存模板**：使用以下文件扩展名在本地保存模板：`.json`、`.yaml` 或 `.txt`。

1. **验证模板** – 使用 [验证模板](#template-validation) 部分中描述的方法验证模板。

1. **创建堆栈** – 使用验证后的模板创建堆栈。

### 计划使用 CloudFormation 模板引用
<a name="additional-resources"></a>

在编写模板时，可以在 [AWS 资源和属性类型参考](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-template-resource-type-ref.html)中找到不同资源类型详细语法的文档。

通常，您的堆栈模板需要内置函数来分配直到运行时才可用的属性值，并需要特殊属性来控制资源的行为。在编写模板时，请参阅以下资源以获取指导：
+ [内置函数参考](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference.html)：一些常用的内置函数包括：
  + `Ref` – 检索资源的参数值或物理 ID。
  + `Sub` – 用实际值替换字符串中的占位符。
  + `GetAtt` – 返回模板中的资源的属性值。
  + `Join` – 将一组值连接成单个字符串。
+ [资源属性参考](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-product-attribute-reference.html)：一些常用的特殊属性包括：
  + `DependsOn` – 此属性用于指定必须在一个资源创建之后才能创建另一个资源。
  + `DeletionPolicy` – 此属性用于指定 CloudFormation 如何处理资源删除的方式。

## 示例模板
<a name="sample-templates"></a>

CloudFormation 提供了您可以开始使用的开源堆栈模板。有关更多信息，请参阅 GitHub 网站上的 [CloudFormation 示例模板](https://github.com/aws-cloudformation/aws-cloudformation-templates)。

请记住，这些模板并不意味着已做好生产的准备。您应该花些时间了解模板的工作方式，根据需要进行调整，并确保它们符合自己公司的合规标准。

该存储库中的每个模板都通过了 [CloudFormation Linter](https://github.com/aws-cloudformation/cfn-lint) (cfn-lint) 检查，以及一组基于 Center for Internet Security (CIS) 前 20 项控制的基本 AWS CloudFormation Guard 规则，但示例应侧重于单个用例的某些规则除外。