Terraform嵌套对象转换:如何将模块中的数组嵌套结构转换为单层映射
解决方案:合并Terraform列表中的对象为单一映射
当然有可行的方法实现这个转换!在Terraform中,你可以借助内置的merge函数配合展开运算符(...),轻松将列表中的多个对象合并成一个包含所有二级对象的顶层映射。
具体实现代码
locals { # 你的原始输入列表 input = [ { "prod_db" : {some_attr = "prod_db_val"}, "prod_app": {some_attr = "prod_app_val"} }, { "stage_db" : {some_attr = "stage_db_val"}, "stage_app": {some_attr = "stage_app_val"} }, { "dev_db" : {some_attr = "dev_db_val"}, "dev_app": {some_attr = "dev_app_val"} } ] # 转换后的目标映射 result = merge(local.input...) }
代码说明
merge函数:Terraform的内置函数,用于将多个对象合并为一个单一对象。如果多个输入对象存在重复的键,后面的对象会覆盖前面的,所以要确保你的输入列表中没有重复的顶层键(比如prod_db只出现一次)。- 展开运算符
...:这个运算符会把local.input列表中的每个元素单独传递给merge函数,等价于手动编写merge(local.input[0], local.input[1], local.input[2]),让代码更简洁且适配列表长度变化。
验证结果
你可以通过terraform console命令查看local.result的输出,会得到你想要的结构:
{ "dev_app" = { "some_attr" = "dev_app_val" } "dev_db" = { "some_attr" = "dev_db_val" } "prod_app" = { "some_attr" = "prod_app_val" } "prod_db" = { "some_attr" = "prod_db_val" } "stage_app" = { "some_attr" = "stage_app_val" } "stage_db" = { "some_attr" = "stage_db_val" } }
内容的提问来源于stack exchange,提问作者Sabrine Mihni
相关产品推荐
相关产品推荐

