如何将Map中端口列表映射生成AWS安全组规则?
解决AWS安全组规则批量生成问题
你的核心问题是直接将列表类型的端口赋值给需要单个数值的from_port/to_port参数,导致类型不匹配报错。要实现每个端口对应一条安全组规则,需要先把嵌套的端口列表扁平化,让每个端口成为独立的遍历项。
步骤1:扁平化端口数据
先通过本地值(locals)把var.ep中的嵌套端口列表拆成独立条目,同时处理端口类型转换(你的端口是string类型,AWS要求是number):
locals { security_group_ports = flatten([ for ep_key, ep_value in var.ep : [ for port in ep_value.port : { key = "${ep_key}-${port}" # 生成唯一标识,避免重复 ep_key = ep_key name = ep_value.name port = tonumber(port) # 转换为AWS要求的数值类型 } ] ]) }
步骤2:生成安全组规则
基于扁平化后的数据集,遍历生成每条安全组规则:
resource "aws_security_group_rule" "ingress" { for_each = { for item in local.security_group_ports : item.key => item } description = "good desc - ${each.value.ep_key}" type = "ingress" from_port = each.value.port to_port = each.value.port protocol = "tcp" # 注意:AWS协议需为有效值,如tcp/udp/icmp,替换为你实际需要的协议 security_group_id = aws_security_group.example.id # 替换为你的目标安全组ID cidr_blocks = ["0.0.0.0/0"] # 按需设置允许访问的IP段,必填参数 }
关键说明
flatten函数用来把嵌套的列表结构转换成一维列表,确保每个端口都是独立的遍历项tonumber转换端口类型,避免因string类型导致的AWS API报错for_each使用{ for ... }构建键值对集合,确保每个规则实例有唯一的标识符- 补充了
security_group_id和cidr_blocks等必填参数,实际使用时需替换为你的配置
内容的提问来源于stack exchange,提问作者AMU
相关产品推荐
相关产品推荐

