在Terraform中从flatten结果创建Map的技术问题
解决Terraform中合并Map列表为单个Map的问题
你的核心问题是当前代码生成的是多个单键Map组成的列表,而你需要的是整合所有键值对的单个Map。以下两种方案可以解决这个问题:
方案1:用merge+展开操作符合并现有列表
在原代码基础上,通过merge函数将flatten后的列表中的所有小Map合并为一个大Map,配合Terraform的**展开操作符...**把列表元素作为merge的参数传入:
locals { object = { 1 = { name = "val1" keys = ["val1"] } 2 = { name = "val2" keys = ["val2", "val3", "val4"] } } associations = merge(flatten( [ for obj in local.object : [ for association_key in obj.keys : { "${obj.name}-${association_key}" = { key = obj.name association_key = association_key } } ] ] )...) }
如果存在重复的键,merge会自动保留最后出现的键值对,保证Map的键唯一性。
方案2:用嵌套for表达式直接生成目标Map
更简洁的方式是跳过中间的列表生成步骤,直接通过嵌套for表达式一次性构建出完整的Map:
locals { object = { 1 = { name = "val1" keys = ["val1"] } 2 = { name = "val2" keys = ["val2", "val3", "val4"] } } associations = { for obj in local.object, association_key in obj.keys : "${obj.name}-${association_key}" => { key = obj.name association_key = association_key } } }
这种方式直接遍历每个obj和对应的association_key,生成键值对,逻辑更清晰,性能也更优。同样,若出现重复键,后遍历到的会覆盖先出现的,确保键唯一。
执行以上任意方案后,local.associations就会变成你需要的单个Map结构。
内容的提问来源于stack exchange,提问作者TheDemonLord
相关产品推荐
相关产品推荐

