1.4.5.1. 局部值
有时我们会需要用一个比较复杂的表达式计算某一个值,并且反复使用之,这时我们把这个复杂表达式赋予一个局部值,然后反复引用该局部值。如果说输入变量相当于函数的入参,输出值相当于函数的返回值,那么局部值就相当于函数内定义的局部变量。
局部值通过 locals
块定义,例如:
locals {
service_name = "forum"
owner = "Community Team"
}
一个 locals
块可以定义多个局部值,也可以定义任意多个 locals
块。赋给局部值的可以是更复杂的表达式,也可以是其他 data
、resource
的输出、输入变量,甚至是其他的局部值:
locals {
# Ids for multiple sets of EC2 instances, merged together
instance_ids = concat(aws_instance.blue.*.id, aws_instance.green.*.id)
}
locals {
# Common tags to be assigned to all resources
common_tags = {
Service = local.service_name
Owner = local.owner
}
}
引用局部值的表达式是 local.<NAME>
(注意,虽然局部值定义在 locals
块内,但引用是务必使用 local
而不是 locals
),例如:
resource "aws_instance" "example" {
# ...
tags = local.common_tags
}
局部值只能在同一模块内的代码中引用。
局部值可以帮助我们避免重复复杂的表达式,提升代码的可读性,但如果过度使用也有可能增加代码的复杂度,使得代码的维护者更难理解所使用的表达式和值。适度使用局部值,仅用于反复引用同一复杂表达式的场景,未来当我们需要修改该表达式时局部值将使得修改变得相当轻松。
1.4.5.1.1. 临时(Ephemeral)局部值
注意:临时局部值是 Terraform v1.10 开始引入的功能
如果局部值的表达式中引用了临时值,则本地值会隐式地变为临时值。例如,您可以创建引用临时输入变量 service_token
的局部值:
variable "service_name" {
type = string
default = "forum"
}
variable "environment" {
type = string
default = "dev"
}
variable "service_token" {
type = string
ephemeral = true
}
locals {
service_tag = "${var.service_name}-${var.environment}"
session_token = "${var.service_name}:${var.service_token}"
}
表达式 local.session_token
的值隐式地成为了临时值,因为它依赖于临时输入变量 var.service_token
。