Terraform 17: for_each sobre un mapa con data + secretos de Key Vault
easy⏱ 5 mincourseterraform
for_each sobre un mapa de servicios
Poné for_each = local.services y Terraform crea una instancia por entrada del mapa. Dentro del bloque, each.key es la clave y each.value es el objeto de esa entrada. Cada instancia se direcciona como <resource>["<key>"] — las claves estables hacen que agregar un servicio no afecte a los demás.
locals {
environment = "dev"
services = {
orders = { secret_name = "orders-conn" }
billing = { secret_name = "billing-conn" }
notifications = { secret_name = "notifications-conn" }
}
}
Conectar data + for_each + secret
Buscá el vault compartido una vez con un data source y después hacé for_each de un recurso key_vault_secret sobre el mapa de servicios, escribiendo la connection string de cada servicio en ese vault. Una sola búsqueda de data alimenta cada secreto generado.
data "azurerm_key_vault" "shared" {
name = "orders-kv-${local.environment}"
resource_group_name = "myorg-platform-${local.environment}-rg"
}
resource "azurerm_key_vault_secret" "conn" {
for_each = local.services
name = each.value.secret_name
value = var.connection_strings[each.key] # supplied via TF_VAR_*, never hard-coded
key_vault_id = data.azurerm_key_vault.shared.id
}
# Instances created:
# azurerm_key_vault_secret.conn["orders"]
# azurerm_key_vault_secret.conn["billing"]
# azurerm_key_vault_secret.conn["notifications"]
for_each vs count para direcciones estables
Preferí for_each sobre count para colecciones de cosas con nombre. count indexa por posición ([0], [1]), así que quitar el item del medio reordena todo lo que sigue y Terraform destruye/recrea recursos. for_each indexa por nombre, así que cada instancia es estable.
Calculá las direcciones de instancia de for_each
Dado services (un mapa clave -> config), escribí secretAddresses(services) que devuelva el arreglo ordenado de direcciones de Terraform azurerm_key_vault_secret.conn["<key>"], una por clave del mapa, ordenadas alfabéticamente por clave. Logueá JSON.stringify(secretAddresses(services)). Para las claves billing, notifications, orders deberías obtener esas tres direcciones en orden alfabético.