Terraform输入变量用于从外部传递值到Terraform模块内部进行使用,如果把Terraform代码看作是一个函数的话,Terraform输入变量就是函数的输入参数。
Terraform局部值则用于在Terraform模块内部定义反复使用的常量值或表达式,如果把Terraform代码看作是一个函数的话,Terraform局部值就是函数内部的局部变量。
Terraform局部值只能在Terraform模块内部使用。
局部值定义
局部值使用locals
块定义:
locals {service_name = "form"owner = "Community Team"
}
在一个locals
块中可以定义多个局部值,当然在同一个Terraform模块中可以定义多个locals
块。
在locals
块中定义的局部值可以引用一个常量,也可以引用输入变量值,还可以引用资源属性或其他的局部值,如下示例:
locals {# 局部值引用的是资源属性instance_ids = concat(aws_instance.blue.*.id, aws_instance.green.*.id)
}
如上示例,在locals
块中定义的局部值引用的是资源属性,甚至还使用了函数concat()
。
如下示例在locals
块中引用的则是其他局部值:
locals {common_tags = { # 这个局部值是一个对象类型,它在属性中引用了其他局部值Service = local.service_nameOwner = local.owner}
}
局部值引用
引用局部值的语法:local.<NAME>
,如:
# 在资源定义中引用局部值
resource "aws_instance" "example" {tags = local.common_tags
}
注: 局部值定义在
locals
块中,但是引用局部值使用的是local
。
何时使用局部值
局部值可以帮助我们避免写重复复杂的表达式,提升代码的可读性,但是过度使用局部值也会增大代码的复杂度,使得代码的维护者更难理解所使用的表达式和值。
所以,适度使用局部值仅用于反复引用同一个复杂的表达式或常量值的场景,这样将来在修改表达式时会变得相当轻松。