1.2.4.1. terraform.tf
每一个 Terraform 模块(包括根模块)都应该包含一个 terraform 块,我们将这个块声明在 terraform.tf 文件里。
一个典型的 terraform 块如下所示:
terraform {
required_version = ">= 1.0.0"
required_providers {
azapi = {
source = "Azure/azapi"
version = "~>2.0"
}
azurerm = {
source = "hashicorp/azurerm"
version = "~>4.0"
}
}
}
required_version 规定了运行该模块所需要的 Terraform 程序的版本范围,required_providers 里面列出了该模块所需要的 Provider 及其版本范围。required_providers 中的 source 字段是一个字符串,表示该 Provider 的源地址,格式为 <namespace>/<name>,例如 hashicorp/azurerm。version 字段是一个字符串,表示该 Provider 的版本范围,例如 ~>4.0 表示大于等于 4.0 小于 5.0 的版本。
当然,terraform 块也遵循相同的规范:required_version 作为 Argument 在上方,required_providers 作为 Nested Block 在下方。
1.2.4.1.1. 限定 Provider 的 Major Version
Terraform 及其所有的 Provider 都要求使用语义化版本标准进行版本化管理,简单来说:
版本格式:MAJOR.MINOR.PATCH,版本号递增规则如下:
MAJOR:当你做了不兼容的 API 修改,
MINOR:当你做了向下兼容的功能性新增,
PATCH:当你做了向下兼容的问题修正。
Major 版本的更新往往都伴随着破坏性变更,所有未经测试确认的破坏性变更都是极其危险的,所以我们在声明 Provider 版本号约束时,必须限制 Major Version,例如:
~> 2.0>= 2.17, < 3.0
以下的版本号约束是不合适的:
>= 2.0# 可能会在未经测试的情况下使用v3.0=2.17、2.17# 过于严格的约束,这使得该模块几乎很难与其他模块一起使用~> 2.17# 一种常见且隐晦的错误,该约束锁定了 Minor Version 在17,也就是说,2.17.0、2.17.1这些都可以,但2.18.0不行,这实际上与上一条的问题是一样的
我们建议以 ~> 2.0 这样的约束开始,但是一旦引入某个特定版本 Provider 才添加的新功能后,要改为类似 >= 2.17, < 3.0 这样的形式,版本约束的下界是新功能被添加的版本。
1.2.4.1.2. 请密切注意更新 terraform 块
请注意,作为模块的维护者,我们时常会收到来自社区和客户的请求,要求我们添加各种新功能、新字段,或是修复某些错误,我们对代码的变更有时需要引入一些原来没有的功能,这时我们必须检查这些功能是从 Provider 的哪个版本添加的,或是我们是否使用了 Terraform 本身比较新的一些功能,如果是,我们要重新审查我们在 terraform 块中定义的版本信息,确保他们是准确的,否则可能会引发一些非常令人困惑的错误,用户可能会被错误信息中各种提示不存在的字段吓到。