Terraform 7: El bloque terraform{} y las restricciones de versión de proveedores
easy⏱ 5 mincourseterraform
El bloque de configuración terraform{}
El bloque terraform{} contiene la configuración de Terraform en sí — no de tu infraestructura. Aquí viven primero dos cosas: required_version (qué versiones del CLI pueden ejecutar este código) y required_providers (qué plugins descargar y de dónde). Cada proveedor nombra un source (namespace/tipo, resuelto desde el Registry público) y una restricción version.
terraform {
required_version = ">= 1.5.0"
required_providers {
azurerm = {
source = "hashicorp/azurerm"
version = "~> 4.0"
}
random = {
source = "hashicorp/random"
version = "~> 3.6"
}
}
}
El operador pesimista ~>
~> permite que el componente más a la derecha aumente, y nada a su izquierda. ~> 4.0 significa >= 4.0.0 y < 5.0.0 — recibís correcciones y funciones de 4.x pero nunca el salto rompedor a 5.0. ~> 4.3.1 es más estricto: >= 4.3.1 y < 4.4.0. Restringí siempre los proveedores para que un terraform init nuevo no traiga en silencio una versión mayor que rompa tu plan.
# ~> 4.0 → >= 4.0.0, < 5.0.0 (allow 4.x)
# ~> 4.3 → >= 4.3.0, < 5.0.0 (allow 4.x, at least 4.3)
# ~> 4.3.1 → >= 4.3.1, < 4.4.0 (allow patches only)
# >= 3.2.0 → any version at or above 3.2.0 (no upper bound — risky)
El archivo lock fija la versión exacta
Tu restricción es un rango; terraform init escribe luego la versión exacta seleccionada y sus checksums en .terraform.lock.hcl. Commiteá ese archivo lock — garantiza que compañeros y CI resuelvan el mismo build del proveedor. Ejecutá terraform init -upgrade para moverte dentro de tu restricción y refrescar el lock.
Modelá un requisito de proveedor
Construí un objeto providerReq con las claves source ("hashicorp/azurerm") y version ("~> 4.0"). Escribí una función allowedRange(constraint: string) que, para una restricción ~> X.0, devuelva el string ">= X.0.0, < (X+1).0.0". Logueá allowedRange(providerReq.version) — para ~> 4.0 debe imprimir >= 4.0.0, < 5.0.0.