是否有可能从地形地图默认返回null ?
的例子:
variable "MY_VAR" {
type = map(number)
default = {}
}
并在资源中引用:
var.MY_VAR["someKey"]
如果没有someKey的条目,我想只是返回null,而不是抛出'给定的键不识别此集合中的元素'错误。是否有办法配置地形地图以这种方式表现?是否存在某种可以利用的默认功能?
可以使用查找
lookup(var.MY_VAR, "someKey", null)
有几种不同的方法可以做到这一点。
在许多情况下,如果你硬编码模块期望的特定键,那么这表明你应该使用对象类型而不是映射类型。映射类型用于键完全在模块调用者控制之下的情况,例如指定要声明的对象的名称。对象类型用于模块需要特定的预定义属性集的情况。
如果你声明一个对象类型的属性值被标记为可选,那么在调用者没有设置它的任何情况下,Terraform都会自动将其设置为null
:
variable "example_object" {
type = object({
required_thing = string
optional_thing = optional(string)
})
}
通过上面的声明,调用者可以提供任何至少具有可以转换为字符串的required_thing
属性的对象:
module "example" {
# ...
example_object = {
required_thing = "Hello!"
}
}
使用上述变量的值:
var.example_object.required_thing
将成为"Hello!"
var.example_object.optional_thing
将为空值
在对象类型之间转换时,Terraform保证结果将具有类型约束中提到的所有属性,并指定类型。如果源值不足以保持承诺,那么Terraform将报告调用者给定值的错误。
在更罕见的情况下,当希望调用者控制键,但由于某种原因想要将某些键视为特殊的,只有当它们被设置时,才会有一些不同的策略来实现这一目标。
对于下面的例子,我将假设如下声明:
# NOTE: Terraform variable names are conventionally
# written in lowercase, not in uppercase.
variable "example_map" {
type = map(string)
}
一种方法是使变量的每次单独使用都提供一个回退值,以便在没有定义键时使用。在Terraform中有两种方法可以做到这一点,这两种方法都是等效的,但第一种方法是更新和更通用的设计,而第二种方法是旧版本Terraform的先前设计:
try(var.example_map["specific_key"], null)
lookup(var.example_map, "specific_key", null)
如果您将在许多不同的地方依赖此值,那么如果您将默认值插入到本地值中,则可能更容易理解和维护:
locals {
example_map = tomap(merge(
{
specific_key = null
},
var.example_map,
))
}
通过该声明,您现在可以在模块的其他地方使用local.example_map
而不是var.example_map
。通过将调用者提供的映射与默认值的映射合并,您可以保证specific_key
将始终存在于映射中,因此您可以安全地在其他地方引用local.example_map["specific_key"]
。
我想强调的是,使用映射类型时,某些键是"特殊的";是一个相当不寻常的设计,虽然我可以想象一些情况下,它可能是合理的,我将鼓励使用对象类型约束代替,如果可能的话,因为它将更容易为你的模块的未来用户理解它应该如何被使用,只是通过阅读类型约束。