terraform - Terraform 约定:我应该将“常量”声明为变量还是局部变量?
问题描述
示例:在 Azure 中,我在同一个区域中部署了多个资源组、托管磁盘、网络接口等。
我想声明一个“区域”原语(一个“常量”),所有这些资源都将引用它。其中哪一个遵循约定?
a)变量.tf:
variable "region" {
type = string
default = "a-place"
}
b) locals.tf
locals {
region = "a-place"
}
自然,我会选择将其声明为本地。如果我期望一个值来自环境变量、命令行或者我正在创建一个模块,我只会使用一个变量。但是,我在任何示例中都没有看到 local 被用于“声明常量”,这让我认为存在使用范围非常有限的局部变量的约定(例如,主要用于创建可用于count
和for_each
构造的结构)。
在有人将此标记为基于意见之前掩盖我的背部:我问的是公约是什么,而不是你认为公约应该是什么。
后续问题:如果此示例涵盖 IP 地址、资源名称前缀等而不是区域,答案是否会有所不同?(公约是否只涵盖特定领域?)
解决方案
局部值的一般意图是表示您希望在模块中的许多位置重复使用其结果而不重复的表达式。这包括常量值,在将它们分解出来的情况下,例如因为您希望它们在未来发生变化并且只想在一个地方更改,或者因为本地值名称比值本身更有意义,从而提高了可读性使用它的配置部分。
但是,声明一个本地值也有潜在的成本:它迫使任何阅读模块其余部分的人在每次引用它时都要查看其他地方以查看最终值。通常收益大于成本,但并非总是如此。
正如您所指出的,输入变量的目的是它们可以由模块的调用者设置,因此只有在您希望有时会覆盖默认值时才应该使用输入变量。
推荐阅读
- google-cloud-platform - 提供来自 Google Cloud Storage 的私有、用户上传的媒体
- google-api - 已提交 Google OAuth 开发者验证表单,但 Google 没有回复
- go - 为什么要从公共函数调用私有函数,而不是在公共函数中实现代码?
- debugging - intellij hotswap 不起作用:添加一个局部变量
- angular - 使用 Angular cli 在 Angular 项目中添加 moment.js 时区 - webpack
- javascript - Sprite 的拉伸与画布尺寸成反比
- java - Firebase 数据库:无法下载图片
- javascript - QUnit 在依赖项上存根方法会破坏针对该依赖项的测试
- javascript - 无法读取未定义的属性“位置”
- mysql - MySQL 查询循环