Terraform Associate

Deep Dive

Practicar ahora
D2 · Flujo de trabajo de Terraform

Comandos CLI: init, plan, apply, destroy y más

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.

terraform init

Inicializa el directorio de trabajo. Debe ejecutarse antes de cualquier otro comando, después de crear una nueva configuración o cambiar providers/backends.

FlagDescripciónCuándo usarlo
-upgradeActualiza los providers al rango más alto permitido por los constraintsCuando quieres usar versiones más nuevas de providers
-reconfigureReconfigura el backend ignorando el estado anterior guardadoCuando cambias la configuración del backend
-migrate-stateMueve el estado existente al nuevo backend configuradoCuando cambias de backend local a remoto (o viceversa)
-backend-configPasa configuración parcial del backend como argumento o archivoPara no hardcodear credenciales en el bloque backend {}
-backend=falseOmite la inicialización del backendEn módulos que no tienen backend propio
-get=falseOmite la descarga de módulosCuando 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

terraform plan

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.

FlagDescripció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.
-destroyGenera un plan de destrucción de todos los recursos (equivalente a terraform destroy pero solo el plan)
-refresh-onlySolo 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=falseSalta el refresco del estado (más rápido pero puede no detectar cambios manuales externos)
-parallelism=NNú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 y destroy

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.

terraform fmt y validate

ComandoQué haceFlags importantes
terraform fmtReformatea 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 validateVerifica 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.

output, show, graph y más

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?