基于现有安全组变量创建AWS Target Groups的多端口实现与变量重构
解决方案
1. 扁平化变量结构(无需修改原始变量)
通过Terraform的flatten和嵌套for表达式,在本地将原有按设施分组的变量转换为每个端口对应一条记录的扁平化结构,这样就能用for_each遍历生成所有目标组。
在配置中添加以下本地值:
locals { facility_target_group_map = merge([ for facility_name, facility_data in var.facility-sg-port-map : { for port in facility_data.ports : "${facility_name}-${port}" => { facility_name = facility_name port = port cidr_blocks = facility_data.cidr_blocks } } ]...) }
这个表达式会把每个设施下的每个端口单独拆分,生成类似Facility1-20000、Facility1-20001的唯一键,最终得到7条独立条目,完全匹配需要创建的目标组数量。
2. 重构目标组资源配置
修改aws_lb_target_group资源,使用上面的本地值作为for_each的数据源,为每个端口单独创建目标组:
resource "aws_lb_target_group" "facility_target_groups" { for_each = local.facility_target_group_map name = substr("${each.value.facility_name}-${each.value.port}", 0, 32) vpc_id = module.vpc.id protocol = "TCP" port = each.value.port target_type = "instance" deregistration_delay = 10 preserve_client_ip = true health_check { protocol = "TCP" enabled = true interval = 30 port = "traffic-port" healthy_threshold = 3 unhealthy_threshold = 2 timeout = 10 } tags = { Facility = each.value.facility_name Port = each.value.port } }
name字段通过substr确保不超过AWS目标组名称32字符的限制- 直接用
each.value.port绑定目标组端口,实现每个端口对应一个独立资源
3. 安全组配置保留(可选优化)
原有的安全组动态ingress块逻辑是将每个设施的端口范围合并为一条规则,若需保持该逻辑无需修改;如果要为每个端口单独创建安全组规则,也可以复用上述扁平化的本地值来生成动态规则。
可选:重构原始变量(不推荐)
如果希望变量本身更直接对应目标组需求,也可以将变量改为扁平化结构,但会带来CIDR配置重复的问题,不如使用本地值扁平化的方式简洁:
variable "facility-target-group-map" { type = map(object({ cidr_blocks = list(string) })) default = { "Facility1-20000" = { cidr_blocks = ["192.168.0.0/24"] } "Facility1-20001" = { cidr_blocks = ["192.168.0.0/24"] } "Facility2-20010" = { cidr_blocks = ["192.168.1.0/24"] } "FacilityN-20020" = { cidr_blocks = ["192.168.2.0/24"] } "FacilityN-20021" = { cidr_blocks = ["192.168.2.0/24"] } "FacilityN-20022" = { cidr_blocks = ["192.168.2.0/24"] } "FacilityN-20023" = { cidr_blocks = ["192.168.2.0/24"] } } }
内容的提问来源于stack exchange,提问作者skohrs
相关产品推荐
相关产品推荐

