Due to billing or organizational structures, certain parts of the infrastructure could be divided over several Azure subscriptions. From an infrastructure management point of view however, it might be interesting to manage the resources in those multiple subscriptions in one Terraform playbook.
In the required_providers section, the configuration_aliases must be configured first (usually in the main.tf file). This parameter must contain the same name (or names as the parameter takes a list of strings as input) as the alias parameter further below in the second provider section. Each provider section can have its own configuration parameters, such as for instance the subscription_id.
terraform {
required_providers {
azurerm = {
source = "hashicorp/azurerm"
version = "3.4.0"
configuration_aliases = [ azurerm.other-sub ]
}
}
provider "azurerm" {
subscription_id = var.subscription_id
features {}
}
provider "azurerm" {
alias = "other-sub"
subscription_id = var.other_subscription_id
features {}
}
When calling a module, each provider containing an alias and which is required in the module, must be specified in the providers parameter. The key is the name configured in the configuration_aliases in the required_providers section of the module (see below), the value is the name of the provider alias in the playbook.
module "diagnostic_sa_private_endpoint" {
source = "../terraform_modules/private_endpoint/"
providers = {
azurerm.other-sub = azurerm.other-sub
}
for_each = { for snet in data.azurerm_subnet.subnets : snet.id => snet }
...
}
The module itself (in ../terraform_modules/private_endpoint/) however must again define the alias in a “required_providers” section. This means that a file must be include in the directory ../terraform_modules/private_endpoint which includes:
terraform {
required_providers {
azurerm = {
source = "hashicorp/azurerm"
configuration_aliases = [ azurerm.other-sub ]
}
}
}
Finally, all Azure resources which require the other Azure subscription, must include a “provider” line similar as:
data "azurerm_private_dns_zone" "dns_zone" {
provider = azurerm.other-sub
name = var.private_dns_zone_name
}
Nice article!