状态管理与团队协作 - SRE 的核心关切
状态管理与团队协作 - SRE 的核心关切
深入理解 Terraform 状态
terraform.tfstate
文件是一个 JSON 格式的文件,它是 Terraform 项目的“灵魂”。
-
它是什么? 它是一份详细的映射表,记录了你的
.tf
代码中定义的资源与在云上被实际创建的资源之间的一一对应关系。它存储了每个资源的 ID、属性、以及资源间的依赖关系。 -
为何如此重要?
- 规划变更 (Planning):
terraform plan
命令需要读取这个文件,来了解它当前管理着哪些资源。只有这样,它才能将你的代码(期望状态)与 state 文件(当前状态)进行比较,从而计算出需要创建 (add)、修改 (change) 或删除 (destroy) 的具体资源。没有 state 文件,Terraform 会认为所有资源都需要从头创建。 - 追踪依赖 (Dependency Tracking): Terraform 通过 state 文件来管理资源间的依赖关系,确保它们以正确的顺序被创建和销毁。
- 性能优化: state 文件缓存了资源的属性值,减少了对云厂商 API 的调用次数。
- 规划变更 (Planning):
-
在团队中使用本地状态的风险:
- 没有单一事实来源 (No Single Source of Truth): 每个团队成员的笔记本上都有一份不同的“事实”,这必然导致混乱。
- 状态冲突与覆盖: 张三创建了一个资源,李四不知道,他的一次
apply
可能会意外删除或修改张三的资源。 - 缺乏锁定机制 (No Locking): 如果张三和李四同时对同一套基础设施运行
terraform apply
,他们可能会同时尝试修改同一个 state 文件,这将导致竞争条件 (Race Condition),极有可能损坏 state 文件,后果不堪设想。 - 安全风险: state 文件中可能包含敏感信息(如数据库初始密码),将其保存在个人电脑或(更糟糕地)提交到 Git 中,都是严重的安全隐患。永远不要将
.tfstate
文件提交到 Git!
解决方案:远程状态 (Remote State)
解决方案是将