Terraform 42: un segundo provider + alias de provider
easy⏱ 5 mincourseterraform
Declará cada provider que uses
required_providers fija el source y la version de cada provider. Agregar azuread junto a azurerm permite que un stack cree recursos de Azure y un app registration en Entra ID — APIs distintas, un solo terraform apply.
terraform {
required_providers {
azurerm = {
source = "hashicorp/azurerm"
version = "~> 3.20"
}
azuread = {
source = "hashicorp/azuread"
version = "~> 2.47"
}
}
}
Un app registration en el segundo provider
Con azuread configurado, podés registrar una aplicación y su service principal en código — la identidad que usa tu servicio. Esa es la ventaja multi-provider: la infra y su identidad, versionadas juntas.
provider "azuread" {}
resource "azuread_application" "api" {
display_name = "orders-api-dev"
}
resource "azuread_service_principal" "api" {
client_id = azuread_application.api.client_id
}
Alias: dos configuraciones de un provider
¿Necesitás recursos en dos subscriptions? Declará un azurerm default más uno con alias, y luego apuntá un recurso a él con provider = azurerm.hub. Mismo provider, dos configuraciones.
provider "azurerm" {
features {}
}
provider "azurerm" {
alias = "hub"
features {}
subscription_id = var.hub_subscription_id
}
resource "azurerm_dns_a_record" "app" {
provider = azurerm.hub # created in the hub subscription
name = "orders"
zone_name = "example.internal"
resource_group_name = "myorg-hub-dns-rg"
ttl = 300
records = ["10.0.0.10"]
}
Sin alias = default, alias explícito = opt-in
Un recurso sin argumento provider usa la configuración default (sin alias). Solo los recursos que setean explícitamente provider = azurerm.hub usan el alias. Los módulos reciben providers con alias mediante un bloque providers = { azurerm = azurerm.hub } en la llamada al module.
Resolvé la configuración de provider
Dados recursos con un alias opcional, escribí providerFor(res) que devuelva `azurerm.${res.alias}` cuando hay alias, si no "azurerm" (el default). Logueá el provider de cada recurso como name -> provider. Un recurso con alias: "hub" debe resolver a azurerm.hub; uno sin alias a azurerm.