首页/开发/CI/CD 与发布速查/Terraform 状态管理
环境与配置管理60 条

Terraform 状态管理

状态文件记录资源映射:必须放远程后端(带锁与版本化),视为敏感数据(可能含明文属性),做好加密与访问控制。

CI/CD 与发布速查开发更新于 2026-10-13

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 有校验,手工编辑结构极易损坏。

易错点

  • 状态文件进 git:连同敏感值进入全员可见范围,迁移到远程后端并清理历史
  • 后端无锁:并发 apply 相互覆盖,启用锁机制
  • 密钥写进变量文件:tfvars 与状态双份泄漏,改用环境注入与密钥服务
  • 多人共用一个状态跑无关变更:计划差异互相干扰,按边界拆分状态
  • 直接手工编辑状态文件:结构损坏后资源失联,改用 state 子命令并先备份

数据来源与参考

  • Terraform 文档《Backend》
  • Terraform 文档《State》
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌