如何在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=WRITEsomething.some["west2@RO@READ"]:appid=123,operation=READsomething.some["west2@RO@DESCRIBE"]:appid=123,operation=DESCRIBE
每个实例仅传递单个操作值,解决了原代码拼接字符串导致的报错问题。
内容的提问来源于stack exchange,提问作者Nabob
相关产品推荐
相关产品推荐

