Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Terraform 0.13 - Modules, for_each and providers

UPDATED

I am trying to provision multiple SQL databases in Azure using Terraform.

My child module has the following code that provisions a SQL database:

providers.tf

// default provider
provider "azurerm" {
  alias = "main"
  features {}
}

// The provider that can access the storage account to store diagnostics
provider "azurerm" {
  alias = "storage_account"
  features {}
}

sql_db.tf

resource "azurerm_mssql_database" "default" {
  name      = var.name
  base_name = var.base_name
  ...
  tags      = var.tags
  
  provider = azurerm.main
}

data.tf

data "azurerm_storage_account" "storage" {
  name = var.storage_account_name
  resource_group_name = var.storage_account_rg
  provider = azurerm.storage_account
}

I am calling this module in my main.tf file as follows where I want to provision multiple SQL databases using a for_each:

module "sql_db" {
  for_each = var.sql_db

  source = "...../sql_db.git"

  base_name = each.value.base_name
  name      = each.value.name

  providers = {
    azurerm.main = azurerm.main
    azurerm.storage_account = azurerm.storage_account
  }
}

provider "azurerm" {
  features {}
  version  = "=2.20.0"
}

// default provider
provider "azurerm" {
  alias = "main"
  features {}
}

provider "azurerm" {
  alias = "storage_account"
  features {}
}

When I run plan, I get the following error:

Error: Module does not support for_each

  on main.tf line 35, in module "sql_db":
  35:   for_each = var.sql_db

Module "sql_db" cannot be used with for_each because it contains a nested
provider configuration for "azurerm.main", at
.terraform\modules\sql_db\providers.tf:2,10-19.

This module can be made compatible with for_each by changing it to receive all
of its provider configurations from the calling module, by using the
"providers" argument in the calling module block.


Error: Module does not support for_each

  on main.tf line 35, in module "sql_db":
  35:   for_each = var.sql_db

Module "sql_db" cannot be used with for_each because it contains a nested
provider configuration for "azurerm.storage_account", at
.terraform\modules\sql_db\providers.tf:8,10-19.

This module can be made compatible with for_each by changing it to receive all
of its provider configurations from the calling module, by using the
"providers" argument in the calling module block.
like image 718
kernal119 Avatar asked Oct 19 '25 15:10

kernal119


1 Answers

The simple answer is, it's not supported. From the Terraform documentation:

A module containing its own provider configurations is not compatible with the for_each, count, and depends_on arguments that were introduced in Terraform v0.13.

HashiCorp has been absolutely adamant that providers can never be declared dynamically, which is why they allow neither a for_each/count within a provider block, nor a for_each/count on a module that contains a provider block.

like image 161
Jordan Avatar answered Oct 22 '25 04:10

Jordan