1.4.5.1. 局部值

有时我们会需要用一个比较复杂的表达式计算某一个值,并且反复使用之,这时我们把这个复杂表达式赋予一个局部值,然后反复引用该局部值。如果说输入变量相当于函数的入参,输出值相当于函数的返回值,那么局部值就相当于函数内定义的局部变量。

局部值通过 locals 块定义,例如:

locals {
  service_name = "forum"
  owner        = "Community Team"
}

一个 locals 块可以定义多个局部值,也可以定义任意多个 locals 块。赋给局部值的可以是更复杂的表达式,也可以是其他 dataresource 的输出、输入变量,甚至是其他的局部值:

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

results matching ""

    No results matching ""