通过 AWS CloudFormation 实践 Infrastructure as Code - 模板设计与堆栈管理
通过模板定义基础设施,通过变更集预先确认影响范围。利用漂移检测发现配置偏差,通过 StackSets 向整个 Organizations 批量部署。
CloudFormation 概述
CloudFormation 是一项通过 YAML 或 JSON 模板声明式定义 AWS 资源并以堆栈形式进行预置的 IaC 服务。与手动创建资源相比,它实现了环境的可重现性、版本管理和自动化。模板可通过 Git 管理,并集成到代码审查和 CI/CD 管线中,将与软件开发相同的质量管控流程应用于基础设施变更。SAM 是 CloudFormation 的扩展,简化了无服务器应用程序的定义。通过 CloudFormation Registry,除 AWS 官方类型外还可管理第三方和自定义资源类型。
模板设计与堆栈管理
模板通过 Parameters(最多 200 个)定义部署时的输入值,通过 Mappings 定义各环境的配置值,通过 Conditions 定义条件分支。每个堆栈最多可管理 500 个资源,模板主体大小上限为通过 S3 上传时 1 MB。超出时通过嵌套堆栈进行拆分,使用 AWS::CloudFormation::Stack 资源引用子模板的 URL。变更集在堆栈更新前创建,预览将要添加、修改和删除的资源。由于发生 Replace(替换)的资源会暂时中断服务,因此通过变更集确认非常重要。利用 Outputs 部分与 Export/ImportValue 可在堆栈间共享资源 ARN 和 ID,便于微堆栈架构下的团队分工。DeletionPolicy 属性可指定 Delete(默认)、Retain(删除堆栈时保留资源)或 Snapshot(删除前创建快照),系统化保护关键数据。
漂移检测与 StackSets
漂移检测用于检测堆栈资源是否偏离了模板定义。通过控制台手动操作或脚本进行的变更会被检测为漂移,可以确认与模板的差异。通过 EventBridge 计划自动化定期漂移检测,及早发现配置偏差。需注意漂移检测并非支持所有资源类型,应查阅文档确认支持的资源列表。StackSets 是将同一模板批量部署到多个账户和区域的功能,与 Organizations 集成可自动化 OU 级别的部署。当新账户添加到 OU 时,StackSets 会自动部署,防止护栏应用遗漏。适当配置 MaxConcurrentCount 和 FailureToleranceCount 以控制大规模展开时的风险。 如果想系统学习 IaC,也可以参考相关书籍(Amazon)。
设计最佳实践与常见陷阱
模板设计中需注意避免随意更改逻辑名称 (LogicalId)。更改 LogicalId 会触发资源替换,对于 RDS 实例或 EBS 卷等有状态资源可能导致数据丢失。建议使用堆栈策略防止重要资源被更新或删除,并对关键资源设置 UpdateReplacePolicy: Retain。循环依赖 (Circular Dependency) 是导致模板部署失败的常见错误,常见于安全组的相互引用,应使用独立的 AWS::EC2::SecurityGroupIngress/Egress 资源来解决。当回滚失败 (UPDATE_ROLLBACK_FAILED) 发生时,可使用 ContinueUpdateRollback API 指定要跳过的资源来恢复堆栈。对于大型模板,将 cfn-lint 与 TaskCat(多区域同时测试)和 cfn-guard(自动策略合规验证)组合使用可提高质量。
与 Terraform / CDK 的选择
CloudFormation 在不需要多云的 AWS 专用环境中优势明显,尤其是利用 StackSets 和 Organizations 集成等原生功能时。状态由 AWS 自动管理,无需准备 S3 存储桶或锁表。Terraform 的优势在于多云支持和广泛的 Provider 生态系统,可在同一工作流中管理 AWS 之外的资源,但状态文件管理(S3 + DynamoDB 锁)会带来运维负担。CDK 使用 TypeScript、Python 等通用编程语言定义基础设施,利用循环、条件分支和抽象类等语言特性简洁地描述复杂基础设施。由于 CDK 最终生成 CloudFormation 模板,因此可直接使用 CloudFormation 的限制和漂移检测等功能。选择指南:组织标准护栏部署用 StackSets,可编程抽象用 CDK,多云场景用 Terraform。
费用与限制注意事项
CloudFormation 本身不产生额外费用。成本仅为预置的 AWS 资源使用费。第三方资源(通过 CloudFormation Registry 的扩展类型)按处理程序操作计费(CREATE/UPDATE/DELETE/READ/LIST 各操作)。主要限制包括:每账户堆栈默认上限 2,000(可申请提高)、每模板 Outputs 上限 200、Mappings 上限 200。为提高模板开发效率,可使用 cfn-lint 预先检测模板语法错误,通过变更集在部署前确认影响范围。通过嵌套堆栈复用公共资源(VPC、安全组),消除模板重复。还可以使用 Rain CLI 提高模板格式化和部署的效率。
总结
CloudFormation 是通过基于模板的 IaC 实现基础设施可重现性和自动化的服务。通过变更集在部署前确认影响范围,通过漂移检测发现配置偏差。通过 StackSets 向整个 Organizations 批量部署模板,自动化多账户多区域的基础设施管理。利用 DeletionPolicy 和堆栈策略保护有状态资源,与 CDK 或 Terraform 组合构建适合项目需求的最优 IaC 策略。