Terraform vs 手动操作:效率对比实测

devops进阶6 分钟阅读2026/10/11

Terraform vs 手动操作:效率对比实测

我为什么做这个测试

去年我们的测试环境出了个事故:一个同事在控制台上手动改了安全组规则,另一个同事第二天又手动改了回去,因为没人知道第一处改动是谁做的、为什么做。那次排查花了整整一下午。

我当时就在想:如果这些操作都是代码化的,这种事根本不会发生。但“基础设施即代码”的效率到底怎么样?控制台点几下就能干完的事,写 Terraform 会不会反而更慢?光靠感觉争论没意义,我决定做个实测。

测试设计

我选了一个我们团队最常见的场景:搭建一套完整的 Web 测试环境,包括:

  • 1 个 VPC + 子网
  • 1 个安全组(开放 80/443/22 端口)
  • 2 台 EC2 实例
  • 1 个负载均衡器
  • 1 条 Route53 DNS 记录

我用秒表记录两个流程的纯操作时间,不包括等待资源创建的时间(云厂商的等待时间两边都一样)。测试环境用的是 AWS,Terraform 版本 1.6。

第一轮:手动操作

我平时自认为控制台操作很熟练,但真计时起来还是被吓到了:

  • VPC 向导:4 分钟(向导页面加载慢,还要确认网段不冲突)
  • 安全组:6 分钟(加了 3 条规则,每条都要选协议、端口、来源,改错了 1 次又删了重加)
  • EC2 × 2:12 分钟(选 AMI 花了时间,还得手动给第二台复制第一台的配置,标签也要一个个敲)
  • ALB:9 分钟(要选目标组、配置健康检查,页面上来回跳转)
  • Route53:2 分钟

总计:33 分钟纯操作时间,而且中途被打断过两次——这正是手动操作的真实痛点:你不可能一口气点完 30 分钟的页面。

第二轮:Terraform

先写代码。对第一次写这套东西的人来说,查文档和试错花了大约 2 小时。但关键在于:我写完之后,又跑了两遍。

resource "aws_security_group" "web" {
  name   = "web-sg"
  vpc_id = aws_vpc.main.id

  ingress {
    from_port   = 443
    to_port     = 443
    protocol    = "tcp"
    cidr_blocks = ["0.0.0.0/0"]
  }

  ingress {
    from_port   = 22
    to_port     = 22
    protocol    = "tcp"
    cidr_blocks = ["10.0.0.0/8"]  # 只允许内网 SSH
  }

  tags = { Name = "web-sg", Env = "test" }
}

第二遍和第三遍的流程是:

terraform init      # 40 秒(首次会慢,之后有缓存)
terraform plan      # 15 秒
terraform apply     # 确认后执行,操作时间 1 分钟

第二、三遍的纯操作时间:约 1.5 分钟。

那个让我惊喜的瞬间

测试没到此为止。我加了一个变更场景:给两台 EC2 换实例类型,从 t3.medium 换成 t3.large。

  • 手动:先停机、改类型、再启动,两台机器来回切换,9 分钟,中间还忘了给第二台改。
  • Terraform:改一行 instance_type = "t3.large",terraform plan 明确告诉我"2 to change",apply 确认,2 分钟。

而 plan 输出的这个差异预览,是手动操作完全给不了的东西:

~ resource "aws_instance" "web" {
      ~ instance_type = "t3.medium" -> "t3.large"

我踩过的坑

  1. state 文件管理。第一次我把 terraform.tfstate 留在本地,同事的电脑上又跑了一遍 apply,直接状态错乱。必须一开始就配远程后端:
terraform {
  backend "s3" {
    bucket         = "my-tfstate"
    key            = "test-env/terraform.tfstate"
    dynamodb_table = "tf-locks"
  }
}
  1. 手动改动会导致漂移。Terraform 管起来之后,有人在控制台偷偷改了安全组,下次 apply 会把它改回去。这其实是好事,但要提前跟团队约定:控制台只读,改动一律走代码。

  2. import 历史资源很痛苦。我们把存量资源导入 Terraform 时,import 块写漏了字段,plan 里出现大量"will be destroyed",差点酿成事故。现在我的习惯是:import 之后先看 plan,确认显示的全是更新而不是删除,才敢 apply。

效率结论

场景 手动 Terraform
首次搭建 33 分钟 2 小时(含学习)
重复搭建第 N 遍 33 分钟 1.5 分钟
小变更(改实例类型) 9 分钟 2 分钟
删除整套环境 20+ 分钟,容易漏 terraform destroy,1 分钟
新人接手 依赖口口相传 读代码即可

转折点在“第二次”。 如果你的环境只搭一次、再也不动,手动确实更快。但真实项目里环境会被反复搭建:测试、预发、多区域、灾备演练。Terraform 的一次投入换来了近乎零成本的复制。

实用建议

  1. 从安全组和标签这类低风险资源开始,别一上来就管数据库。
  2. 强制使用远程 state + 锁,s3 + dynamodb 是 AWS 上的标准组合。
  3. 在 CI 里跑 terraform plan,让每次变更都有记录可查——这直接解决了开头那个事故。
  4. plan 输出必须人工审阅,看到 destroy 字样先停下来想清楚。

诚实的局限

Terraform 不是银弹。学习曲线是真的:state 机制、模块组织、版本兼容性,新手至少要一两周才能安心使用。有些冷门服务 provider 支持滞后,还得靠控制台兜底。另外 plan/apply 的执行速度也不快,大规模变更时等待时间不短。

但哪怕只算“环境可重建、变更有记录、新人可接手”这三条,对任何超过两个人的团队来说,Terraform 都值得投入。我现在的判断标准很简单:这个资源坏了能不能 10 分钟内重建?不能的话,就该把它写进代码。

相关 Agent

D

Docker

Docker 是一个容器化平台,允许开发者将应用及其依赖项打包成轻量级、可移植的容器。它简化了跨环境的开发、测试和部署过程。该描述强调它最适合容器化和开发环境,提供免费方案和团队方案,团队方案从每用户每月5美元起。

了解更多 →