Terraform如何按VPC批量配置资源参数而非逐个判断?
问题:Terraform中如何按VPC类型批量配置资源属性?
我是Terraform新手,当前编写了如下代码:
module "vote_service_sg" { source = "terraform-aws-modules/security-group/aws" for_each = var.inpparameter // count = length(local.mergesubnets) name = "user-service" description = "Security group" vpc_id = each.value.name=="vpc2"?"vpc-03fca892776900aa1":"vpc-07a77da5bec5f9583" ingress_cidr_blocks = ["0.0.0.0/0"] ingress_rules = ["all-tcp"] egress_cidr_blocks = each.value.name=="vpc1"?["0.0.0.0/0"]:[] egress_rules = each.value.name=="vpc1"?["all-tcp","ssh-tcp"]:[] }
目前我在每个资源参数上通过条件判断区分vpc1和其他VPC的赋值,想请教是否可以根据VPC是否为vpc1,批量为所有资源属性分配对应值,无需逐个参数设置条件?
解决方案
当然可以,你可以通过定义本地映射变量来批量管理不同VPC的配置,避免重复写条件判断。具体做法如下:
- 先定义一个本地变量,把各VPC的专属配置集中存储:
locals { vpc_configs = { vpc1 = { vpc_id = "vpc-07a77da5bec5f9583" egress_cidr_blocks = ["0.0.0.0/0"] egress_rules = ["all-tcp", "ssh-tcp"] } vpc2 = { vpc_id = "vpc-03fca892776900aa1" egress_cidr_blocks = [] egress_rules = [] } # 新增其他VPC时,直接在这里添加对应的配置块即可 default = { vpc_id = "vpc-07a77da5bec5f9583" # 默认配置,可根据实际需求调整 egress_cidr_blocks = [] egress_rules = [] } } }
- 在模块调用时,通过
lookup函数匹配当前VPC的配置,再结合展开运算符简化参数传递:
module "vote_service_sg" { source = "terraform-aws-modules/security-group/aws" for_each = var.inpparameter # 通用配置:所有VPC都共用的属性 name = "user-service" description = "Security group" ingress_cidr_blocks = ["0.0.0.0/0"] ingress_rules = ["all-tcp"] # 展开当前VPC的专属配置:自动匹配对应vpc_id、egress等参数 ...lookup(local.vpc_configs, each.value.name, local.vpc_configs.default) }
这样做的优势很明显:
- 配置集中管理:所有VPC的差异化配置都放在
local.vpc_configs里,后续修改或新增VPC时不用到处改代码 - 代码更简洁:避免重复写大量
each.value.name=="xxx"?...:...的条件判断 - 可读性更强:通用属性和专属属性分离,逻辑一目了然
内容的提问来源于stack exchange,提问作者satya18948
相关产品推荐
相关产品推荐

