Terraform 约定 : Should I declare a "constant" as a variable or local?

标签 terraform

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

我想声明一个“区域”原语(一个“常量”),所有这些资源都将引用它。
其中哪一个遵循约定?

a)变量.tf:

variable "region" {
    type = string
    default = "a-place"
}

b) locals.tf
locals {
    region = "a-place"
}

自然,我会选择将其声明为本地。如果我期望一个值来自环境变量、命令行或者我正在创建一个模块,我只会使用一个变量。
但是,我在任何示例中都没有看到 local 用于“声明常量”,这让我认为存在使用范围非常有限的局部变量的约定(例如,主要用于创建可与 countfor_each 结构)。

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

后续问题:
如果此示例涵盖 IP 地址、资源名称前缀等而不是区域,答案是否会有所不同? (公约是否只涵盖特定领域?)

最佳答案

局部值的一般意图是表示您希望在模块中的许多位置重复使用其结果而不重复的表达式。这包括常量值,在将它们分解出来的情况下是有效的,例如因为您希望它们将来会更改并且只想在一个地方更改,或者因为本地值名称比值本身更有意义,从而提高了使用它的配置部分的可读性。
但是,声明一个本地值也有潜在的成本:它迫使任何阅读模块其余部分的人在每次引用它时都去其他地方查看最终值。通常 yield 大于成本,但并非总是如此。
正如您所指出的,输入变量的目的是它们可以由模块的调用者设置,因此只有在您希望有时会覆盖默认值时才应该使用输入变量。

关于Terraform 约定 : Should I declare a "constant" as a variable or local?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62453985/

相关文章:

amazon-web-services - ro 如何在 aws 弹性 beantalk 环境实例启动上运行 shell 脚本

amazon-web-services - Terraform-每次申请时将文件上传到S3

kubernetes - Terraform:模块输出未被识别为变量

amazon-web-services - Terraform 在子 AWS 账户中创建资源

terraform - 空的 "azurerm_subscription"数据 block 究竟是如何获取其数据源参数的?

Terraform 动态/条件资源创建

Terraform Azure 应用服务 - ip_restrictions

amazon-web-services - AWS CLI : listener ARN "must be in ARN format" error

amazon-s3 - 如何在 S3 中回滚我的配置的 Terraform 状态?

azure - Terraform导入现有资源