如何基于 Terraform Workspace 实现多环境隔离?

解读

在国内云原生落地场景中,“一套代码、多套环境”是合规与降本的双重要求。Terraform Workspace 是官方推荐的多环境手段,它通过同一套 .tf 文件 + 不同 state 文件实现逻辑隔离,避免传统“文件夹拷贝”带来的配置漂移。面试官想确认你是否能把 Workspace 与 Google Cloud SQL 的项目级隔离、网络隔离、IAM 隔离、计费隔离结合起来,给出可落地的中国方案,而非仅仅背诵 terraform workspace new 命令。

知识点

  1. Workspace 本质:backend 里为每个环境生成独立 tfstate,key 前缀为 env:/<workspace>/,保证华东/华北地域团队并发写不冲突。
  2. 变量分层:用 terraform.tfvars.d/<workspace>.tfvars 覆盖 instance_tier、disk_size、availability_type、database_version;通过 google_client_config 获取当前地域,自动拼出符合中国备案要求的实例名如“gd-sql-prod-01”。
  3. Project 映射:国内多项目下,每个环境单独一个 GCP Project(便于走国内账单主体),用 workspace 名作为 project_id 后缀,例如“demo-sql-<workspace>”,通过 data “google_projects” 过滤并设置 provider alias,满足金融客户“生产项目必须独立账单”的审计要求
  4. 网络隔离
    • dev 环境使用 Public IP + 授权网络白名单(办公网出口),降低 VPC 成本;
    • staging 使用 Private Service Connect + 共享 VPC,模拟生产网络路径;
    • prod 使用 Private IP + 专用 VPC + 自定义路由,并开启 SQL Proxy 私网接入,符合等保 2.0 对数据库“禁止公网直连”条款。
  5. IAM 隔离:借助 workspace 变量 “env_type”,在 prod 环境下给 cloudsql.admin 角色加 “条件属性:request.time < 18:00+08:00”,实现**“下班时间禁止高危操作”**的国内运维规范。
  6. State 加锁:GCS backend 开启统一存储桶 + 对象版本 + 华东多区域,并配置“uniform_bucket_level_access”与“bucket_policy_only”,防止因跨境复制导致的合规风险。
  7. 敏感数据:用 google_secret_manager_secret 存放 root 密码,workspace 名作为 secret_id 后缀,确保 dev 无法读取 prod 密码;同时开启 CMEK(Customer Managed Encryption Key),密钥轮换周期 90 天,满足《个人信息保护法》对“敏感数据加密密钥定期更换”要求。
  8. CI/CD 集成:在 Cloud Build 或 GitLab-Runner 中,用 “terraform workspace select ${CI_COMMIT_REF_SLUG}” 动态匹配分支,实现 feature 分支自动创建销毁临时环境,节省 30% 以上测试资源

答案

步骤一:初始化后端

terraform {
  backend "gcs" {
    bucket = "demo-terraform-state-cn"
    prefix = "cloudsql/env"
  }
}

步骤二:创建并切换工作区

terraform workspace new prod
terraform workspace select prod

步骤三:定义环境变量文件
env/prod.tfvars

project_id          = "demo-sql-prod"
region              = "cn-north1"
tier                = "db-n1-standard-4"
disk_size           = 200
availability_type   = "REGIONAL"
deletion_protection = true
backup_enabled      = true

步骤四:主文件根据 workspace 名动态赋值

locals {
  env = terraform.workspace
}
module "cloudsql" {
  source              = "./modules/cloudsql"
  project_id          = var.project_id
  region              = var.region
  tier                = var.tier
  disk_size           = var.disk_size
  availability_type   = var.availability_type
  deletion_protection = local.env == "prod" ? true : false
  ip_configuration = {
    ipv4_enabled    = local.env == "dev" ? true : false
    private_network = local.env != "dev" ? data.google_compute_network.vpc.id : null
    require_ssl     = local.env == "prod" ? true : false
  }
}

步骤五:应用

terraform plan  -var-file="env/${TF_WORKSPACE}.tfvars"
terraform apply -var-file="env/${TF_WORKSPACE}.tfvars"

通过以上配置,同一套代码在 dev/staging/prod 三个工作区生成三套独立 state,分别落在不同 project、不同网络、不同 IAM 边界,实现逻辑与物理双重隔离,且满足国内等保、备案、账单独立三大合规要求。

拓展思考

  1. 如果企业已用 Anthos Config Management 做 GitOps,可把 workspace 名注入 ConfigMap,让 Config Controller 自动为每个环境生成 CloudSQL 自定义资源,实现**“Terraform 不落地”**的声明式治理。
  2. 面对跨国容灾需求,可结合 Cross-region Replication 与 workspace 变量 “primary_region”,在 prod 工作区里一键创建上海→香港异步只读实例,并通过 CMEK 密钥多区域授权解决跨境密钥合规问题。
  3. 国内大客户常要求**“灰度发布”**,可在 prod workspace 内部再切 “blue/green” 子工作区,利用 Cloud SQL 实例克隆 + 标记流量实现零停机数据库版本升级;灰度完成后再 terraform state mv 回 prod,保证回滚窗口 < 5 分钟