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

如何在Terraform中通过条件迭代将列表转字符串并生成资源

Terraform按单个操作拆分生成资源实例解决方案

核心是先将原输入变量中的每个条目,根据WO/RO标识扩展为单个操作对应的独立条目,再通过for_each迭代生成资源。

步骤1:定义本地变量完成条目扩展

首先创建本地映射关系和扩展后的条目集合:

locals {
  # 映射标识到对应操作列表
  op_mapping = {
    WO = ["WRITE"]
    RO = ["READ", "DESCRIBE"]
  }

  # 扩展原输入,生成每个操作对应的独立条目
  expanded_cl_entries = flatten([
    for key, attrs in var.module_cl_list : [
      for op in local.op_mapping[split("@", key)[1]] : {
        id        = "${key}@${op}" # 生成唯一ID避免资源重复
        appid     = attrs.appid
        operation = op
      }
    ]
  ])
}
  • split("@", key)[1] 从原键名(如west@WO)中提取WO/RO标识
  • 遍历每个标识对应的操作列表,为每个操作生成带唯一ID的条目
  • flatten 将嵌套列表转为一维结构,适配for_each的迭代要求

步骤2:迭代扩展后的条目生成资源

用for_each遍历扩展后的条目集合,每个条目对应一个资源实例:

resource "something" "some" {
  for_each = { for entry in local.expanded_cl_entries : entry.id => entry }

  appid     = each.value.appid
  operation = each.value.operation
  # 补充资源所需的其他参数
}

效果验证

针对输入示例module_cl_list = {"west@WO" = {appid = "456"},"west2@RO" = {appid = "123"}},会生成3个符合要求的资源实例:

  • something.some["west@WO@WRITE"]:appid=456,operation=WRITE
  • something.some["west2@RO@READ"]:appid=123,operation=READ
  • something.some["west2@RO@DESCRIBE"]:appid=123,operation=DESCRIBE

每个实例仅传递单个操作值,解决了原代码拼接字符串导致的报错问题。

内容的提问来源于stack exchange,提问作者Nabob

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 07:50:27