Terraform 41: un módulo reutilizable para nombres + tags
easy⏱ 5 mincourseterraform
Un módulo es una carpeta reutilizable de .tf
Un módulo es simplemente un directorio con variables.tf, main.tf y outputs.tf. Quien lo llama pasa inputs y consume outputs; los internos quedan encapsulados. Así se replica la misma forma en dev/uat/prod sin copiar-pegar.
# modules/naming/variables.tf
variable "environment" { type = string }
variable "service" { type = string }
variable "extra_tags" { type = map(string), default = {} }
Nombres estandarizados + tags fusionados
Calculá los nombres en un bloque locals para que la convención viva en un solo lugar, y usá merge() para combinar un set de tags base con overrides del caller. Cada recurso aguas abajo referencia local.tags y local.names.* — nunca un string ad-hoc.
# modules/naming/main.tf
locals {
names = {
rg = "${var.environment}-${var.service}-rg"
key_vault = "${var.service}-kv-${var.environment}"
sb_namespace = "${var.environment}-${var.service}-namespace"
}
tags = merge({
ManagedBy = "terraform"
Environment = var.environment
Service = var.service
}, var.extra_tags)
}
Exponé los resultados como outputs
Los outputs son la API pública del módulo. Quien lo llama lee module.naming.rg_name y module.naming.tags — nunca accede a los internos del módulo. Ese contrato es lo que hace al módulo intercambiable y testeable.
# modules/naming/outputs.tf
output "rg_name" { value = local.names.rg }
output "kv_name" { value = local.names.key_vault }
output "sb_namespace" { value = local.names.sb_namespace }
output "tags" { value = local.tags }
Fijá la convención, prohibí el one-off
El punto es que un nombre como prod-orders-rg solo se pueda producir de una forma. Si alguien necesita un nombre, llama al módulo — nada de strings a mano que divergen entre entornos y rompen la automatización que filtra por el patrón.
Construí el nombre estandarizado
Implementá resourceName(env, service, type) que devuelva `${env}-${service}-${type}` en minúsculas. Logueá resourceName("prod", "orders", "rg") — debe imprimir prod-orders-rg. Bonus verificado: las entradas en mayúscula se normalizan ("PROD" -> prod).