核心 · Key Idea
一句话:Terraform 是 IaC 的事实标准,2024 年起协议改为 BSL(非 OSI 开源),社区 fork 出 OpenTofu 完全开源。API 兼容,迁移基本就是改命令名。
是什么#
terraform {
required_providers {
aws = { source = "hashicorp/aws", version = "~> 5.0" }
}
backend "s3" {
bucket = "tfstate-prod"
key = "infra/main.tfstate"
region = "us-east-1"
dynamodb_table = "tfstate-lock"
encrypt = true
}
}
module "vpc" {
source = "terraform-aws-modules/vpc/aws"
name = "prod"
cidr = "10.0.0.0/16"
azs = ["us-east-1a", "us-east-1b"]
}
resource "aws_s3_bucket" "media" {
bucket = "media-prod-${random_id.suffix.hex}"
force_destroy = false
}terraform init
terraform plan -out=tfplan
terraform apply tfplan打个比方#
打个比方 · Analogy
没 Terraform 之前 = 在云控制台里手工点点点 + 截图记录;
有了之后 = 写一份 IKEA 说明书,谁来都能照搭出一模一样的家具。
关键概念#
Provider云适配器
AWS / GCP / Azure / Cloudflare / GitHub —— 几乎所有云资源都有。
Resource资源
云端的一个对象。配置即源。
Data Source数据源
只读:去云上查一个已存在的资源属性。
Module模块
可复用资源组合,类似函数。
Backend状态后端
S3 / GCS / Terraform Cloud。**远端 + 锁**,多人协作必备。
Workspace / 多环境Workspace
同一份代码多状态,区分 dev/staging/prod。也可用目录结构隔离更清楚。
Plan计划
只算差量不执行;CI 把它贴 PR 评审用。
工作流#
PR 流程是 IaC 安全的关键 —— 改 prod 必经审查。
实操要点#
- 远端 state + 锁:S3 + DynamoDB / GCS / Terraform Cloud / Spacelift。单人也用,将来加人零成本。
- 模块化:
modules/network/、modules/eks-cluster/—— 复用 + 测试。 - 环境分目录:
envs/prod/main.tf引用 modules + 覆盖变量。比 workspace 更直观。 - 机密走 secret backend:tfvars 不进 git。或用
vault_generic_secret数据源直接拉。 prevent_destroy = true给 prod DB / 关键 bucket 加锁,防destroy误伤。- drift 检测:定时跑 plan,云上手改的内容会被发现。
- OpenTofu 切换:
opentofu init / plan / apply,二进制 drop-in。重大新特性后续会 diverge。 - 不要把所有东西塞一个 root:blast radius,多 root 分仓更安全。
易混点#
Terraform / OpenTofu
管**云对象**。
创建 / 更改 / 删除资源。
创建 / 更改 / 删除资源。
Ansible
管**已有机器内部**配置。
包 / 文件 / 服务。
包 / 文件 / 服务。