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