Terraform Associate
Deep Dive
Dominar los flags de cada comando CLI es imprescindible para el examen. Esta guía cubre cada comando con sus opciones más importantes y cuándo usarlas.
Contenido
Inicializa el directorio de trabajo. Debe ejecutarse antes de cualquier otro comando, después de crear una nueva configuración o cambiar providers/backends.
| Flag | Descripción | Cuándo usarlo |
|---|---|---|
| -upgrade | Actualiza los providers al rango más alto permitido por los constraints | Cuando quieres usar versiones más nuevas de providers |
| -reconfigure | Reconfigura el backend ignorando el estado anterior guardado | Cuando cambias la configuración del backend |
| -migrate-state | Mueve el estado existente al nuevo backend configurado | Cuando cambias de backend local a remoto (o viceversa) |
| -backend-config | Pasa configuración parcial del backend como argumento o archivo | Para no hardcodear credenciales en el bloque backend {} |
| -backend=false | Omite la inicialización del backend | En módulos que no tienen backend propio |
| -get=false | Omite la descarga de módulos | Cuando solo quieres reinstalar providers |
# Primera inicialización terraform init # Actualizar providers a versiones más nuevas terraform init -upgrade # Migrar estado de local a S3 terraform init -migrate-state # Pasar backend config sin hardcodear en .tf terraform init -backend-config="bucket=my-tfstate" -backend-config="region=us-east-1" terraform init -backend-config=backend.hcl # desde archivo
Genera y muestra el plan de ejecución sin hacer cambios reales. Es el comando más usado en el día a día.
| Flag | Descripción |
|---|---|
| -out=<archivo> | Guarda el plan en un archivo binario para aplicarlo exactamente después con terraform apply <archivo> |
| -target=<recurso> | Limita el plan a un recurso específico (ej: -target=aws_vpc.main). Usar con cuidado. |
| -destroy | Genera un plan de destrucción de todos los recursos (equivalente a terraform destroy pero solo el plan) |
| -refresh-only | Solo refresca el estado contra la realidad sin planificar cambios de config (detecta drift) |
| -var="clave=valor" | Define una variable inline. Puede repetirse para múltiples variables. |
| -var-file=<archivo> | Carga variables desde un archivo .tfvars adicional |
| -refresh=false | Salta el refresco del estado (más rápido pero puede no detectar cambios manuales externos) |
| -parallelism=N | Número de operaciones concurrentes (default: 10) |
# Plan normal terraform plan # Guardar plan (recomendado en pipelines CI/CD) terraform plan -out=tfplan.binary # Plan con variable inline terraform plan -var="environment=prod" -var="instance_type=t3.large" # Plan con archivo de variables terraform plan -var-file=prod.tfvars # Plan de solo refresco (detectar drift) terraform plan -refresh-only # Plan de destrucción terraform plan -destroy
💡 -target en producción
El flag -target es útil para emergencias pero puede dejar el estado inconsistente. HashiCorp recomienda no usarlo de forma habitual. Si necesitas aplicar solo parte de la config, considera estructurar en módulos separados.
terraform apply
# Aplica generando nuevo plan (pide yes) terraform apply # Aplica sin confirmación (CI/CD) terraform apply -auto-approve # Aplica un plan guardado (sin pedir confirmación) terraform apply tfplan.binary # Aplica solo un recurso específico terraform apply -target=aws_vpc.main # Con variables terraform apply -var="env=prod" terraform apply -var-file=prod.tfvars
terraform destroy
# Destruye todos los recursos (pide yes) terraform destroy # Sin confirmación (PELIGROSO en prod) terraform destroy -auto-approve # Destruye solo un recurso terraform destroy -target=aws_instance.web # Alternativa equivalente: terraform apply -destroy terraform apply -destroy -auto-approve
⚠️ terraform destroy es irreversible
Destroy elimina los recursos reales en la nube. Antes de destruir en producción, verifica el plan con terraform plan -destroy y considera usar prevent_destroy = true en el lifecycle de recursos críticos.
| Comando | Qué hace | Flags importantes |
|---|---|---|
| terraform fmt | Reformatea los .tf del directorio actual al estilo canónico de HCL (2 espacios, = alineados) | -recursive: también subdirectorios | -check: solo verifica, no modifica (útil en CI) | -diff: muestra diff sin aplicar |
| terraform validate | Verifica que la configuración es sintácticamente válida y consistente internamente (sin conectar a APIs) | -json: salida en JSON para CI/CD |
# Formatear todos los .tf del directorio actual terraform fmt # Formatear recursivamente (incluye subdirectorios / módulos) terraform fmt -recursive # Solo verificar formato sin modificar (para CI) terraform fmt -check terraform fmt -check -recursive # Validar sintaxis y coherencia interna terraform validate # Combo recomendado en pre-commit hooks: terraform fmt -check && terraform validate
💡 validate vs plan
terraform validate verifica la sintaxis y referencias internas sin conectarse a las APIs cloud. No detecta errores de permisos ni nombres de recursos inválidos. terraform plan sí conecta a las APIs y detecta esos errores.
terraform output
Muestra los valores de los outputs del estado actual.
terraform output # todos los outputs terraform output vpc_id # output específico terraform output -json # todos en JSON terraform output -json vpc_id # uno en JSON
terraform show
Muestra el estado actual (tfstate) o el contenido de un archivo de plan en formato legible.
terraform show # muestra el estado actual terraform show tfplan.binary # muestra el plan guardado terraform show -json # estado en JSON
terraform graph
Genera el grafo de dependencias en formato DOT (visualizable con Graphviz).
terraform graph # genera DOT a stdout terraform graph | dot -Tsvg > infra.svg # visualizar
terraform force-unlock
Libera manualmente un lock de estado que quedó bloqueado (ej: apply interrumpido). Requiere el ID del lock.
terraform force-unlock LOCK_ID
terraform login / logout
Autentica con HCP Terraform (app.terraform.io) para acceder a workspaces remotos.
terraform login # abre navegador para autenticar terraform logout # elimina el token local
terraform console
REPL interactivo para evaluar expresiones HCL. Útil para depurar funciones y referencias.
terraform console
> max(3, 5, 8)
8
> jsonencode({a = "b"})
"{\"a\":\"b\"}"¿Entendiste este tema?
Pon a prueba lo que acabas de aprender
Un equipo usa un pipeline de CI/CD con dos etapas: la primera genera el plan y la segunda lo aplica. ¿Qué secuencia de comandos garantiza que exactamente el plan revisado sea el que se aplica?