IaC 与 Terraform 核心概念 —— 用代码管理你的云资源

阅读说明:本文无真实资源创建命令执行输出,仅讲解核心概念、底层原理与典型代码示例。

1. 传统云资源部署的弊端

假设需要部署一套业务应用,需提前准备以下云基础设施资源:

  • ECS 云服务器

  • VPC 虚拟私有网络 + 子网

  • 安全组(防火墙访问规则)

  • RDS 数据库实例

传统控制台操作模式:登录云厂商后台,手动点击页面、填写表单、选择参数完成资源创建。

这种模式存在极大弊端:首次部署耗时久,重复搭建测试、预发、生产等多套环境需要全程重复操作,效率极低;同时人工操作极易出现疏漏,比如遗漏安全组规则、参数配置不一致等问题。

最核心的问题:手动配置无版本记录、无标准化文档。除操作人员外,团队其他人无法知晓资源配置参数,环境重建、故障复盘只能依靠人工记忆和零散截图,不可追溯、不可复刻。

2. 什么是 IaC(基础设施即代码)

IaC(Infrastructure as Code,基础设施即代码):通过代码而非手动控制台操作,描述、定义和管理服务器、网络、数据库、负载均衡等所有基础设施资源。

核心特性

  • 声明式定义:编写配置文件描述「基础设施最终状态」,工具自动比对、完成资源创建与调整,无需关注执行细节。

  • 版本化管理:配置代码可托管至 Git,支持版本追溯、一键回滚、多人协作迭代。

  • 全自动化:单条命令即可完成整套环境的创建、修改、销毁,彻底告别手动点点点。

主流 IaC 工具对比

  • Terraform:开源通用、支持多云平台,主流 IaC 工具

  • AWS CloudFormation:AWS 专属 IaC 工具,仅适配亚马逊云平台

  • Pulumi:支持 Python、Go 等主流编程语言编写基础设施配置

  • Ansible:偏向服务器配置管理,可辅助实现 IaC 能力

3. Terraform 核心介绍

Terraform 是 HashiCorp 公司开发的开源 IaC 工具,适配阿里云、AWS、腾讯云、华为云、GCP、Azure 等几乎所有主流公有云,同时支持 Kubernetes、GitHub、Datadog 等 2000+ 第三方服务。

核心核心特点

  • 多云统一管理:一套语法、一套工具,管控多平台云资源,屏蔽云厂商 API 差异。

  • 声明式编程:只需定义资源最终状态,Terraform 自动计算资源差异、执行增删改操作。

  • 自动依赖处理:智能识别资源依赖关系,自动按顺序创建资源(如先建 VPC、再建 ECS)。

  • 精准状态管理:实时记录托管资源的真实状态,区分工具托管资源和手动修改资源。

Terraform 可以用代码标准化搭建、修改、销毁云基础设施,全程可追溯、可复用、可自动化。

4. Terraform 核心概念

4.1 Provider(资源提供者)

定义:Terraform 与云平台、第三方服务 API 之间的「翻译官」,不同云平台对应专属 Provider。

作用:屏蔽各云厂商 API 的语法和逻辑差异,让开发者通过统一的 HCL 语法,管理所有平台的资源。

概念代码示例
terraform {
  required_providers {
    alicloud = {
      source = "aliyun/alicloud"
      version = "~> 1.200"
    }
  }
}

provider "alicloud" {
  region = "cn-hangzhou"
}

代码释义:指定使用阿里云 Provider,锁定 1.200.x 版本,默认资源部署区域为杭州。

注意
  • Provider 不会自动下载,需执行 terraform init 初始化拉取插件。

  • 支持多 Provider 共存,可同时管理阿里云、AWS、Kubernetes 等多平台资源。

4.2 Resource(资源)

定义:Terraform 最核心的语法单元,对应云平台中每一个具体基础设施对象(ECS、VPC、安全组、RDS、DNS 等)。

作用:将「所需基础设施规格、配置」转化为标准化代码,实现资源代码化定义。

概念代码示例
resource "alicloud_instance" "web" {
  instance_name   = "my-web-server"
  instance_type   = "ecs.g6.large"
  image_id        = "ubuntu_20_04_x64_20G_alibase_20220620.vhd"
  vswitch_id      = alicloud_vswitch.main.id
  security_groups = [alicloud_security_group.default.id]
}

代码释义:定义一台阿里云 ECS 服务器,自动引用交换机、安全组资源 ID,Terraform 自动识别依赖、按序创建资源。

  • Resource 标准格式:resource "资源类型" "本地自定义名称" {}

  • 资源引用语法:资源类型.本地名称.属性(如 .id 资源唯一ID)

  • 删除代码中的 resource 配置,执行 apply 后会自动销毁对应云资源(配置 prevent_destroy 可禁止销毁)

4.3 State(状态文件)

定义:Terraform 核心机制,执行 terraform apply 后自动生成 terraform.tfstate 文件,以 JSON 格式记录所有托管资源的真实 ID、配置属性、依赖关系。

作用:让 Terraform 知晓「当前已托管资源状态」,通过对比「代码期望状态」和「实际云资源状态」,精准计算需要增、删、改的资源,是 Terraform 实现差异化部署的核心。

重要特性与规范
  • State 文件为明文 JSON,包含数据库密码、AK/SK 等敏感信息,必须加密存储。

  • 严禁手动修改 State 文件,会导致 Terraform 状态错乱、资源管理异常。

  • 使用远程状态存储,杜绝本地状态文件协作。

注意
  • State 文件丢失:Terraform 无法关联原有托管资源,易引发资源重复创建、配置冲突。

  • 远程状态优势:支持团队协作、状态加密、并发锁定,避免多人操作冲突。

  • 状态查看命令:terraform show

4.4 Variable(变量)

定义:将配置中高频变动的参数(环境名称、实例规格、部署区域等)抽离为独立变量,实现配置复用。

作用:一套基础代码适配多套环境(开发/测试/预发/生产),仅通过修改变量区分环境配置,无需重复编写代码。

概念代码示例
variable "instance_type" {
  description = "ECS instance type"
  type        = string
  default     = "ecs.g6.large"
}

resource "alicloud_instance" "web" {
  instance_type = var.instance_type
  # 其他资源配置省略
}

变量覆盖方式:terraform apply -var="instance_type=ecs.g6.4xlarge"

  • 基础变量类型:string、number、bool、list、map

  • 变量优先级(从低到高):默认值 → tfvars 文件 → 命令行 -var → 环境变量 TF_VAR_xxx

  • 敏感变量可配置 sensitive = true,隐藏日志明文输出

4.5 Output(输出)

定义:资源部署完成后,自定义输出关键资源信息的配置块。

核心作用:自动展示 ECS 公网 IP、RDS 连接地址、集群地址等关键信息,无需登录云控制台查询,同时支持被 CI/CD 脚本、其他 Terraform 模块调用。

概念代码示例
output "ecs_public_ip" {
  value = alicloud_instance.web.public_ip
}

查看输出结果命令:terraform output

  • 支持根模块输出子模块的资源属性值

  • 敏感输出可配置 sensitive = true,禁止日志明文展示

4.6 Module(模块)

定义:多个关联资源的封装集合,将一套标准化资源组合打包为独立模块,类似代码中的「函数」。

作用:避免重复编写重复配置,实现基础设施配置的标准化、复用化,大幅提升生产环境部署效率。

说明
  • 官方模块:Terraform Registry 提供大量现成开源模块(如 VPC 专用模块),开箱即用。

  • 自定义模块:新建独立目录,包含 main.tfvariables.tfoutputs.tf 即可完成模块封装。

  • 模块三大来源:本地路径、Git 仓库、Terraform Registry

  • 通过 source + version 锁定模块来源和版本,保证环境一致性

  • 模块是生产环境标准化复用配置的核心方案

5. Terraform 标准工作流(四大核心命令)

Terraform 核心操作仅四条命令,对应部署全流程,适配所有场景。

命令 核心作用 生活化类比
terraform init 初始化项目:下载 Provider 插件、配置后端、初始化模块 施工队进场,领取图纸、工具、物料
terraform plan 预览变更:展示即将创建/修改/删除的资源,无实际操作、无费用 施工前核对效果图与施工清单
terraform apply 执行部署:按配置完成资源增删改,落地最终状态 正式开工施工,搭建基础设施
terraform destroy 销毁资源:清空当前代码托管的所有云资源 拆除建筑,恢复空地,避免闲置扣费

标准执行流程

编写 .tf 配置文件 → terraform init(新项目仅一次)→ terraform plan 核对变更 → terraform apply 部署 → 按需执行 terraform destroy 清理资源

重点规范:任何部署变更,必须先 plan 预览,确认无误后再 apply,规避误操作风险。

6. 状态文件解析

6.1 本地状态 vs 远程状态

对比维度 本地状态 远程状态
存储位置 项目本地目录 terraform.tfstate OSS、S3、Consul 等远程存储
团队协作 不支持,多人操作易冲突 支持状态锁定,同一时间仅一人操作
安全性 明文存储,敏感信息易泄露 支持服务端加密、精细化权限管控
适用场景 个人学习、本地临时测试 生产环境、团队协同项目
远程状态配置示例
terraform {
  backend "oss" {
    bucket  = "my-terraform-state"
    key     = "prod/terraform.tfstate"
    region  = "cn-hangzhou"
  }
}

6.2 状态锁定机制

团队协作、CI/CD 自动化部署场景中,多人同时执行 apply 会导致状态文件错乱、资源冲突。远程状态后端支持状态锁定,任意用户/流程执行部署时会抢占锁,操作完成后自动释放,其余操作需等待锁释放,保障部署安全性。

6.3 状态文件安全最佳实践

  • 生产环境强制使用远程状态,并开启存储服务端加密

  • 禁止在配置中写入明文密码、密钥,对接云厂商 KMS 密钥管理服务

  • 严格限制远程状态存储的访问权限,仅授权 CI 角色、核心运维人员操作

7. Terraform 与 Kubernetes 的分工关系

已有 K8s 容器编排,是否还需要 Terraform?答案:需要,二者分工完全不同,互补不冲突。

工具 管理对象 核心任务
Terraform 底层基础设施(云资源) 创建 ACK/EKS 集群、VPC、SLB、RDS、OSS 等集群依赖云资源
kubectl / Helm 集群内部应用资源 在已有 K8s 集群中部署 Deployment、Service、Ingress 等应用资源

8. 完整概念示例串联

需求:基于阿里云代码创建一台 ECS 服务器,自动输出公网 IP(仅概念演示,无需执行)

步骤1:编写 main.tf 完整配置

terraform {
  required_providers {
    alicloud = {
      source = "aliyun/alicloud"
    }
  }
}

provider "alicloud" {
  region = "cn-hangzhou"
}

resource "alicloud_instance" "web" {
  instance_name   = "terraform-demo"
  instance_type   = "ecs.g6.large"
  image_id        = "ubuntu_20_04_x64"
  vswitch_id      = "vsw-xxxxx"   # 可替换为已有交换机资源ID
  security_groups = ["sg-xxxxx"]
}

output "ecs_ip" {
  value = alicloud_instance.web.public_ip
}

步骤2:标准命令流程(概念)

terraform init                 # 初始化,下载阿里云 Provider
terraform plan                 # 预览资源变更,核对配置
terraform apply -auto-approve  # 执行部署,创建ECS并输出公网IP
terraform destroy              # 测试完成后销毁资源,避免扣费

9. 总结

IaC 基础设施即代码的核心价值是标准化、可追溯、可复用、可自动化。而 Terraform 作为多云统一 IaC 工具,通过 Provider、Resource、State、Variable、Output、Module 六大核心概念,实现了云基础设施的代码化管理,彻底解决了传统手动部署效率低、易出错、无版本、不可复刻的痛点,是云原生、自动化运维的核心基础能力。

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐