从 Terraform Monorepo 迁移到 Multi-Repo 而不失去理智(和睡眠)

发布: (2025年12月12日 GMT+8 04:55)
3 min read
原文: Dev.to

Source: Dev.to

问题

指标单仓库多仓库
平均计划时间68 分钟1.8 分钟(提升 97 %)
每周失败运行次数270.8(降低 97 %)
PR 合并时间4.2 小时18 分钟(提升 93 %)
最大状态文件1.9 GB38 MB
工程师满意度4.8/109.6/10

单仓库:180 k 行代码,2 800 个资源,状态文件 1.9 GB。
多仓库:每个团队一个仓库。

示例:提取 team‑alpha 状态

terraform state mv -state-out=team-alpha.tfstate \
  module.vpc module.team_alpha_vpc

terraform state mv -state-out=team-alpha.tfstate \
  aws_eks_cluster.alpha null

对所有 42 个团队重复(通过脚本自动化)。

创建新仓库

自动化脚本为每个仓库创建:

  • 正确的 .terraform-version 约束
  • 指向专用 S3 + DynamoDB 表的后端配置
  • README.mdCODEOWNERS 与 pre‑commit 钩子

升级工具链

Terraform 1.5 + Terraform CloudOpenTofu 1.8 + Atlantis 4.0

Atlantis 配置(YAML)

repos:
  - id: /meenanukala/*
    apply_requirements: [approved, mergeable]
    workflow: tofu

workflows:
  tofu:
    plan:
      steps:
        - init
        - plan:
            extra_args: ["-lock-timeout=5m"]
    apply:
      steps:
        - apply

强制质量门

  • 每个 PR 都运行 Infracost + tfsec
  • 阻止提交状态文件的自定义 pre‑commit 钩子
  • 使用 Dependabot 更新提供商
  • 每周自动漂移检测

结果

指标之前之后
平均计划时间68 分钟1.8 分钟
每周失败运行次数270.8
PR 合并时间4.2 小时18 分钟
最大状态文件1.9 GB38 MB
工程师满意度4.8/109.6/10

资源

  • 迁移手册 & 脚本
    • 包含状态拆分脚本(处理嵌套模块)
    • 仓库创建模板
    • Atlantis + OpenTofu 配置
    • 完整迁移手册(PDF)

单仓库在 2018 年还算合理。到 2025 年它们已经成为带利息的技术债务。如果你的 Terraform 计划时间比喝杯咖啡还长,是时候切换了。Fork 上面的仓库并按照手册操作。

— Meena Nukala,资深 DevOps 工程师(英国)

Back to Blog

相关文章

阅读更多 »