1. 多环境云资源标准化工程导论
在真实的企业云平台中,同一套业务系统往往需要同时运行在开发、测试、预发、生产四套环境中。它们共享同一份业务代码,却承担着完全不同的职责:开发环境追求快速迭代与低成本,测试环境强调可重复与可清理,预发环境要求尽可能逼近生产,生产环境则以稳定、安全、可审计为第一目标。如果每个环境都由工程师手工在控制台点击创建资源,很快就会演变成"四套环境、四套配置、四套命名、四套权限"的失控局面。多环境云资源标准化工程,正是为了解决这一根本矛盾而提出的工程方法。
一、多环境的差异与共性
要谈标准化,先要看清"哪些必须不同、哪些必须相同"。差异是业务与风险决定的,共性则是工程效率与一致性决定的。
| 维度 | 开发 dev | 测试 test | 预发 staging | 生产 prod |
|---|---|---|---|---|
| 核心目标 | 快速试错 | 功能验证 | 上线前仿真 | 稳定对外服务 |
| 实例规格 | 最小规格 | 小规格 | 接近生产 | 生产规格 |
| 副本数量 | 1 | 1~2 | 与生产一致 | 按容量规划 |
| 数据 | 脱敏/造数 | 脱敏/造数 | 脱敏快照 | 真实数据 |
| 网络暴露 | 内网 | 内网 | 内网+受限入口 | 公网/专线 |
| 变更审批 | 无 | 轻量 | 需评审 | 强审批+审计 |
| 删除保护 | 关闭 | 关闭 | 开启 | 强制开启 |
可以看到,差异集中在规模、数据、暴露面、审批强度四类参数上;而共性则集中在资源拓扑、命名规范、标签体系、模块接口、状态管理方式上。标准化的核心思路就是:把共性固化为可复用的 Terraform 模块与规范,把差异收敛为少量可声明的环境参数。
二、标准化工程的目标与原则
标准化工程要达成的目标可以概括为四点:一致性(同一种资源在任何环境都由同一份代码定义)、可复现(给定代码与参数,能重建出等价环境)、可审计(每次变更都有记录、可回溯)、可演进(新增环境或新增资源时改动成本可控)。
支撑这些目标的原则包括:
- 单一事实来源:资源定义只存在于 Terraform 代码中,控制台手工改动视为漂移。
- 环境即参数:环境差异通过变量与 tfvars 表达,而不是复制粘贴一套代码。
- 模块化封装:网络、计算、数据库、权限等按能力封装为模块,对外暴露稳定接口。
- 状态隔离:每个环境独立 state,避免一次误操作波及全部环境。
- 最小权限:CI/CD 与工程师按环境授予不同权限,生产环境权限最严。
三、Terraform 在其中的定位与边界
Terraform 是基础设施即代码(IaC)的声明式编排工具,它负责把"期望状态"翻译成云 API 调用,并维护 state 以追踪实际资源。它擅长资源生命周期管理、依赖关系推导、变更计划(plan)预览;但它不负责应用发布、配置管理、运行时扩缩容策略、业务数据迁移。理解这条边界很重要:把 Terraform 当成"万能部署工具",会导致职责混乱,例如把应用二进制发布塞进 Terraform,反而失去灰度与回滚能力。
下面这张图展示了多环境标准化工程的整体结构:上层是统一的模块与规范,中层是按环境注入的参数,下层是各自隔离的 state 与云账号,右侧则是贯穿始终的 CI/CD 与审计链路。
四、交付物与落地方式
一个可落地的标准化工程,通常需要交付以下几类成果,它们共同构成团队协作的"契约":
- 模块仓库:按能力拆分的 Terraform 模块,每个模块有明确的输入变量、输出值和版本号。
- 环境目录结构:每个环境一个目录,内含 backend 配置、tfvars 与模块调用。
- 命名与标签规范:例如
{env}-{app}-{resource}-{index},标签至少包含 env、app、owner、cost-center。 - CI/CD 流水线:对每个环境执行 fmt、validate、plan,生产环境 apply 需人工审批。
- 漂移检测机制:定期执行 plan 并与基线比对,发现控制台手工改动即告警。
下面给出一个最小可用的环境目录结构示例,它体现了"模块复用 + 环境参数 + 状态隔离"三件事:
infra/
├── modules/
│ ├── network/
│ ├── compute/
│ └── database/
├── envs/
│ ├── dev/
│ │ ├── backend.tf # state 指向 dev 的存储桶
│ │ ├── main.tf # 调用 modules
│ │ └── dev.tfvars # 环境差异参数
│ ├── test/
│ ├── staging/
│ └── prod/
└── global/
└── iam/ # 跨环境共享的权限基线
以 dev 与 prod 为例,同一份 main.tf 调用 compute 模块,差异只体现在 tfvars:
# envs/dev/dev.tfvars
instance_type = "t3.small"
replica_count = 1
deletion_protection = false
# envs/prod/prod.tfvars
instance_type = "m6i.large"
replica_count = 3
deletion_protection = true
执行时只需切换目录与变量文件:terraform plan -var-file=dev.tfvars 或 terraform plan -var-file=prod.tfvars。这样,环境之间的差异被压缩为可审查的几行参数,而资源拓扑、依赖关系、标签规则完全一致。