同一GCP项目下多组件仓库的Terraform代码如何规范组织?
Terraform 仓库拆分与共享资源防护方案
一、Terraform 文件拆分规则
按照资源归属维度拆分仓库,完全避免跨仓库的资源定义重叠:
- 单独创建1个共享基础设施专用Git仓库,仅存放所有组件共用的全局资源配置:
- 全局共享Load Balancer的核心配置:包含LB实例本身、公网IP、转发规则、全局SSL证书、全局URL map框架
- 其他跨组件通用资源:VPC、公共子网、全局防火墙规则、全局IAM权限配置
- 该仓库的Terraform状态独立存储,所有业务组件仓库仅通过
terraform_remote_state数据源读取它的输出值,不允许任何业务仓库修改共享仓库管理的资源
- 每个业务组件(前端、API、各微服务)的对应Git仓库,仅存放自身专属的基础设施配置:
- 前端仓库:管理专属GCS buckets、LB后端bucket服务、LB路由规则、静态资源缓存配置
- API仓库:管理专属VM实例、托管数据库实例、LB后端服务、LB路由规则、业务专属防火墙规则
- 微服务仓库:按相同逻辑仅管理自身运行所需的部署资源、专属LB后端与路由规则
可以通过以下示例代码在业务仓库中读取共享LB配置,不需要重复定义LB资源:
# 业务仓库中读取共享基础设施的远端状态 data "terraform_remote_state" "shared_infra" { backend = "gcs" config = { bucket = "your-org-terraform-state-bucket" prefix = "shared-infra/terraform.tfstate" } } # 引用共享LB的URL map ID配置当前组件的路由规则 resource "google_compute_url_map_path_matcher" "frontend_routes" { name = "frontend-routes" url_map = data.terraform_remote_state.shared_infra.outputs.lb_url_map_id default_service = google_compute_backend_bucket.frontend_bucket_backend.self_link path_rule { paths = ["/*"] service = google_compute_backend_bucket.frontend_bucket_backend.self_link } }
二、跨仓库变更影响防护配置
通过四层隔离规则完全避免单个仓库变更影响其他组件的资源:
- 状态隔离
所有仓库的Terraform状态文件独立存储在GCS远端后端,每个仓库对应独立的状态路径,默认开启状态锁防止并发修改。共享基础设施仓库的状态文件仅给业务仓库的CI/CD服务账号开通只读权限,只有共享仓库的管理员才有写入权限。
- 权限最小化
每个仓库对应的CI/CD部署服务账号,仅授予对应资源的编辑权限:比如前端仓库的服务账号只有GCS bucket、LB后端、LB路由规则的编辑权限,没有LB核心实例、数据库、其他组件资源的修改权限;只有共享仓库的服务账号有权限修改LB核心配置。
- 变更校验强制规则
- 所有仓库的CI流水线必须执行
terraform plan步骤,明确输出变更影响的资源列表,若plan结果中出现不属于当前仓库管理范围的资源变更,直接阻断流水线 - 共享基础设施仓库的所有变更必须走强制审批流程,经过至少2名基础设施负责人审核通过后才能执行apply操作
- 资源归属明确标记
所有Terraform定义的资源必须添加
component标签,明确标注归属的组件仓库,定期执行全局资源扫描,排查是否存在跨仓库管理的资源,避免资源归属混淆。
内容的提问来源于stack exchange,提问作者deniable_encryption
相关产品推荐
相关产品推荐

