我认为自己是一个地球中间体,正在寻求细化其知识。
阅读以下文档大概 20 遍后:https://developer.hashicorp.com/terraform/language/providers/configuration
在线研究,本地锻炼。我无法理解这个突出显示的参数的功能
来自文档👇🏻
terraform {
required_providers {
mycloud = {
source = "mycorp/mycloud"
version = "~> 1.0"
*configuration_aliases = [ mycloud.alternate ]*
}
}
}
“configuration_aliases”到底有什么作用?
我很清楚,“provider”块用于使用进行 API 调用所需的数据来配置提供程序。我很清楚提供程序别名的用途,并且您可以调用它(调用使用不同的配置创建相同的资源)。但我无法理解如何在所需的提供程序中使用配置别名。
到目前为止,我在伪代码中起草的内容是这样的(为了简单起见,它全部合而为一):
main.tf
terraform {
required_providers {
restapi = {
source = "Mastercard/restapi"
version = "1.18.2"
}
}
}
provider "restapi" {
alias = "main"
uri = "https://my-cortex.io"
debug = true
write_returns_object = true
headers = {
"Content-Type" = "application/json"
"Authorization" = "Basic ${base64encode("api-key")}"
}
}
module "create_bucket" {
source = "./modules/create_bucket"
}
main.tf - 模块 create_bucket
terraform {
required_providers {
restapi = {
source = "Mastercard/restapi"
version = "1.18.2"
configuration_aliases = [ restapi.main ]
}
}
}
resource "restapi_object" "s3_bucket_creation_all_off" {
path = "/api/v1/project/7a274931/services/object-storage/buckets"
data = <<EOF
{
"region": "3cc5e278",
"label": "to_delete",
"gb_allocated": 1024,
"tier": "standard",
"versioning": false,
"data_preservation": "none"
}
EOF
id_attribute = "result/id" #just to assign a value
object_id = "update_result" #just to assigna a value
}
当我运行上面的代码时,我得到的是以下错误:
Error: Missing required provider configuration
│
│ on main.tf line 1:
│ 1: module "create_bucket" {
│
│ The child module requires an additional configuration for provider
│ mastercard/restapi, with the local name "restapi.main".
│
│ Refer to the module's documentation to understand the intended
│ purpose of this additional provider configuration, and then add an
│ entry for restapi.main in the "providers" meta-argument in the
│ module block to choose which provider configuration the module
│ should use for that purpose.
我错过了什么?我在根配置中声明一个别名,然后在模块内的所需提供程序内调用别名,以便将配置传递到 required_provider 块,这样我就不必在模块内声明提供程序块,这是不好的做法。
TL;DR:terraform 中所需的提供程序块中的配置别名。简单来说它有什么作用?如何正确调用它?
当需要在多个区域部署一组资源时(通常与 AWS、GCP、Azure 等不同的云提供商相关),通常会使用配置别名。这是必需的,因为您不能有多个使用相同名称的提供程序块。例如,考虑一下您需要在欧盟和美国部署的 API。现在,在您的示例中,您正在使用一个根模块,该模块正在使用此提供程序块:
provider "restapi" {
alias = "main"
uri = "https://my-cortex.io"
debug = true
write_returns_object = true
headers = {
"Content-Type" = "application/json"
"Authorization" = "Basic ${base64encode("api-key")}"
}
}
然后,您将像这样调用子模块:
module "create_bucket" {
source = "./modules/create_bucket"
}
但是,子模块对于它期望的提供者非常具体:
子模块需要对provider进行额外的配置 │ mastercard/restapi,本地名称为“restapi.main”。
或者,在 terraform 代码中:
terraform {
required_providers {
restapi = {
source = "Mastercard/restapi"
version = "1.18.2"
configuration_aliases = [ restapi.main ]
}
}
}
这意味着在特别调用此模块时,您需要提供它期望的配置别名。所以这样的事情应该有效:
module "create_bucket" {
providers = {
restapi.main = restapi.main # since this is what you used as an alias for the provider in the *root* module
}
source = "./modules/create_bucket"
}
最后,根模块的整个代码块应如下所示:
terraform {
required_providers {
restapi = {
source = "Mastercard/restapi"
version = "1.18.2"
}
}
}
provider "restapi" {
alias = "main"
uri = "https://my-cortex.io"
debug = true
write_returns_object = true
headers = {
"Content-Type" = "application/json"
"Authorization" = "Basic ${base64encode("api-key")}"
}
}
}
module "create_bucket" {
providers = {
# child module provider name = root module provider name you are passing
restapi.main = restapi.main
}
source = "./modules/create_bucket"
}
所以,简短的版本:左侧是子模块(即您正在调用的模块)中的提供程序名称,而右侧是根模块(即您正在调用的模块)中的提供程序配置调用子模块)。通过这种方式,您可以将根模块提供程序配置分配给子模块提供程序配置。这也显示在错误消息中:
│ 请参阅模块的文档以了解其预期用途 │ 此附加提供程序配置的目的,然后添加一个 │ “providers”元参数中的restapi.main 条目 │ 模块块选择模块的提供者配置 │ 应该用于此目的。
最后,由于这看起来像是一个宠物项目,因此在这种情况下您实际上根本不需要使用配置别名,因为您在根模块和子模块中都只有一个提供程序配置。您可以轻松地摆脱接下来的两个:
terraform {
required_providers {
restapi = {
source = "Mastercard/restapi"
version = "1.18.2"
}
}
}
provider "restapi" {
uri = "https://my-cortex.io"
debug = true
write_returns_object = true
headers = {
"Content-Type" = "application/json"
"Authorization" = "Basic ${base64encode("api-key")}"
}
}
}
module "create_bucket" {
providers = {
restapi.main = restapi
}
source = "./modules/create_bucket"
}
这仍然使用子模块中的配置别名。第二个示例没有配置别名:
terraform {
required_providers {
restapi = {
source = "Mastercard/restapi"
version = "1.18.2"
}
}
}
provider "restapi" {
uri = "https://my-cortex.io"
debug = true
write_returns_object = true
headers = {
"Content-Type" = "application/json"
"Authorization" = "Basic ${base64encode("api-key")}"
}
}
}
module "create_bucket" {
source = "./modules/create_bucket"
}
然后子模块将如下所示:
terraform {
required_providers {
restapi = {
source = "Mastercard/restapi"
version = "1.18.2"
}
}
}
resource "restapi_object" "s3_bucket_creation_all_off" {
path = "/api/v1/project/7a274931/services/object-storage/buckets"
data = <<EOF
{
"region": "3cc5e278",
"label": "to_delete",
"gb_allocated": 1024,
"tier": "standard",
"versioning": false,
"data_preservation": "none"
}
EOF
id_attribute = "result/id" #just to assign a value
object_id = "update_result" #just to assigna a value
}