You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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
      }
    ]
  ])
}

转换逻辑说明

  1. 外层for循环遍历karpenter_node_instance_types中的每个子列表(实例类型分组)
  2. 内层for循环遍历每个分组里的实例类型,将每个类型包装成{name = 类型值}的对象
  3. 最后用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 10:25:15