Terraform“required_providers”块,configuration_aliases 参数

问题描述 投票:0回答:1

我认为自己是一个地球中间体,正在寻求细化其知识。

阅读以下文档大概 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 中所需的提供程序块中的配置别名。简单来说它有什么作用?如何正确调用它?

module terraform hashicorp terraform-modules
1个回答
0
投票

当需要在多个区域部署一组资源时(通常与 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
}
© www.soinside.com 2019 - 2024. All rights reserved.