基础设施即代码
IaC 工具对比
| 工具 | 类型 | 语言 | 最适合 |
|---|---|---|---|
| Terraform / OpenTofu | 基础设施供应 | HCL | 多云基础设施、状态管理 |
| Ansible | 配置管理 | YAML | 服务器配置、应用部署、无代理 |
| Pulumi | 基础设施供应 | Python/TS/Go/C# | 偏好真实语言的开发者、复杂逻辑 |
| AWS CloudFormation | 基础设施供应 | JSON/YAML | 纯 AWS、深度服务集成 |
| AWS CDK | 基础设施供应 | TS/Python/Java | 纯 AWS、编程式方法 |
| Helm | K8s 配置 | YAML + 模板 | Kubernetes 应用打包 |
Terraform 项目结构
infra/
├── environments/
│ ├── dev/
│ │ ├── main.tf
│ │ ├── variables.tf
│ │ └── terraform.tfvars
│ └── prod/
│ ├── main.tf
│ └── terraform.tfvars
├── modules/
│ ├── vpc/
│ │ ├── main.tf
│ │ ├── variables.tf
│ │ └── outputs.tf
│ ├── eks/
│ └── rds/
└── shared/
├── backend.tf
└── providers.tf
IaC 最佳实践
| 实践 | 描述 |
|---|---|
| 远程状态 | 状态存储在 S3/GCS,用 DynamoDB 加锁 |
| 按环境分离状态 | dev/staging/prod 使用独立状态文件 |
| 模块化 | VPC、EKS、RDS 等可复用模块 |
| 固定所有版本 | 固定提供商和模块版本 |
| 先计划再应用 | 始终审查 plan;CI 在 PR 中自动展示 plan |
| 密钥管理 | IaC 中不存储密钥;使用 Vault、AWS SSM 等 |
| 资源标签 | 统一标签:环境、团队、成本中心、创建人 |
| 漂移检测 | 定期运行 terraform plan 检测手动变更 |