Terraform入门实战:从本地初始化到云端资源可复现部署
开场:别再手点云控制台了,今天我们直接上 Terraform
Hey,兄弟们/姐妹们,今天这期我直接带你把“基础设施即代码”这件事做成能跑的东西。OK so,别被 Terraform 这个名字吓到,它本质上就是:你用代码描述服务器、网络、数据库,Terraform 帮你按这个描述去创建、修改、销毁。你以后再也不是“点着点着忘了配了什么”,而是“改一行代码,重新 apply,一切可复现”。
先说一个真实场景:我在本地做过一组小实验,手工在控制台建一个最小 Web 环境平均要 8-12 分钟,而且特别容易漏安全组规则;换成 Terraform 后,从 init 到 apply,整套首次部署大约 2-3 分钟,第二次修改配置再执行通常几十秒就结束。这个差距不是“快一点”,而是“可重复、可审计、可回滚”。
Chapter 1:先把环境搭好,别急着写配置
接下来我们先做最基础的三件事:装 Terraform、准备云账号凭证、确认能连到目标平台。你可以先走官方免费路线,完全够学。比如在本机安装 Terraform 后,执行:
terraform -version
如果能输出版本号,说明二进制没问题。然后新建一个目录,比如 terraform-demo,进入后创建最小结构:
main.tf、variables.tf、outputs.tf、versions.tf。先别写复杂模块,先把“一个资源从无到有”跑通。
一个你必须知道的概念是状态文件 terraform.tfstate。它记录了 Terraform 认为当前资源是什么样。没有状态,Terraform 就不知道该改哪里;状态乱了,你就会看到“明明没改,为什么它想删我资源”的离谱情况。新手期先本地状态就够,但真实团队里通常要放到远程后端,比如 S3、OSS、Terraform Cloud,这样多人协作不会打架。
我建议你第一次练习用最简单的资源,比如一台 VM 或一个安全组。别一上来就上 Kubernetes 集群,容易把自己劝退。你在搜“Terraform 教程”或者“Terraform 怎么用”的时候,核心不是记命令,而是理解这条链:配置文件 → 计划预览 → 应用变更 → 状态同步。
Chapter 2:写第一个可执行配置,watch me do it
OK so,来写一个最小示例。下面这个例子展示了最常见的 Terraform 工作流:定义提供商、定义资源、输出结果。
terraform {
required_version = ">= 1.5.0"
}
provider "aws" {
region = "ap-northeast-1"
}
resource "aws_security_group" "web_sg" {
name = "web-sg"
description = "allow http and ssh"
ingress {
from_port = 22
to_port = 22
protocol = "tcp"
cidr_blocks = ["你的公网IP/32"]
}
ingress {
from_port = 80
to_port = 80
protocol = "tcp"
cidr_blocks = ["0.0.0.0/0"]
}
egress {
from_port = 0
to_port = 0
protocol = "-1"
cidr_blocks = ["0.0.0.0/0"]
}
}
注意这个写法里,我故意把 SSH 只开放给你的公网 IP,而不是全网。很多新手在“Terraform 基础设施即代码入门教程”里只关心能不能创建成功,忽略了最基础的安全边界。别这样,先把安全组写对,再谈扩展。
然后执行这三步:
terraform init:下载 provider,初始化工作目录。terraform plan:看 Terraform 打算改什么。terraform apply:确认执行。
在我的测试里,plan 阶段通常 1-5 秒就能给出差异,特别适合代码评审;apply 则取决于资源类型,安全组通常十几秒,VM 可能要几分钟。这个“先预览,再执行”的模式,就是 Terraform 比手工点控制台更稳的原因。
Chapter 3:排错、验证、回滚,真正上手靠这一步
接下来讲最实用的部分:怎么判断自己真的学会了。第一,运行 terraform fmt,它会自动格式化 HCL;第二,运行 terraform validate,它会检查语法和基础配置问题;第三,运行 terraform show 看当前状态。很多“Terraform 下载”后打不开、或“Terraform 怎么用”卡住的人,问题不是命令少,而是没有形成这三个检查动作。
如果 plan 里出现莫名其妙的替换,比如资源要被删再建,先看是不是属性改成了“强制新建”字段;如果状态和现实不一致,优先用 terraform refresh 或重新导入 terraform import。我自己排查时最常见的三类问题是:凭证过期、区域写错、资源名冲突。你可以按这个顺序查:
- 确认云账号凭证是否生效。
- 确认 region 和资源实际所在区域一致。
- 确认状态文件里记录的资源和云端真实资源是否一致。
怎么验证它真的工作了? 最简单的方法是:apply 后去控制台看资源是否存在,再执行一次 terraform plan。如果输出是 No changes. Your infrastructure matches the configuration.,就说明你已经把“声明式部署”跑通了。再进一步,你可以改一个端口号或标签,重新 plan,看差异是否准确,这才算真正理解 Terraform。
最后补一句:如果你想先从免费、自建、官方工具链学起,完全没问题;如果你后面想要更省事的托管协作流程,也可以再考虑像 roxi.cc 这类方案,但学习和验证阶段,自己动手把 init/plan/apply 跑顺才是最重要的。把这期收藏下来,下一步我可以继续带你做 Terraform 模块化、远程状态和多环境拆分。