AWS CloudFormation
使用 JSON 或 YAML 模板将 AWS 基础设施定义为代码进行管理的 Infrastructure as Code 服务,以栈为单位统一管理资源的创建到删除
概述
AWS CloudFormation 是一项通过代码自动化 AWS 资源配置和管理的 Infrastructure as Code (IaC) 服务。在 JSON 或 YAML 格式的模板文件中声明式地描述 VPC、EC2、RDS、Lambda 等 AWS 资源及其配置,并作为栈进行部署。CloudFormation 自动解析模板中描述的资源间依赖关系,按适当顺序创建资源。变更集功能可以事先确认模板变更会影响哪些资源,防止意外变更。漂移检测功能可检测手动变更的资源与模板之间的差异。删除栈时所有资源会自动清理,在反复创建和销毁环境的开发测试阶段特别有用。CloudFormation 本身免费使用,仅对创建的资源收费。
模板主要部分与内置函数
CloudFormation 模板由 Parameters、Mappings、Conditions、Resources、Outputs 等主要部分组成。Parameters 是部署时从外部传入值的输入参数,可动态切换环境名称或实例类型。Mappings 是根据区域或环境查找值的查找表,用于 AMI ID 的区域映射等。Conditions 基于条件控制资源的创建,可实现仅在生产环境启用 Multi-AZ 等分支。Resources 是模板的核心,声明式定义要创建的 AWS 资源及其配置。通过 Fn::Ref、Fn::GetAtt、Fn::Sub 等内置函数进行资源间引用和字符串动态生成,用 Fn::If 编写基于 Conditions 的条件分支。Azure 的 ARM 模板仅支持 JSON,而 CloudFormation 同时支持 JSON 和 YAML,YAML 可读性更高,在实务中是主流。
变更集与漂移检测实现安全更新
CloudFormation 的变更集 (Change Set) 是事先预览模板变更会影响哪些资源的功能。资源的添加、修改、替换、删除会以列表形式显示,可以防止意外的资源替换 (伴随数据丢失的重建) 或删除。设置栈策略可以明确禁止生产数据库等重要资源的更新或删除。漂移检测功能检测通过控制台或 CLI 手动变更的资源与模板之间的差异,有助于维护 IaC 的一致性。IaC 入门相关书籍 (Amazon) 系统地总结了这些运维实践。
嵌套栈与 StackSets 实现模块化
在大规模环境中,不使用单个巨大模板,而是通过嵌套栈按职责拆分。将网络层、数据库层、应用层分离到不同的栈中,限定变更影响范围,从而提高部署的安全性和速度。使用跨栈引用 (Exports/Imports),应用栈可以引用网络栈输出的 VPC ID 和子网 ID。StackSets 是将同一模板一次性部署到多个 AWS 账户和区域的功能,与 Organizations 联动可在新账户创建时自动应用护栏 (启用 CloudTrail、设置 Config 规则等)。AWS SAM 是 CloudFormation 的扩展,可以用简洁的语法定义 Lambda 函数、API Gateway、DynamoDB 表等 Serverless 资源,还内置了本地测试和部署自动化。