Terraform 地形公约:我应该声明一个;常数;作为变量还是局部变量?

Terraform 地形公约:我应该声明一个;常数;作为变量还是局部变量?,terraform,Terraform,示例:在Azure中,我在同一个区域部署多个资源组、托管磁盘、网络接口等 我想声明一个“区域”原语(“常量”),所有这些资源都将引用它。 以下哪一项符合惯例 a) 变量.tf: variable "region" { type = string default = "a-place" } b) 本地人.tf locals { region = "a-place" } 当然,我会选择将其声明为本地。只有当我期望一个值来自(或被重写)环境变量、命令行,或者如果我正在创建一

示例:在Azure中,我在同一个区域部署多个资源组、托管磁盘、网络接口等

我想声明一个“区域”原语(“常量”),所有这些资源都将引用它。 以下哪一项符合惯例

a) 变量.tf:

variable "region" {
    type = string
    default = "a-place"
}
b) 本地人.tf

locals {
    region = "a-place"
}
当然,我会选择将其声明为本地。只有当我期望一个值来自(或被重写)环境变量、命令行,或者如果我正在创建一个模块,我才会使用变量。 然而,在任何示例中,我都没有看到局部用于“声明常量”,这使我认为存在一种使用局部的约定,其范围非常有限(例如,主要用于创建可用于
count
for_each
构造的结构)

在有人将此标记为基于意见之前遮住我的后背:我问的是公约是什么,而不是你认为公约应该是什么

跟进问题:
如果本例涉及IP地址、资源名称前缀等,而不是区域,答案会有什么不同吗?(约定是否仅涵盖特定字段?

局部值的一般目的是表示要在模块中的多个位置重复使用其结果而不重复的表达式。这包括常量值,在将它们剔除是有效的情况下,例如,因为您希望它们将来会更改,并且只希望在一个地方更改,或者因为本地值名称比值本身更有意义,从而提高了使用它的配置部分的可读性

尽管如此,声明本地值也有潜在的成本:它迫使任何阅读模块其余部分的人在每次引用它时都去其他地方查看最终值。通常,收益大于成本,但并非总是如此


正如您所注意到的,输入变量的目的是它们可以由模块的调用者进行设置,因此只有在您期望默认值有时会被覆盖时,才应该使用输入变量。

对于任何常量,我都会使用局部变量。局部变量对我来说有两个用途:当我需要将变量插入到其他变量中时,或者当我想使用常量时。如果您正在寻找示例,您可能会发现,要么人们的代码早于本地代码,并且已经在使用变量,但尚未进行重构,要么大量示例代码的质量不高(我知道我在这里作为答案编写的许多内容都是快速示例,不一定是我将为生产代码编写的内容).还要记住,数据源可能比本地数据源更有用,因为它们更灵活,但也更具描述性。例如,如果您总是在AWS中使用单个区域,则可能会尝试为您想要引用某个区域的任何地方创建一个
locals{region=“eu-west-1”}
,但这里最好使用AWS区域数据源。谢谢您的回答。在介绍当地人之前,你举了一个很好的例子。在声明IP地址和地址范围时,您是否也会使用局部变量?假设在创建多个VNET、子网和网络安全规则时,问题取决于您的Terraform代码的结构。对于我(在AWS中运行)来说,我有一个VPC模块,它将VPC CIDR范围和名称作为变量,然后从那里处理所有事情(使用
cidrsubnet
函数自动将VPC范围中的子网的范围拆分),因此将它们作为局部变量对我来说没有意义。相反,名称和CIDR范围位于每个VPC的tfvars文件中。