Terraform 34: Terraform Módulos 2: Escribir tu propio módulo
easy⏱ 5 mincourseterraform
Inputs adentro, outputs afuera
Anatomía de una carpeta de módulo: variables.tf declara inputs tipados (algunos con default), main.tf construye recursos a partir de ellos y outputs.tf expone los valores que necesita el invocador. Los inputs son la única entrada; los outputs, la única salida.
# modules/resource-group/variables.tf
variable "environment_name" {
type = string
}
variable "service" {
type = string
}
variable "location" {
type = string
default = "westus2"
}
# modules/resource-group/main.tf
resource "azurerm_resource_group" "rg" {
name = "myorg-${var.service}-${var.environment_name}-rg"
location = var.location
}
# modules/resource-group/outputs.tf
output "name" {
value = azurerm_resource_group.rg.name
}
output "id" {
value = azurerm_resource_group.rg.id
}
Tipá tus variables, poné default a las opcionales
Siempre poné type. Agregá default solo para valores que el invocador pueda omitir razonablemente (como location). Los inputs sin default son obligatorios — si el invocador los omite, falla la validación, que es justo la barrera que querés para settings críticos.
No hardcodees el entorno dentro del módulo
Mantené los módulos agnósticos del entorno: nunca hornees dev en un nombre o SKU. Pasá environment_name como input para que el mismo módulo sirva a dev, uat y prod. Hardcodear mata la reutilización — el sentido mismo de un módulo.
Implementá la convención de nombres
El módulo nombra los resource groups como myorg-<service>-<env>-rg. Escribí resourceGroupName(service, env) que devuelva ese string y logueá resourceGroupName("orders", "dev") — esperá myorg-orders-dev-rg.