Terraform 35: Terraform Módulos 3: Fuentes y fijado de versión
easy⏱ 5 mincourseterraform
Tres tipos de source
Las rutas locales empiezan con ./ o ../ y se versionan con tu repo. Los módulos del registry usan una dirección NAMESPACE/NAME/PROVIDER y se fijan con un argumento version aparte. Las fuentes git usan una URL git:: (o SSH) y se fijan con un query ?ref= al final.
# local — versioned with this repo
module "rg" {
source = "./modules/resource-group"
}
# public registry — pin with `version`
module "naming" {
source = "Azure/naming/azurerm"
version = "~> 0.4"
}
# git over HTTPS — pin with ?ref=
module "tags" {
source = "git::https://git.example.com/myorg/terraform-common.git//azure/tags?ref=v1.4.0"
}
Siempre fijá un ref — nunca flotes sobre una rama
?ref=main significa que el módulo puede cambiar debajo tuyo entre applies. Fijá un tag inmutable como ?ref=v1.4.0 (o un SHA de commit). El // en una URL git selecciona un subdirectorio — así un repo terraform-common entrega muchos módulos.
version es solo para el registry
El argumento version funciona solo para fuentes del registry. Para git no podés usar version — el pin vive en el ?ref= de la URL. Confundirlos es un error clásico de la primera semana.
Clasificá una source y extraé su ref
Escribí classifySource(source) que devuelva { kind, ref }. kind es "local" si empieza con ./ o ../, "git" si contiene git:: o git@, si no "registry". ref es el valor tras ?ref= o null. Logueá JSON.stringify(classifySource("git::https://git.example.com/myorg/terraform-common.git//azure/tags?ref=v1.4.0")).