【问题标题】:lookup function returns - The given key does not identify an element in this collection value查找函数返回 - 给定键未标识此集合值中的元素
【发布时间】:2021-08-20 01:13:39
【问题描述】:

我在我的 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("${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_env.business_unit 设置为“testthis”时,我希望 local.subnet_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.

如何获取默认值?

【问题讨论】:

    标签: terraform


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      在这种更复杂的情况下,您需要遍历多个级别的对象,通常更容易使用the try function 允许任一级别的查找失败并退回到默认值:

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

      或者,如果您的模块将包含许多这样的引用,您可以编写一个本地值,在中心位置选择适当的 subnet_env 值:

      locals {
        selected_subnet = try(
          local.subnet_env[var.business_unit],
          local.subnet_env["default"],
        )
      }
      

      然后,在需要访问当前选定子网中的某个属性的每种情况下,您都可以编写一个更简单的表达式,例如local.selected_subnet.private_subnets

      【讨论】:

        猜你喜欢
        • 2022-01-23
        • 2022-07-12
        • 2021-05-15
        • 2021-08-25
        • 2021-08-26
        • 2015-04-25
        • 1970-01-01
        • 2010-09-22
        • 1970-01-01
        相关资源
        最近更新 更多