核心 · Key Idea
一句话:IaC 用声明式代码描述「我要什么云资源」(VPC / VM / 数据库 / DNS),工具根据当前状态计算差量后自动创建 / 修改 / 删除。结果:环境可重建、PR 可审查、回滚有记录。
是什么#
# main.tf —— 用 Terraform 声明 AWS 资源
provider "aws" { region = "us-east-1" }
resource "aws_vpc" "main" {
cidr_block = "10.0.0.0/16"
tags = { Name = "prod" }
}
resource "aws_instance" "web" {
ami = "ami-0abcd"
instance_type = "t3.small"
subnet_id = aws_subnet.public.id
user_data = file("${path.module}/cloud-init.yml")
tags = { Name = "web-1" }
}terraform init
terraform plan # 看会做什么
terraform apply # 真做
terraform destroy # 删打个比方#
打个比方 · Analogy
不用 IaC = 手工捏陶瓷:每次都凭手感、不可复制、坏了重做。
IaC = 3D 模型 + 打印机:图纸(代码)一份就能反复印,两个一模一样。
关键概念#
声明式Declarative
你说要什么状态,工具算差量。区别于 shell 脚本「这一步那一步」的命令式。
状态文件State
Terraform 的 .tfstate 记录「当前云上是什么」。**必须远端共享 + 锁**(S3 + DynamoDB / GCS / Terraform Cloud)。
Provider提供方
AWS / GCP / Azure / Cloudflare / GitHub —— 几乎所有云资源都有 provider。
Module模块
可复用的资源组合,类似函数。
Drift漂移
云上被人手动改了 → 实际与代码不一致。`terraform plan` 能发现。
OpenTofuTerraform 分叉
Terraform 改 BSL 协议后由社区 fork 出来的开源版本。
主流工具对比#
- Terraform / OpenTofu
- HCL DSL,最广。多云通用。
- Pulumi
- 用 Python / TS / Go 真编程语言写 IaC。
- AWS CDK
- 也是真编程语言,编译成 CloudFormation。仅 AWS。
- CloudFormation / ARM / Deployment Manager
- 云厂商原生。
- Crossplane
- 把云资源当 K8s CRD 管。
- Ansible
- 更偏 OS 内配置(包 / 文件 / 服务),但也能管基础设施。
怎么工作#
每次 apply 就是「读 state + 读云 + 看代码 → 计算差量 → 调云 API」。
实操要点#
- 状态文件远端 + 锁:本地 state 是新手坑。多人协作必远端 + 锁。
plan当审查工件:CI 把terraform plan输出贴到 PR,merge 之后再apply。- 资源命名 + 标签:所有资源加 env / owner / project 标签,方便清账单。
- 不要全部 一个 root module:按 region / env / 组件分仓 + 模块化,blast radius 可控。
- 机密:用 Vault / SOPS / Secrets Manager;不要 push tfvars 进 git。
- 删资源谨慎:
terraform destroy不可撤销 —— 关键资源加prevent_destroy = true。 - Drift 检测:定时
plan报告漂移,发现手动改动;坚决「改回代码」而不是反向修代码。
易混点#
IaC(云资源)
创建 / 改 / 删**云对象**:VM、VPC、DB。
Terraform / Pulumi。
Terraform / Pulumi。
配置管理(Ansible / Chef)
在已有机器上**装包 / 配文件 / 启服务**。
Ansible / Chef / Salt。
Ansible / Chef / Salt。