Terraform 20: for_each sobre un map/set con each.key / each.value
easy⏱ 5 mincourseterraform
Una instancia por entrada del map
Con for_each = <map>, cada instancia se direcciona por su clave — azurerm_servicebus_queue.q["orders"] — no por índice. each.key es la clave del map y each.value es el valor (a menudo un objeto de ajustes). Agregar o quitar una clave afecta solo esa instancia; las demás quedan intactas.
locals {
queues = {
orders = { max_size_mb = 1024, dlq = true }
billing = { max_size_mb = 2048, dlq = true }
notifications = { max_size_mb = 512, dlq = false }
}
}
resource "azurerm_servicebus_queue" "q" {
for_each = local.queues
name = each.key # "orders", "billing", ...
namespace_id = azurerm_servicebus_namespace.main.id
max_size_in_megabytes = each.value.max_size_mb
dead_lettering_on_message_expiration = each.value.dlq
}
for_each sobre un set (toarray -> toset)
Para expandir sobre una lista simple de nombres, convertila con toset(...) — for_each requiere un set o un map, no una lista. Con un set, each.key y each.value son el mismo string. Es lo típico para asignaciones de roles o secretos indexados por un nombre.
variable "reader_principal_ids" {
type = set(string)
default = []
}
resource "azurerm_role_assignment" "kv_readers" {
for_each = var.reader_principal_ids # already a set
scope = azurerm_key_vault.orders.id
role_definition_name = "Key Vault Secrets User"
principal_id = each.value # == each.key for a set
}
Las claves de for_each deben conocerse en plan
Las claves de un map/set de for_each no pueden depender de valores que solo se conocen después del apply (p. ej. un id que Terraform aún no creó). Indexá por inputs que controlás — nombres de servicio, de entorno, ids estáticos. Preferí for_each sobre count cuando los elementos tienen nombre: no hay churn al cambiar la colección.
Calculá las direcciones de instancia de for_each
Dado el map { orders: {...}, billing: {...}, notifications: {...} }, escribí forEachAddresses(resource, map) que devuelva direcciones como azurerm_servicebus_queue.q["orders"] para cada clave. Logueá JSON.stringify(result) (esperado 3 entradas indexadas por nombre, no por índice).