Terraform创建locals时如何遍历map列表拆分CIDR生成目标结构?
错误原因
你当前的报错是因为第二层for循环中,拿到的cidr是每个AZ下的完整CIDR列表(tuple类型),你直接将整个列表赋值给了cidr_block字段,所以后续拼接for_each的key时,尝试把tuple转为字符串就触发了类型错误。
只需要再加一层循环遍历CIDR列表中的单个元素即可。
修复后的完整代码
locals { int_subnets = toset(flatten([ # 第一层:遍历所有应用配置 for app in var.subnets : [ # 第二层:遍历单个应用下的所有可用区和对应CIDR列表 for az, cidr_list in app.subnets : [ # 第三层:遍历单个可用区下的每一个CIDR地址段 for cidr in cidr_list : { app_name = app.app_name cidr_block = cidr az = az } ] ] ])) } resource "aws_subnet" "example" { for_each = { # 建议用冒号作为分隔符,避免应用名带空格时出现异常 for s in local.int_subnets : "${s.app_name}:${s.az}:${s.cidr_block}" => s } vpc_id = var.vpc_id cidr_block = each.value.cidr_block availability_zone = each.value.az tags = { Name = "${each.value.app_name}-Int-${split("-", each.value.az)[2]}" } }
逻辑说明
修改后通过三层嵌套循环+flatten压平,最终得到的local.int_subnets就是你要求的对象集合格式,每个元素的cidr_block都是单独的字符串类型,完全匹配AWS子网资源的参数要求。
内容的提问来源于stack exchange,提问作者JPNagarajan
相关产品推荐
相关产品推荐

