Terraform 0.12模块中替代count实现条件创建资源的方法
Terraform 0.12 版本下模块级条件创建资源的实现方案
Terraform 0.12 不支持在module块上直接使用count元参数,要实现仅生产环境创建模块内AWS资源的需求,有以下3种可直接落地的写法:
方案1:条件判断下沉到模块内部资源层
把环境判断逻辑放到模块内部,给模块内所有需要条件创建的资源统一加count配置。所有环境都保持模块调用,非生产环境下模块内资源count为0,不会实际生成资源。
实现步骤:- 在模块内声明环境入参:
variable "environment" { type = string }- 给模块内所有目标资源加上count判断:
resource "aws_xxx" "production_only" { count = var.environment == "production" ? 1 : 0 # 其余资源配置参数 }注意:模块内如果有其他资源引用该条件资源,必须带索引引用,比如
aws_xxx.production_only[0].arn,避免非生产环境下出现资源不存在的引用报错。方案2:通过source参数分流到空模块
Terraform 0.12 支持对模块的
source参数使用三元表达式,非生产环境下指向一个无任何实际资源定义的空模块,生产环境指向真实业务模块,实现逻辑上的条件创建。
实现步骤:- 提前准备一个空模块:目录下仅保留和业务模块结构完全一致的
variable、output定义,不声明任何实际资源,output值统一设为null即可。 - 模块调用层写法:
module "prod_only_aws_resource" { source = var.environment == "production" ? "./modules/actual_biz_module" : "./modules/empty_stub" # 按业务模块要求传入对应参数,空模块声明同名变量接收即可避免传参报错 }这种方案适合直接引用第三方公共模块、不方便修改模块内部代码的场景。
- 提前准备一个空模块:目录下仅保留和业务模块结构完全一致的
方案3:按环境拆分配置做物理隔离
直接把生产、非生产环境的Terraform配置拆到独立部署目录,非生产环境的配置文件中直接移除对应模块的调用块,从配置层彻底避免非生产环境部署该资源。
参考目录结构:terraform_config/ ├── prod/ │ └── main.tf # 包含生产专用模块的调用逻辑 └── non_prod/ └── main.tf # 不引入该生产专用模块这是0.12版本下最稳定、无语法hack的方案,适合环境差异大、模块逻辑复杂的场景。
以上方案全部兼容Terraform 0.12全系列版本,不需要升级版本即可使用。如果是自研模块优先选方案1,改动成本最低;如果是第三方模块选方案2;配置管理规范严格的团队可以选方案3。
内容的提问来源于stack exchange,提问作者polo
相关产品推荐
相关产品推荐

