← 中文资源

简体中文版本

基础设施即代码重构工作流

用与代码同等的纪律重构 IaC:行为保持的分步、以 plan diff 为测试套件、分阶段 apply 带回滚。

阅读英文原文

目标

不改部署行为地重构基础设施代码是可能的,plan diff 就是证明它的测试套件。每抽一个模块、每参数化一个魔法值,都重跑 plan 对照基线:任何新增动作要么是重构引入的 bug,要么是被结构掩盖的死代码——后者删除即收益。

步骤要点

  1. 捕获行为基线:对当前状态跑 plan 并保存,空 diff 或仅已知差异就是重构必须保持的不变量。
  2. 行为保持的分步重构:一次只做一步——抽模块、参数化魔法值、拆文件——每步之后重跑 plan。
  3. 把 plan diff 当测试评审:超出基线的任何差异都算测试失败——重构改了行为就回退,暴露了死代码就刻意删除。
  4. 先沙箱后生产应用:重构后的代码先 apply 到沙箱捕捉 plan 看不到的运行时差异,再以同一份评审过的 plan 上生产。
  5. 结构存入下个变更:模块已抽出、参数已命名,下一次基础设施变更就是干净代码上的小 diff。

排错提示

每步 plan 都冒新动作说明重构混入了行为变更,立刻回退该步;plan 出现意外的 destroy 多半是死代码现形,核实后刻意删除并留档;重构完不做沙箱 apply 就上生产,运行时差异会替你发现结构问题。

适用边界

plan 等价保证声明态不变,运行时行为(Terraform provider 副作用)仍需沙箱验证;大型迁移式重构(换框架)不适用此不变量,需专门的迁移计划。

代码示例

baseline plan (saved): no changes
  (state matches code exactly)

step 1: extract compute module
  plan: identical to baseline      OK
step 2: parameterize the magic 443->var.https_port
  plan: identical                 OK
step 3: split env files (staging/prod)
  plan: identical                 OK
step 4: remove unused security group
  plan: DIFFERS -- destroy sg-044
    -> dead code since 2024 (verified)
    -> deliberate deletion, documented

sandbox apply: state identical to pre-refactor
next change (add region): 34-line diff
  (was: 180-line copy-paste edit)