4. Terraform 工作流基础:init、plan、apply、destroy 的标准流程,以及其在服务目录中的执行上下文

Terraform 的核心工作流由四个标准生命周期命令构成:init、plan、apply、destroy。在服务目录场景中,这些命令的执行上下文从本地 CLI 迁移到了自动化平台,其执行顺序、状态锁定、变量注入以及错误处理都需要重新设计。本章将拆解每个阶段的标准职责,并说明它们在服务目录中的适配差异。

4.1 标准工作流四阶段

下表总结了每个阶段的核心目标、产物以及典型耗时,帮助你在服务目录中预估执行窗口:

阶段 核心目标 关键产物 典型耗时(参考)
init 初始化工作目录,下载 Provider 插件与 Module .terraform/ 目录、.terraform.lock.hcl 5–30 秒(依赖网络)
plan 对比当前状态与期望配置,生成执行计划 Plan 文件(二进制或 JSON) 10–60 秒(依赖资源数量)
apply 执行计划中的变更,创建/更新/删除资源 更新后的 State 文件 30 秒–数分钟
destroy 销毁所有由当前配置管理的资源 清空的 State 文件 30 秒–数分钟

4.2 各阶段详细职责与避坑

4.2.1 init:环境准备与依赖锁定

terraform init 是工作流的起点。在服务目录中,每次执行前必须确保工作目录干净且依赖版本锁定。

  • Provider 安装:根据 required_providers 下载对应版本,优先使用本地镜像或私有源以加速。
  • Module 获取:从 Git、Terraform Registry 或 S3/GCS 拉取子模块。
  • 后端初始化:配置 State 存储后端(如 S3 + DynamoDB),创建 State 锁表。
  • 锁文件:生成 .terraform.lock.hcl,确保团队使用一致的 Provider 版本。
服务目录优化点: 将 terraform init 的结果缓存到工作空间级别的共享卷,避免每次请求都重复下载 Provider。仅在 .terraform.lock.hcl 变更时重新 init。

4.2.2 plan:差异分析与安全预览

terraform plan 生成一个不可变的执行计划。在服务目录中,plan 阶段是审批门禁的核心环节。

  • 刷新状态:从后端读取最新 State,并与真实云资源对比。
  • 计算变更:输出 +(创建)、~(更新)、-(销毁)三种操作。
  • Plan 文件:使用 -out=plan.tfplan 保存二进制计划,确保 apply 阶段执行完全相同的变更。
  • JSON 输出:terraform show -json plan.tfplan 用于集成到审批系统。
常见陷阱: 不要在 plan 阶段使用 -refresh=false 跳过状态刷新,否则 apply 时可能因资源已手动修改而失败。服务目录应强制 plan 时刷新状态。

4.2.3 apply:变更执行与状态持久化

terraform apply 执行 plan 文件中的变更。在自动化环境中,apply 必须幂等且可回滚。

  • 状态锁定:通过后端锁(如 DynamoDB)防止并发 apply。
  • 逐资源执行:按依赖图顺序创建/更新/删除,支持 -parallelism=N 控制并发度。
  • State 写入:每次成功变更后立即写入后端,失败时保持部分写入状态。
  • 输出提取:通过 output 块暴露关键信息(如 IP、ARN),供下游系统消费。

4.2.4 destroy:资源回收与状态清理

terraform destroy 本质上是 terraform apply 的一个特殊计划,它销毁所有由配置管理的资源。在服务目录中,destroy 通常对应服务实例的删除操作。

  • 保护机制:使用 prevent_destroy 或 lifecycle 块保护关键资源(如数据库)。
  • 依赖顺序:按依赖图反向顺序销毁,先删除子资源再删除父资源。
  • State 清理:销毁完成后,State 文件变为空,但后端仍保留文件用于审计。

4.3 服务目录中的执行上下文差异

在服务目录中,Terraform 工作流不再是开发者的本地操作,而是由平台引擎驱动的自动化流水线。下表对比了标准工作流与服务目录执行上下文的关键差异:

维度 标准工作流(本地 CLI) 服务目录执行上下文
触发方式 手动输入命令 API 请求 / Webhook / 事件驱动
工作目录 本地 Git 仓库 临时容器 / 隔离沙箱 / 共享工作空间
变量注入 .tfvars 文件或环境变量 从服务目录表单动态生成 terraform.tfvars.json
状态管理 本地 terraform.tfstate 远程后端(S3 + DynamoDB / Terraform Cloud)
审批流程 无(直接 apply) Plan → 人工审批 → Apply 两阶段
并发控制 无(单用户) 状态锁 + 队列机制防止冲突
日志与审计 终端输出 结构化日志 + 持久化存储 + 审计追踪

4.4 服务目录工作流执行流程(SVG)

下图展示了服务目录中一次完整的 Terraform 工作流执行流程,从用户提交请求到资源交付完成:

服务目录 Terraform 工作流执行流程 服务目录 Terraform 工作流执行流程 用户提交请求 参数校验与变量注入 terraform init terraform plan 人工审批 terraform apply 说明: • 每个阶段都有超时与重试机制 • 状态锁在 init 后自动获取 • 审批通过后自动触发 apply

4.5 服务目录执行上下文架构(SVG)

下图展示了服务目录引擎如何组织 Terraform 的执行上下文,包括工作空间隔离、状态后端以及变量注入层:

服务目录执行上下文架构 服务目录执行上下文架构 服务目录引擎 请求路由与队列 变量表单解析 审批门禁 日志与审计 执行沙箱 临时工作目录 terraform init / plan / apply 环境变量注入 输出解析 后端服务 S3 State 存储 DynamoDB 状态锁 Provider 缓存 审计日志 变量/审批 State/锁

4.6 服务目录中的工作流最佳实践

  1. 始终使用远程状态后端:避免本地 State 文件丢失或冲突,推荐 S3 + DynamoDB 或 Terraform Cloud。
  2. Plan 与 Apply 分离:在服务目录中强制两阶段执行,plan 输出供人工审批,apply 使用 plan 文件保证一致性。
  3. 变量注入标准化:所有用户输入通过 terraform.tfvars.json 注入,避免使用 -var 命令行参数导致的安全风险。
  4. 超时与重试:为每个阶段设置超时(如 init 60s、plan 120s、apply 300s),并实现指数退避重试。
  5. 并发控制:使用状态锁 + 队列机制,确保同一工作空间不会同时执行两个 apply。
  6. 审计日志:记录每个阶段的开始时间、结束时间、执行用户、变更摘要,便于事后追溯。
关键指标: 优化后的服务目录工作流应达到以下目标:
• 平均 init 耗时 < 10 秒(含缓存命中)
• 平均 plan 耗时 < 30 秒(100 资源以内)
• 平均 apply 耗时 < 60 秒(100 资源以内)
• 并发冲突率 < 0.1%