Terraform 15: Locals e interpolación de strings
easy⏱ 5 mincourseterraform
El bloque locals
Un bloque locals define valores referenciados como local.<name>. A diferencia de variable, los locals no son entradas — se calculan dentro de la config a partir de variables, otros locals o atributos de recursos. Usalos para nombrar algo una vez y reutilizarlo en todos lados.
locals {
environment = "dev"
service = "orders"
location = "westus2"
# A naming convention computed once, reused everywhere.
name_prefix = "myorg-${local.service}-${local.environment}"
common_tags = {
environment = local.environment
service = local.service
managed_by = "terraform"
}
}
Interpolación de strings ${...}
Dentro de un string HCL entre comillas dobles, ${ ... } incrusta cualquier expresión: variables, locals, llamadas a funciones. Así se arman nombres y rutas. Funciones de Terraform como lower(...), format(...) y substr(...) suelen anidarse dentro de ${...}.
resource "azurerm_resource_group" "app" {
name = "${local.name_prefix}-rg" # => myorg-orders-dev-rg
location = local.location
tags = local.common_tags
}
resource "azurerm_storage_account" "state" {
# names must be lowercase & no dashes: build with functions
name = lower("myorg${local.service}${local.environment}sa")
resource_group_name = azurerm_resource_group.app.name
location = local.location
}
locals vs variables
Regla práctica: si quien llama debería setearlo, hacelo variable. Si es derivado de otros valores y quien llama nunca debería sobreescribirlo, hacelo local. Abusar de locals para cosas que deberían ser entradas vuelve rígido al módulo; abusar de variables para valores derivados lo vuelve ruidoso.
Construí la convención de nombres
Escribí resourceName(env, service, type) que devuelva el nombre en minúsculas unido por guiones "{env}-{service}-{type}" — el gemelo en TS del patrón local.name_prefix. Logueá resourceName("dev", "orders", "rg") (esperá "dev-orders-rg") y resourceName("PROD", "Billing", "kv") (esperá "prod-billing-kv", ojo con las minúsculas).