Terraform 3: Fundamentos de HCL — bloques, argumentos, expresiones
easy⏱ 5 mincourseterraform
Bloques, etiquetas y argumentos
Un bloque HCL tiene un tipo (resource), cero o más etiquetas ("azurerm_resource_group", "orders") y un cuerpo de pares argumento = valor. Las dos etiquetas de un resource son el tipo del provider y un nombre local que usás para referenciarlo en otro lado.
# type label 1 (provider type) label 2 (local name)
resource "azurerm_resource_group" "orders" {
name = "myorg-orders-dev-rg" # argument = value
location = "westus2"
}
Expresiones y referencias
Los valores pueden ser expresiones: interpolación de strings con ${...}, referencias a otros bloques (azurerm_resource_group.orders.location), variables (var.env) y locals (local.name_prefix). Así evitás hardcodear — una fuente de verdad fluye a todos lados.
variable "env" { default = "dev" }
variable "service" { default = "orders" }
locals {
name_prefix = "${var.env}-${var.service}" # "dev-orders"
}
resource "azurerm_resource_group" "orders" {
name = "myorg-${local.name_prefix}-rg" # references the local
location = "westus2"
}
resource "azurerm_storage_account" "orders" {
name = "myorgordersdev"
resource_group_name = azurerm_resource_group.orders.name # reference
location = azurerm_resource_group.orders.location # reference
account_tier = "Standard"
account_replication_type = "LRS"
}
Las referencias crean dependencias
Cuando el bloque B referencia al bloque A, Terraform infiere que B depende de A y crea A primero. Este grafo de dependencias implícito — construido desde tus expresiones — es por qué casi nunca necesitás depends_on a mano. El orden en el archivo no importa; las referencias sí.
Construí un nombre como lo haría HCL
Escribí resourceName(env: string, service: string, type: string): string que devuelva {env}-{service}-{type} (ej. dev-orders-rg). Logueá resourceName("dev", "orders", "rg").