Terraform 11: Dependencias implícitas y depends_on
easy⏱ 5 mincourseterraform
Dependencias implícitas por referencias
Cuando el recurso B referencia un atributo del recurso A (como azurerm_resource_group.orders.name), Terraform infiere que A debe existir antes que B. Esto es una dependencia implícita — nunca declarás el orden; el grafo lo deriva de tus referencias e incluso paraleliza las ramas independientes.
resource "azurerm_resource_group" "orders" {
name = "myorg-orders-dev-rg"
location = "westus2"
}
# References orders.name → Terraform creates the group first, then this.
resource "azurerm_storage_account" "orders" {
name = "myorgordersdev"
resource_group_name = azurerm_resource_group.orders.name
location = azurerm_resource_group.orders.location
account_tier = "Standard"
account_replication_type = "LRS"
}
depends_on para orden oculto
A veces B debe esperar a A pero nunca lo referencia — p.ej. A otorga un rol IAM que el runtime de B necesita, sin pasar ningún atributo entre ellos. depends_on declara esa arista explícitamente. Toma una lista de direcciones de recursos (no strings, no atributos) y debe ser un último recurso: preferí una referencia real siempre que exista.
resource "azurerm_role_assignment" "orders_blob" {
scope = azurerm_storage_account.orders.id
role_definition_name = "Storage Blob Data Contributor"
principal_id = var.app_principal_id
}
resource "azurerm_storage_container" "orders" {
name = "uploads"
storage_account_id = azurerm_storage_account.orders.id
container_access_type = "private"
# Wait for the role even though we don't read any of its attributes.
depends_on = [azurerm_role_assignment.orders_blob]
}
Abusar de depends_on te perjudica
Cada depends_on innecesario serializa trabajo que Terraform podría haber paralelizado y puede forzar reemplazos más amplios al cambiar. Si te encontrás agregando depends_on donde una referencia a un atributo expresaría la misma relación, cambiá a la referencia — es más precisa y se autodocumenta.
Ordená topológicamente un grafo de dependencias
Dado graph que mapea cada recurso a la lista de la que depende, escribí creationOrder(graph) que devuelva los recursos de modo que cada dependencia venga antes que sus dependientes. Con rg sin dependencias, storage dependiendo de rg, y container de storage, logueá creationOrder(graph).join(" -> ") — debe imprimir rg -> storage -> container.