长期靠控制台手工点资源,早晚会出现"谁也说不清线上到底有什么"的状态。用 Terraform 把基础设施写成代码,可审计、可复制、可回滚,是运维规模化的必经之路。
「Terraform 管理阿里云资源:IaC 落地的几个要点」提醒我们一个朴素的事实:DevOps 与自动化运维靠的不是临场发挥,而是平时的体系化建设。告警是否准确、日志是否齐全、权限是否收敛,决定了故障来临时是从容处置还是手忙脚乱。
状态(state)管理
按环境(dev / prod)拆分 state,state 存放到远端后端(如 OSS + 锁),切勿把 state 明文提交到仓库——里面可能包含敏感信息。
模块化与变量化
把 VPC、ECS、RDS 封装成可复用的 module,规格与数量用变量注入,避免复制粘贴出一堆漂移的配置。
terraform {
required_providers {
alicloud = { source = "aliyun/alicloud" }
}
backend "oss" { bucket = "tf-state" prefix = "prod" }
}
module "web" {
source = "./modules/ecs"
inst_type = var.ecs_type
count = var.web_count
}
plan 先行 + CI 校验
任何 apply 之前先跑 terraform plan 审查变更,接入 CI 做策略校验(如禁止公网开放敏感端口),把风险拦在执行前。
存量资源导入
对已有资源用 import 纳管到 Terraform,而不是推倒重建,保证平滑接管。
小结:IaC 让"环境一致性"成为默认属性,配合评审流程能大幅降低误操作与配置漂移。
协作与安全的几个硬约束
IaC 的收益来自「变更可评审、可回滚、可复现」,而这些收益会被几个坏习惯一次性抵消,所以约束要先立起来。
- 状态文件:放远端并开启锁,避免多人并发覆盖;state 里含有资源明细,绝不提交进代码库。
- 版本固定:provider 与模块都锁版本,升级单独走评审与 plan 验证,避免某天构建突然行为变化。
- 敏感信息:凭据用环境变量或密钥管理服务注入,不写明文变量文件;为不同环境使用不同的最小权限账号。
- 评审重点:plan 输出重点看销毁与替换类变更(资源被删除重建往往意味着数据丢失),这类变更必须双人确认。
工程化上再加两道闸:CI 里执行格式与语法校验、以及 plan 产物归档,让每次变更都能回答「谁、什么时候、改了什么、影响哪些资源」。存量资源导入要分批做,导入后立刻核对状态与实际配置是否一致。
一份可执行的日常清单
- 暴露面盘点:定期梳理对外端口与服务,关闭不必要的开放。
- 权限最小化:账号与密钥按最小权限分配,定期回收闲置权限。
- 告警治理:清理长期无人响应的告警,保证留下的告警都值得处理。
- 预案演练:对高频故障场景准备处置预案并定期演练。
清单不复杂,难在坚持;而DevOps 与自动化运维的差距,恰恰体现在坚持上。
DevOps 与自动化运维的体系化思路
与其追求单点工具的极致配置,不如先保证覆盖面:关键资产是否都在监控之内、重要操作是否都有审计、对外暴露面是否都经过评估。覆盖面完整之后,再谈深度优化才有意义。
体系化的另一个好处是可传承:不依赖某个人的记忆,而是依赖流程与清单,团队整体水位才会稳定提升。
