🏗️ Terraform 代码,谁来编写? — 终结基础设施团队与开发团队的争论

“我们团队来写不就行了吗?”

— 这一句话会耗费组织三个月的时间。

>

🎯 本文涵盖内容

  • Terraform 代码所有权争议产生的真正原因
  • 基础设施团队负责的优点与局限性
  • 开发团队(包括 DevOps)负责的优点与局限性
  • 实际场景中通用的3种模型
  • 按组织规模划分的最佳结构建议

📌 引入 / 背景

随着云采用的加速,Terraform 在某个时刻从“基础设施团队的专属物”变成了“每个人都需要触及的共享资源”。

问题就从这里开始。

“我提交了一个创建 ECS 集群的工单,结果花了2周时间。”

“开发团队直接编写的 Terraform 代码删除了生产 VPC。”

这两个故事都是真实发生的。前者是基础设施团队成为瓶颈的情况,后者是由于没有所有权,任何人都可以随意操作而导致的惨剧。

Terraform 代码的所有权问题不仅仅是“谁来编写代码”的问题。这是一个涉及组织结构、责任归属、变更速度三者交织的复杂问题。


🔍 首先,区分 Terraform 处理的领域

Terraform 代码大致可以分为两个层面。

层面1 — 平台基础设施 (Foundation Layer)

  • VPC、子网、路由、TGW
  • IAM 策略、安全组基本模板
  • EKS/ECS 集群本身
  • S3 存储桶策略、KMS 密钥
  • DNS (Route 53 托管区域)

这个领域变更频率低,一旦误操作可能导致全公司范围的故障。需要谨慎对待。

层面2 — 应用基础设施 (App Layer)

  • ECS 服务、任务定义
  • Lambda 函数、API Gateway
  • RDS 实例(应用专用)
  • CloudFront 分发设置
  • 环境变量、服务专用 S3 存储桶

这个领域变更频率高,与部署周期直接相关。速度至关重要。

当同一个团队试图以相同的方式管理这两个层面时,就会发生冲突。


⚙️ 模型1 — 基础设施团队集中所有 (Centralized)

基础设施团队(或 SRE 团队)拥有并管理所有 Terraform 代码的方式。

优点

  • 易于标准化:命名约定、标签策略、模块结构保持一致
  • 安全控制:谁创建什么都必须经过审查
  • 专业性集中:Terraform Provider 版本管理、state 文件管理等经验得以积累

缺点

  • 产生瓶颈:开发团队的请求堆积如山,工单队列爆炸
  • 缺乏上下文:基础设施团队在不完全理解应用需求的情况下编写代码
  • 部署速度降低:与敏捷的 CI/CD 流水线冲突

适用组织

  • 金融、公共、医疗等安全和合规要求严格的机构
  • 基础设施变更不频繁的本地部署 + 云混合环境
  • 云迁移初期阶段(尚未建立标准化)

⚙️ 模型2 — 开发团队自主所有 (Decentralized / “You Build It, You Run It”)

每个开发团队(服务团队)直接使用 Terraform 定义其服务所需的基础设施。Netflix、Spotify 等大型科技公司采用了这种模式。

优点

  • 部署速度:提交 PR 即可立即生效,无需等待基础设施团队
  • 上下文一致:最了解应用的团队也决定基础设施
  • 责任明确化:“我编写的基础设施我负责”

缺点

  • 碎片化风险:各团队以不同方式创建资源,导致一致性被破坏
  • 安全事故风险:缺乏 Terraform 知识的开发人员可能创建公共 S3 存储桶
  • state 文件冲突:多个团队操作重叠资源时,状态文件可能混乱

适用组织

  • DevOps 成熟度高的初创公司或科技公司
  • 通过 MSA(微服务)明确划分团队的组织
  • 开发人员熟悉云环境(AWS 认证级别以上)

⚙️ 模型3 — 平台团队 + Golden Path 模型 (Platform Engineering)

这是目前最受关注的模型。核心理念是:基础设施团队构建“平台”,开发团队部署“服务”

核心思想:基础设施团队创建并提供经过验证的 Terraform 模块,开发团队使用这些模块。

# 基础设施团队创建的已验证模块(示例)
module "my_ecs_service" {
  source  = "git::https://github.com/company/terraform-modules//ecs-service?ref=v2.1.0"

  # 开发团队填写的值
  service_name   = "payment-api"
  container_port = 8080
  desired_count  = 2
  cpu            = 512
  memory         = 1024

  # 安全相关内容在模块内部强制执行
  environment = "prod"
  vpc_id      = var.vpc_id
}

开发团队不能更改源模块,只能输入允许的变量。安全组规则、IAM 策略、标签标准已内置于模块中。

优点

  • 同时实现速度和标准化
  • 开发团队无需成为 Terraform 专家
  • 基础设施团队只需专注于模块质量

缺点

  • 模块设计初期成本高
  • 模块过于受限可能导致开发团队不满
  • 需要模块版本管理(必须以 ?ref=v2.1.0 形式进行标记)

适用组织

  • 中大型企业,团队数量在5个以上
  • 单独运营平台工程 (Platform Engineering) 或开发者体验 (DevEx) 团队的机构
  • 计划构建内部开发者门户 (IDP, Internal Developer Portal) 的组织

💡 现实中常见的错误模式

❌ 模式1 — “大家一起用就行了”

没有明确的所有权划分,任何人都可以向 main 分支提交 PR。没有审查标准,state 锁冲突定期发生。这是小型团队中常见并容易固化的模式。

❌ 模式2 — 基础设施团队编写所有代码但没有审查

虽然实现了集中化,但缺乏代码质量管理。多年未动的 Terraform 代码变成了无人敢碰的“遗留 IaC”。

❌ 模式3 — 开发团队编写代码但不与基础设施团队共享

团队独立运营,声称“我们最了解我们的服务基础设施”,结果在安全审计中发现大量未经授权的资源。


✅ 总结 / 结尾

“Terraform 应该由谁来编写”的答案取决于组织的规模和成熟度。

组织情况 推荐模型
云迁移初期,5人以下团队 基础设施团队集中所有
DevOps 成熟,MSA,小型初创公司 开发团队自主所有
团队5个以上,需要标准化 平台团队 + Golden Path 模块
金融/公共等合规性要求高的环境 基础设施团队所有 + 强制审查关卡

最重要的原则是:

平台基础设施(VPC、IAM、集群)由基础设施团队负责,应用层面(服务、函数)由开发团队负责

— 但模块和标准由基础设施团队提供。

所有权明确,才能在发生故障时明确谁来响应。代码的所有权,即是运营的责任。


Comments

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注