如何为字符串列表生成索引?能否结合Terraform flatten函数实现?
为Terraform扁平化后的子网列表生成索引
当然可以实现,根据需求可以选择两种常见的索引生成方式:
1. 基于原始层级的复合索引
如果需要保留子网所属的网络和子网原始标识,可以直接将network_key和subnet_key拼接成复合索引,适合需要追溯层级关系的场景:
locals { network_subnets = flatten([ for network_key, network in var.networks : [ for subnet_key, subnet in network.subnets : { network_key = network_key subnet_key = subnet_key network_id = aws_vpc.example[network_key].id cidr_block = subnet.cidr_block new_key = "${network_key}-${subnet_key}" # 字符串拼接的复合索引 # 若key是数字类型,也可以用数字组合:new_key = network_key * 100 + subnet_key } ] ]) }
2. 全局连续数字索引
如果需要生成从0或1开始的连续唯一索引,由于嵌套for循环无法直接维护计数器,我们可以分两步实现:先生成扁平化的原始列表,再遍历该列表添加全局索引:
locals { # 第一步:生成不带全局索引的扁平化子网列表 network_subnets_raw = flatten([ for network_key, network in var.networks : [ for subnet_key, subnet in network.subnets : { network_key = network_key subnet_key = subnet_key network_id = aws_vpc.example[network_key].id cidr_block = subnet.cidr_block } ] ]) # 第二步:遍历原始列表,添加全局连续索引(从1开始,若要从0开始直接用idx) network_subnets = [ for idx, subnet in local.network_subnets_raw : merge(subnet, { new_key = idx + 1 }) ] }
两种方式都完美结合了flatten函数的使用,你可以根据实际业务需求选择合适的索引形式。
内容的提问来源于stack exchange,提问作者Garddolau
相关产品推荐
相关产品推荐

