Использование субъекта-службы Azure в модуле приводит к ошибке поставщика

Я настраиваю инфраструктуру в Azure, и моим инструментом для выбора является Terraform.

Чтобы иметь хороший поддерживаемый код, я решил использовать модули. Моя текущая структура выглядит так:

├── development/
│   ├── main.tf
│   ├── vars.tf
│   ├── outputs.tf
│  
├── modules/
│   ├── provider
│   └── resource-group
│   └── eventhub

Итак, я даже выпустил код провайдера в модуль. Мой код выглядит примерно так:

terraform {
  backend "azurerm" {}
}

module "provider" {
  tenant_id       = "${var.tenant_id}"
  client_id       = "${var.client_id}"
  client_secret   = "${var.client_secret}"
  subscription_id = "${var.subscription_id}"
  source          = "../modules/provider"
}

module "resource-group" {
  source = "../modules/resource-group"
}

module "iothub" {
  name     = "${module.resource-group.name}"
  location = "${module.resource-group.location}"
  source   = "../modules/iothub"
}

Но когда я бегу terraform apply Я получаю сообщение об ошибке * provider.azurerm: Error validating provider: No valid (unexpired) Azure CLI Auth Tokens found. Please runaz логин.

Я уже исправил это, переместив код из модуля провайдера в main.tf файл для моей среды разработки. Но мне любопытно, почему это происходит в первую очередь. Требуется ли ресурс провайдера в корневом модуле?

Спасибо!

1 ответ

Решение

Невозможно передать конфигурацию провайдера вверх, поэтому, хотя можно определить провайдеров в модуле, вы не можете затем передать эту провайдерскую конфигурацию родительскому (включая корневой) или родственному модулю.

Собственная документация модуля Terraform, в которой вы должны определить всех провайдеров на корневом уровне.

Я лично достигаю этого, определяя один файл провайдера для каждой конфигурации, а затем символически связываю его с каждым подходящим местоположением, что означает, что я могу изменить конфигурацию проще, но есть и другие подходы.

Обратите внимание, что иногда у вас может быть веская причина для определения поставщика непосредственно в ресурсе. Я лично определяю postgresqlКонфигурация провайдера в моем модуле Postgresql RDS, который создает экземпляр AWS RDS Postgresql, а затем настраивает пользователей и базы данных с помощью поставщика PostgreSQL, подключаясь к динамической конечной точке, предоставляемой экземпляром RDS при создании.

Другие вопросы по тегам