Terraform 状态管理是什么
状态文件记录资源映射:必须放远程后端(带锁与版本化),视为敏感数据(可能含明文属性),做好加密与访问控制。同一环境只允许一个状态,避免多人各自 apply 互相覆盖。状态丢失或损坏等于资源失联,恢复演练要提前做。
基本信息
| 后端 | S3+DynamoDB 锁、GCS、Azure Storage、Terraform Cloud 等 |
|---|---|
| 敏感 | state 可能包含资源属性明文:访问控制与加密与密钥同级 |
| 团队 | 同一环境同一状态:避免多人各自 apply 覆盖 |
| 锁 | 并发操作靠锁串行化,锁表或内置锁机制 |
| 版本化 | 后端开启版本保留,误删可回退 |
典型使用场景
- 团队协作:共享远程状态配合锁,串行变更
- CI 执行:流水线以只读凭据 plan、受控凭据 apply
- 环境隔离:按环境拆分状态文件,缩小影响面
- 敏感防护:状态桶单独加密与最小访问
- 恢复演练:从版本历史找回误删状态的场景要演练
实践要点
- 状态入桶不进 git:迁移后清理历史里的旧状态
- 锁表配套:S3 后端配 DynamoDB 锁防护并发
- 模块拆分:按生命周期与团队边界拆分状态
- 变更审查:plan 输出进评审,apply 权限收紧
- 导入谨慎:已有资源 import 前先核对状态
- 环境分隔:用 workspace 或独立目录区分环境,各有各的状态
- 重构谨慎:state mv/rm 操作前先备份状态
后端配置片段
后端配置片段
terraform {
backend "s3" {
bucket = "tfstate-prod"
key = "network/terraform.tfstate"
region = "cn-north-1"
dynamodb_table = "tf-locks"
encrypt = true
}
}四道防线
| 维度 | 做法 | 理由 |
|---|---|---|
| 存放 | 远程后端 | 团队共享与锁 |
| 加密 | 服务端加密 | 状态含敏感值 |
| 锁 | 锁表或内置锁 | 防并发覆盖 |
| 版本 | 开启版本化 | 误操作可恢复 |
状态丢失或损坏等于资源失联:开启版本化并定期演练恢复。
把 state 当密钥对待:读权限同样要最小化,明文属性可能含连接串。
状态重构用命令而非手改:terraform state mv 与 rm 有校验,手工编辑结构极易损坏。