首页 > 解决方案 > Terraform - 反转地图

问题描述

我一直在尝试编写一个可以改变这个的 terraform 表达式:

subnets = {
   my_subnet_1 = {
     nsg       = "my_nsg_1",
     addresses = "my_addresses_1"
   }
   my_subnet_2 = {
     nsg       = "my_nsg_2",
     addresses = "my_addresses_2"
   }
}

进入

nsgs_assocs = {
  my_nsg_1 = "my_subnet_1"
  my_nsg_2 = "my_subnet_2"
}

我尝试了以下方法:

locals {
  nsgs_assocs = zipmap(
    var.subnets.*.nsg,
    keys(var.subnets)
  )
}

但这给出了一个错误:

Error: Invalid function argument

  on ..\..\modules\vnet\main.tf line 22, in locals:
  21:   nsgs_assocs = zipmap(
  22:     var.subnets.*.nsg,
  23:     keys(var.subnets)
  24:   )

Invalid value for "keys" parameter: element 0: string required.

对于上下文,我继承了一堆脚本,我试图在不改变terraform plan.

其中一个模块有很多相关的查找图——例如:

nsgs_assocs = {
  my_nsg_1 = "my_subnet_1"
  my_nsg_2 = "my_subnet_2"
}

subnet_addresses = {
  my_subnet_1 = "my_addresses_1"
  my_subnet_2 = "my_addresses_2"
}

我已经将其浓缩为我的第一个上面的示例,我认为从长远来看它会更易于维护。

但是,为了向后兼容现有的 terraform 状态,我需要nsgs_assocs在我的模块中生成原始状态,以便 afor_each继续使用 nsg 名称作为资源键而不是子网名称(由于键更改,这会导致销毁/创建对)。

标签: terraform

解决方案


你在正确的轨道上。它不起作用,因为splat 表达式适用于数组,并且var.subnets是一个映射。为了修复它,您需要将其转换为数组,并且可以使用values terraform 函数来完成:

locals {
  nsgs_assocs = zipmap(
    values(var.subnets)[*].nsg,
    keys(var.subnets)
  )
}

推荐阅读