三个核心概念
| 概念 | 含义 |
|---|---|
| Provider | 与某种平台对话的"插件"(aws、azure、gcp、kubernetes、cloudflare …) |
| Resource | 一个具体实体(一台 VM、一条 DNS 记录、一个 IAM 角色) |
| State | Terraform 记下"我已经建了什么"的本地账本 |
最简流程
main.tf:
terraform {
required_providers {
aws = { source = "hashicorp/aws", version = "~> 5.0" }
}
}
provider "aws" {
region = "ap-northeast-1"
}
resource "aws_s3_bucket" "logs" {
bucket = "wadely-prod-logs"
}
四条命令:
terraform init # 装 provider
terraform plan # 看会改什么(不动手)
terraform apply # 真的执行
terraform destroy # 全删(小心)
State 是核心
terraform.tfstate 文件记录"现在云上长啥样"。它的角色:
- 真相:apply 时对比 state vs 代码 → 算出 diff
- 状态机:很多 resource 之间互相依赖,state 帮 Terraform 排序
- 敏感:可能含密码 / 私钥 → 不能 commit 到 git
单机用没问题——但团队不行
两个人同时 apply:
A 跑 plan:state 显示 1 台机器
A 跑 apply:建第 2 台
B 跑 plan:state 还是 1 台(A 还没结束)
B 跑 apply:又建一台 → 重复!
解决:远程 state + locking。
远程 state 标准方案(AWS)
terraform {
backend "s3" {
bucket = "wadely-tf-state"
key = "prod/terraform.tfstate"
region = "us-east-1"
dynamodb_table = "wadely-tf-locks" # 旧方案:DynamoDB 加锁
encrypt = true
}
}
- S3 存 state(开版本控制 + 加密)
- DynamoDB 提供 lock(同一时间只一个人能 apply)
Terraform 1.10+ 起 S3 backend 支持原生加锁(
use_lockfile = true),不再需要单独的 DynamoDB 表。OpenTofu 也已对齐。新项目直接用原生锁;老项目 DynamoDB 方案仍有效,迁移看官方文档。
GCP 用 GCS(自带对象锁);Azure 用 Storage Account;自建可用 PostgreSQL / Consul backend。
模块化:复用单元
modules/vpc/main.tf 写好一套 VPC 模板,多环境复用:
module "vpc_prod" {
source = "./modules/vpc"
name = "prod"
cidr = "10.0.0.0/16"
}
module "vpc_staging" {
source = "./modules/vpc"
name = "staging"
cidr = "10.1.0.0/16"
}
公司里通常有内部模块库——团队约定怎么建标准 VPC、标准 RDS。
多环境:workspace 还是目录
两种做法(社区争论了好多年):
| 做法 | 优点 | 缺点 |
|---|---|---|
| workspace(一个目录多 state) | 简单 | 各环境差异大时配置乱 |
| 目录分隔(envs/dev、envs/prod) | 隔离强、清晰 | 重复代码多,靠模块解决 |
经验法则:生产建议目录分隔 + 模块复用。workspace 适合"几乎一样的环境"。
drift 检测
定期跑 terraform plan——如果什么都没改但有 diff,说明有人手改了云资源。CI 里跑这个并发告警。
CI/CD 里跑 Terraform
terraform plan 在 PR 阶段跑(自动评论 diff);merge 后由人或机器人 apply。
社区方案:
- Atlantis:自托管的 PR 自动化
- Terraform Cloud / HCP Terraform:HashiCorp 官方
- Spacelift / Env0:商业平台
关于 OpenTofu
2023 年 Terraform 改 License 后,社区 fork 出 OpenTofu(Linux Foundation 旗下)。语法 100% 兼容,开源。新项目可以直接选它。
推荐阅读
- Terraform 官方文档 — 总能在这里找到答案
- HashiCorp Learn — 官方分级教程
- OpenTofu — 开源版状态
- Terraform: Up & Running — Brikman 的书
- Atlantis — 自托管 PR 自动化
下一篇:Ansible——Terraform 创建机器,Ansible 配置内部。