Terraform中如何将嵌套实例类型列表转为对象列表
解决Terraform嵌套列表转对象列表问题
你需要将嵌套结构的karpenter_node_instance_types转换为包含单个name字段的对象扁平列表,无需依赖固定索引,支持任意数量的子列表和子元素。可以通过嵌套for循环+flatten函数实现:
完整代码实现
locals { # 原始嵌套列表变量 karpenter_node_instance_types = [ ["t3.small", "t3.medium", "t3.xlarge"], ["g5.xlarge", "p2.xlarge"], ] # 转换为目标对象列表 karpenter_instance_list = flatten([ # 外层循环:遍历每个实例类型分组 for instance_group in local.karpenter_node_instance_types : [ # 内层循环:遍历分组内的每个实例类型,包装为对象 for type in instance_group : { name = type } ] ]) }
转换逻辑说明
- 外层
for循环遍历karpenter_node_instance_types中的每个子列表(实例类型分组) - 内层
for循环遍历每个分组里的实例类型,将每个类型包装成{name = 类型值}的对象 - 最后用
flatten函数把嵌套的二维列表拍平成一维列表,得到你需要的结构
转换后的karpenter_instance_list结果与你期望的完全一致,且不管子列表有多少元素、有多少个子列表,都能自动适配。
优化后的data块使用
你可以直接遍历转换后的列表,建议用实例类型本身作为for_each的key(比索引更直观,还能自动去重):
data "aws_ec2_instance_type" "find_karpenter_instance_type" { for_each = { for inst in local.karpenter_instance_list : inst.name => inst if length(inst.name) > 0 } instance_type = each.value.name }
原方法的问题
你之前的实现依赖外层循环的索引来取子列表元素,这种方式只能获取固定位置的元素(比如索引0、1),无法遍历子列表的所有元素,当子列表长度不一致或有更多元素时,会出现遗漏或错误。
内容的提问来源于stack exchange,提问作者Prashant Singh
相关产品推荐
相关产品推荐

