Terraform lookup函数返回-给定的键未标识此集合值中的元素

Terraform lookup函数返回-给定的键未标识此集合值中的元素,terraform,Terraform,我在我的地形中设置了这些本地人 locals { subnet_config = { config1 = { private_subnets = [ cidrsubnet("${var.cidr_ip}/${var.cidr_range}", 3, 0), cidrsubnet("${var.cidr_ip}/${var.cidr_range}", 3, 1), cidrsubnet(

我在我的地形中设置了这些本地人

locals {
  subnet_config = {
    config1 = {
      private_subnets = [
        cidrsubnet("${var.cidr_ip}/${var.cidr_range}", 3, 0),
        cidrsubnet("${var.cidr_ip}/${var.cidr_range}", 3, 1),
        cidrsubnet("${var.cidr_ip}/${var.cidr_range}", 3, 2),
      ]
      public_subnets = [
        cidrsubnet("${var.cidr_ip}/${var.cidr_range}", 3, 3),
        cidrsubnet("${var.cidr_ip}/${var.cidr_range}", 3, 4),
        cidrsubnet("${var.cidr_ip}/${var.cidr_range}", 3, 5),
      ]
    },
    config2 = {
      private_subnets = [
        cidrsubnet("${var.cidr_ip}/${var.cidr_range}", 2, 0),
        cidrsubnet("${var.cidr_ip}/${var.cidr_range}", 2, 1),
        cidrsubnet("${var.cidr_ip}/${var.cidr_range}", 2, 2),
      ]
      public_subnets = [
        cidrsubnet("${var.cidr_ip}/${var.cidr_range}", 5, 24),
        cidrsubnet("${var.cidr_ip}/${var.cidr_range}", 5, 25),
        cidrsubnet("${var.cidr_ip}/${var.cidr_range}", 5, 26),
      ]
    }
  }
}

locals {
  subnet_env = {
    default = local.subnet_config.config1,
    web = local.subnet_config.config2,
  }
}

我在terraform vpc模块中参考了上面的本地人

module "vpc" {
...
  private_subnets     = lookup(local.subnet_env[var.business_unit], "private_subnets", local.subnet_env["default"]["private_subnets"])
  public_subnets      = lookup(local.subnet_env[var.business_unit], "public_subnets", local.subnet_env["default"]["public_subnets"])
...

当local.subnet\u env.business\u unit设置为“testthis”时,我希望选择local.subnet\u env.default,但我得到的是这个

Error: Invalid index

  on .terraform/modules/base/base/vpc.tf line 12, in module "vpc":
  12:   private_subnets     = lookup(local.subnet_env[var.business_unit], "private_subnets", local.subnet_env["default"]["private_subnets"])
    |----------------
    | local.subnet_env is object with 2 attributes
    | var.business_unit is "testthis"

The given key does not identify an element in this collection value.


Error: Invalid index

  on .terraform/modules/base/base/vpc.tf line 13, in module "vpc":
  13:   public_subnets      = lookup(local.subnet_env[var.business_unit], "public_subnets", local.subnet_env["default"]["public_subnets"])
    |----------------
    | local.subnet_env is object with 2 attributes
    | var.business_unit is "testthis"

The given key does not identify an element in this collection value.

如何获取默认值?

local.subnet\u env
中没有
testthis
,因此您会得到一个错误。在这种情况下,您需要再进行一次额外的查找,以使用一些默认值:

private_subnets     = lookup(lookup(local.subnet_env, var.business_unit, local.subnet_env["default"]) 
                             "private_subnets", 
                             local.subnet_env["default"]["private_subnets"])

在这样一种更复杂的情况下,如果要遍历多个级别的对象,则通常更容易使用允许任一级别的查找失败并返回到默认值:

 private_subnets = try(
   local.subnet_env[var.business_unit].private_subnets, 
   local.subnet_env["default"].private_subnets,
 )
或者,如果您的模块将包含许多这样的引用,您可以编写一个本地值,在中心位置选择适当的
subnet\u env
值:

locals {
  selected_subnet = try(
    local.subnet_env[var.business_unit],
    local.subnet_env["default"],
  )
}
然后,在需要从当前所选子网访问其中一个属性的每种情况下,都可以编写一个更简单的表达式,如
local.selected\u subnet.private\u subnets