DevOps 入门系列 :IaC 与 Terraform 概念篇
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.tf、variables.tf、outputs.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 六大核心概念,实现了云基础设施的代码化管理,彻底解决了传统手动部署效率低、易出错、无版本、不可复刻的痛点,是云原生、自动化运维的核心基础能力。
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐



所有评论(0)