名称:编写基础设施代码 描述:使用声明式和命令式IaC工具管理云基础设施。在配置云资源时使用(Terraform/OpenTofu用于多云,Pulumi用于以开发者为中心的工作流,AWS CDK用于AWS原生基础设施),设计可重用模块,实现状态管理模式,或建立基础设施部署工作流。
基础设施即代码
使用基于代码的自动化工具配置和管理云基础设施。此技能涵盖工具选择、状态管理、模块设计和操作模式,涉及Terraform/OpenTofu、Pulumi和AWS CDK。
何时使用
在以下情况下使用此技能:
- 配置云基础设施(计算、网络、数据库、存储)
- 从手动基础设施迁移到基于代码的工作流
- 设计可重用基础设施模块
- 实现多云或混合云部署
- 建立状态管理和漂移检测模式
- 将基础设施配置集成到CI/CD流水线中
- 评估IaC工具(Terraform vs Pulumi vs CDK)
常见请求:
- “创建一个用于VPC配置的Terraform模块”
- “为团队协作设置带锁的远程状态”
- “比较Pulumi和Terraform适用于我们的用例”
- “设计可组合的基础设施模块”
- “为现有基础设施实现漂移检测”
核心概念
基础设施即代码基础
关键原则:
- 声明式 vs 命令式 - 描述期望状态(Terraform)或编程基础设施(Pulumi)
- 幂等性 - 相同输入产生相同输出,可安全重新运行
- 版本控制 - 基础设施变更在Git中跟踪
- 状态管理 - 跟踪实际基础设施状态
- 模块组合 - 可重用、版本化的基础设施组件
好处:
- 可重现性(相同代码 = 相同基础设施)
- 可审计性(Git历史显示所有变更)
- 协作(基础设施变更的代码审查)
- 自动化(CI/CD部署基础设施)
- 灾难恢复(从代码重建)
工具选择框架
根据团队组成和云策略选择IaC工具:
Terraform/OpenTofu - 声明式、基于HCL
- 多云和混合云部署
- 运维/SRE团队偏好声明式方法
- 最大提供商生态系统(AWS、GCP、Azure、3000+提供商)
- 成熟模块注册表和社区
Pulumi - 命令式、基于编程语言
- 以开发者为中心的团队熟悉TypeScript/Python/Go
- 复杂逻辑需要编程构造(循环、条件、函数)
- 使用熟悉测试框架进行本地单元测试
- 强类型和IDE支持
AWS CDK - AWS原生、基于编程语言
- 仅限AWS基础设施
- 与AWS服务紧密集成
- L1/L2/L3构造抽象
- 底层使用CloudFormation
决策树:
需要多云?
├─ 是 → 团队组成?
│ ├─ 运维/SRE为主 → Terraform/OpenTofu
│ └─ 开发者为主 → Pulumi
└─ 否 → 仅限AWS?
├─ 是 → 语言偏好?
│ ├─ HCL/声明式 → Terraform
│ ├─ TypeScript/Python → AWS CDK
│ └─ YAML/简单 → CloudFormation
└─ 否 → 仅限GCP/Azure?
└─ Terraform或Pulumi
状态管理架构
带锁的远程状态支持团队协作:
后端选择:
| 云提供商 | 推荐后端 | 锁定机制 |
|---|---|---|
| AWS | S3 + DynamoDB | DynamoDB表 |
| GCP | Google云存储 | 原生 |
| Azure | Azure Blob存储 | 基于租约 |
| 多云 | Terraform Cloud/企业版 | 内置 |
| Pulumi | Pulumi服务 | 内置 |
状态隔离策略:
-
目录分离(推荐大多数团队)
- 每个环境单独目录(
prod/、staging/、dev/) - 完整状态文件隔离
- 无跨环境污染风险
- 每个环境单独目录(
-
工作空间
- 单一代码库,多个环境
- 共享状态后端,环境命名空间
- 风险:意外跨环境操作
-
分层架构
- 网络、计算、数据层分开状态文件
- 减少爆炸半径
- 通过远程状态数据源进行跨层引用
关键状态管理规则:
- 团队环境中始终使用远程状态
- 启用状态文件静态加密
- 启用状态存储版本化
- 使用状态锁定防止并发修改
- 永远不要将状态文件提交到Git
- 将敏感输出标记为
sensitive = true
模块设计模式
可组合模块结构:
模块/
├── vpc/ # 网络基础
├── 安全组/ # 可重用安全组模式
├── rds/ # 带备份、加密的数据库
├── ecs集群/ # 容器编排基础
├── ecs服务/ # 单个微服务
└── alb/ # 应用负载均衡器
模块版本控制:
- 在生产中固定模块版本(
version = "5.1.0") - 对内部模块使用语义版本控制
- 在非生产环境中先测试模块更新
- 维护模块发布的变更日志
模块设计原则:
- 清晰输入契约(必需 vs 可选变量)
- 文档化输出(消费者可引用的内容)
- 尽可能提供合理默认值
- 输入验证规则
- 显示用法的示例目录
何时创建模块:
- 资源组被重用3+次
- 清晰边界和职责
- 稳定接口契约
- 团队有模块维护能力
何时保持单一:
- 一次性基础设施
- 快速原型阶段
- 资源间高耦合
- 小团队、简单基础设施
快速参考
Terraform/OpenTofu命令
# 初始化提供商和后端
terraform init
# 计划变更(预览)
terraform plan
# 应用变更
terraform apply
# 销毁基础设施
terraform destroy
# 格式化HCL文件
terraform fmt
# 验证语法
terraform validate
# 显示状态
terraform state list
terraform state show <资源>
# 导入现有资源
terraform import <资源.名称> <ID>
# 工作空间管理
terraform workspace list
terraform workspace new staging
terraform workspace select prod
Pulumi命令
# 初始化新项目
pulumi new aws-typescript
# 预览变更
pulumi preview
# 应用变更
pulumi up
# 销毁基础设施
pulumi destroy
# 显示栈输出
pulumi stack output
# 管理栈
pulumi stack ls
pulumi stack select prod
# 导入现有资源
pulumi import <类型> <名称> <ID>
# 导出/导入状态
pulumi stack export > state.json
pulumi stack import < state.json
AWS CDK命令
# 初始化新应用
cdk init app --language typescript
# 合成CloudFormation
cdk synth
# 预览变更
cdk diff
# 部署栈
cdk deploy
# 销毁栈
cdk destroy
# 引导账户/区域
cdk bootstrap
# 列出栈
cdk list
常见模式检查清单
基础设施配置:
- [ ] 配置带锁的远程状态
- [ ] 启用状态文件加密
- [ ] 固定提供商版本
- [ ] 固定模块版本(生产)
- [ ] 变量有描述和类型
- [ ] 敏感输出标记为敏感
- [ ] 实现标签策略
- [ ] 应用成本分配标签
模块开发:
- [ ] 清晰README带用法示例
- [ ] 文档化必需 vs 可选变量
- [ ] 输出带描述文档化
- [ ] 关键输入验证规则
- [ ] 示例目录带工作代码
- [ ] 模块行为测试(Terratest/CDK断言)
- [ ] 版本跟踪变更日志
- [ ] 遵循语义版本控制
操作准备:
- [ ] 安排漂移检测
- [ ] 计划/应用的CI/CD流水线
- [ ] 状态备份策略
- [ ] 文档化灾难恢复
- [ ] 配置团队访问控制(IAM/RBAC)
- [ ] 集成成本估算(Infracost)
- [ ] 集成安全扫描(Checkov/tfsec)
- [ ] 保持文档最新
详细文档
有关全面模式和实现细节:
工具特定模式:
references/terraform-patterns.md- Terraform/OpenTofu最佳实践、HCL模式references/pulumi-patterns.md- Pulumi跨TypeScript/Python/Go
架构和设计:
references/state-management.md- 远程状态、锁定、隔离策略references/module-design.md- 可组合模块、版本控制、注册表
操作:
references/drift-detection.md- 检测和修复基础设施漂移
工作示例
演示IaC模式的实践实现:
Terraform示例:
examples/terraform/vpc-module/- 带公共/私有子网的多AZ VPCexamples/terraform/ecs-service/- 带ALB、自动扩展的ECS服务examples/terraform/rds-cluster/- 带备份、加密的Aurora集群examples/terraform/state-backend/- S3 + DynamoDB后端设置
Pulumi示例:
examples/pulumi/typescript/vpc/- TypeScript VPC组件examples/pulumi/python/ecs-service/- Python ECS服务examples/pulumi/go/rds-cluster/- Go RDS集群examples/pulumi/testing/- Pulumi程序的单元测试
AWS CDK示例:
examples/cdk/typescript/vpc-stack/- 使用L2构造的VPCexamples/cdk/typescript/ecs-fargate/- 带ALB的Fargate服务examples/cdk/typescript/pipeline-stack/- 自变CDK流水线examples/cdk/testing/- CDK断言和快照测试
实用脚本
自动化验证和操作工具:
scripts/validate-terraform.sh- Terraform格式化、验证、tflintscripts/cost-estimate.sh- Infracost包装器用于成本分析scripts/drift-check.sh- 安排漂移检测scripts/security-scan.sh- Checkov/tfsec安全扫描scripts/state-backup.sh- 状态文件备份自动化scripts/module-release.sh- 模块版本控制和发布
与其他技能集成
部署流水线:
building-ci-pipelines- 在CI/CD中自动化terraform计划/应用gitops-workflows- 基于GitOps的基础设施部署
平台工程:
kubernetes-operations- 配置EKS、GKE、AKS集群platform-engineering- 内部开发者平台基础设施
安全:
secret-management- 配置Vault、外部秘密操作符security-hardening- 实现基础设施安全控制compliance-frameworks- 合规性策略即代码
操作:
observability- 配置监控基础设施(Prometheus、Grafana)disaster-recovery- 基础设施重建过程cost-optimization- 通过IaC实现成本控制
数据平台:
data-architecture- 配置数据湖、仓库streaming-data- 配置Kafka、Kinesis基础设施
最佳实践
开发工作流:
- 在功能分支中编写基础设施代码
- 本地运行
terraform plan/pulumi preview - 提交带计划输出的拉取请求
- 代码审查聚焦安全、成本、爆炸半径
- CI运行自动化测试和安全扫描
- 仅在批准和CI通过后应用
- 部署后监控漂移
状态管理:
- 从第一天起使用远程状态(团队永远不要本地状态)
- 每个环境分开状态文件
- 启用状态锁定防止并发修改 n- 版本化状态存储以支持回滚
- 静态加密状态(包含敏感数据)
- 定期备份状态到单独位置
模块开发:
- 从单一代码开始,模式出现时提取模块
- 设计可重用性但避免过早抽象
- 文档化所有输入和输出
- 在
examples/目录提供工作示例 - 在模块中固定提供商版本
- 发布前测试模块
- 发布使用语义版本控制
安全:
- 应用前扫描IaC安全问题(Checkov、tfsec)
- 永远不要将秘密提交到代码(使用秘密引用)
- 标记敏感输出为
sensitive = true - 实现最小权限IAM策略
- 默认启用资源加密
- 对内部模块使用私有模块注册表
成本管理:
- 应用前估算成本(Infracost)
- 标记所有资源用于成本分配
- 在拉取请求中审查成本影响
- 设置成本警报用于漂移
- 基于使用情况调整资源大小
操作卓越:
- 安排定期漂移检测
- 文档化灾难恢复过程
- 维护常见操作运行手册
- 监控状态文件访问日志
- 定期实践基础设施重建
- 保持提供商版本最新并测试
常见陷阱
状态文件问题:
- 手动状态编辑 - 使用terraform状态命令,不要直接编辑
- 无状态锁定 - 竞态条件损坏状态
- 团队使用本地状态 - 团队成员间状态分歧
- 大状态文件 - 按层分解为多个状态文件
模块设计:
- 过度抽象 - 太泛化,难以理解
- 抽象不足 - 到处复制粘贴代码
- 无版本固定 - 意外破坏性变更
- 无示例 - 用户不知道如何使用模块
操作:
- 无漂移检测 - 手动变更未被注意
- 直接资源修改 - 绕过IaC创建漂移
- 无回滚计划 - 无法从失败应用恢复
- 忽略计划输出 - 应用期间意外
安全:
- 代码中秘密 - 硬编码凭据
- 无安全扫描 - 生产中的漏洞
- 过于宽松的IAM - 过度权限
- 无状态加密 - 敏感数据暴露
故障排除指南
状态锁问题:
terraform force-unlock <锁ID> # 仅当确定无其他进程运行时使用
导入现有资源:
terraform import aws_vpc.main vpc-12345678
pulumi import aws:ec2/vpc:Vpc main vpc-12345678
漂移检测:
terraform plan -detailed-exitcode # 退出码2 = 检测到漂移
pulumi preview --diff
有关详细漂移修复,见references/drift-detection.md。
状态恢复:
# Terraform:从S3版本化恢复
aws s3 cp s3://bucket/backup/terraform.tfstate terraform.tfstate
# Pulumi:从检查点恢复
pulumi stack export --version <时间戳> | pulumi stack import
相关技能
针对云特定实现:
aws-patterns- AWS特定资源模式gcp-patterns- GCP特定资源模式azure-patterns- Azure特定资源模式
针对基础设施操作:
kubernetes-operations- 管理通过IaC配置的Kubernetes集群gitops-workflows- 基于GitOps的基础设施部署platform-engineering- 内部开发者平台
针对安全和合规:
security-hardening- 基础设施安全控制secret-management- 秘密注入和轮换compliance-frameworks- 合规性策略即代码
针对部署自动化:
building-ci-pipelines- 基础设施代码的CI/CDdeploying-applications- 应用部署到配置的基础设施
针对成本和可观察性:
cost-optimization- 基础设施的FinOps实践observability- 监控基础设施健康