Terraform Associate

Deep Dive

Practicar ahora
D2 · Flujo de trabajo de Terraform

El ciclo Write → Plan → Apply

El flujo de trabajo central de Terraform consta de tres fases que debes entender en profundidad para el examen: qué ocurre internamente en cada una, qué archivos se generan y cómo gestionar el directorio de trabajo.

El ciclo Write → Plan → Apply

✏️

1. Write

Escribes archivos .tf en HCL describiendo el estado deseado de la infraestructura.

  • Editas main.tf, variables.tf, outputs.tf, etc.
  • Ningún recurso cloud se crea aún
  • Solo existe en tu disco como texto
  • Se versiona en Git como cualquier código

🔍

2. Plan

Terraform compara el estado deseado (código) con el estado actual (tfstate) y calcula las diferencias.

  • Refresca el estado consultando las APIs cloud
  • Construye el grafo de dependencias
  • Muestra qué se creará (+), destruirá (-), cambiará (~)
  • Opcionalmente guarda el plan en un archivo binario

🚀

3. Apply

Ejecuta las llamadas a API cloud necesarias y actualiza el archivo de estado con los resultados.

  • Llama a las APIs del provider (AWS, Azure, GCP…)
  • Crea/modifica/destruye recursos en orden
  • Actualiza terraform.tfstate con el nuevo estado
  • Pide confirmación (yes) salvo -auto-approve

Fase Write: autoría de configuración

Durante la fase de escritura, solo editas archivos de texto. Terraform no se comunica con ninguna API cloud en esta fase. Lo importante es que el código sea válido sintácticamente (lo verifica terraform validate) y bien formateado (terraform fmt).

# main.tf — describes el estado DESEADO
resource "aws_s3_bucket" "data" {
  bucket = "mi-empresa-datos-prod"
}

resource "aws_s3_bucket_versioning" "data" {
  bucket = aws_s3_bucket.data.id   # referencia crea dependencia implícita
  versioning_configuration {
    status = "Enabled"
  }
}

💡 Antes del primer init

Después de escribir la configuración, debes ejecutar terraform init para descargar los providers y módulos. Sin init, plan y apply fallarán porque no existen los plugins.

Fase Plan: qué va a cambiar

terraform plan es la fase más importante para el examen. Internamente realiza varios pasos:

1

Carga la configuración

Lee todos los archivos .tf del directorio de trabajo y los parsea.

2

Carga el estado actual

Lee terraform.tfstate (local o remoto) para conocer el estado real conocido.

3

Refresca el estado

Consulta las APIs cloud para verificar que el estado en tfstate aún coincide con la realidad (puede detectar drift).

4

Construye el grafo

Genera un DAG (grafo acíclico dirigido) con las dependencias entre recursos.

5

Calcula el diff

Compara configuración deseada vs estado actual y determina: + crear, - destruir, ~ modificar, -/+ reemplazar.

6

Muestra el plan

Imprime los cambios en pantalla y/o guarda el plan binario (-out=plan.out).

SímboloSignificadoEjemplo
+Crear recurso nuevoaws_vpc.main will be created
-Destruir recurso existenteaws_vpc.old will be destroyed
~Modificar recurso in-placeaws_instance.web will be updated in-place
-/+Destruir y recrear (reemplazar)aws_instance.web must be replaced
<=Leer data sourcedata.aws_ami.ubuntu will be read

Fase Apply: ejecución real

Apply ejecuta las llamadas a API definidas en el plan. Si se pasa un archivo de plan (terraform apply plan.out), Terraform usa exactamente ese plan sin recalcular. Si no se pasa, genera un nuevo plan y pide confirmación.

# Flujo recomendado en producción:
terraform plan -out=tfplan    # guarda el plan exacto
terraform apply tfplan        # aplica exactamente ese plan (sin confirmación manual)

# Flujo rápido (desarrollo):
terraform apply               # genera plan + pide "yes"
terraform apply -auto-approve # genera plan + aplica sin preguntar

⚠️ Apply modifica infraestructura real

Usa -auto-approve solo en pipelines de CI/CD donde ya revisaste el plan en el paso anterior. Nunca en producción desde tu máquina sin revisar el plan primero.

Directorio de trabajo y .terraform/

Después de terraform init, se crea el directorio .terraform/ con todo lo necesario para ejecutar plan y apply.

.terraform/providers/

Binarios de los providers descargados desde el registry. Pesados, no se cometen al VCS.

.terraform/modules/

Módulos descargados de fuentes remotas (registry, GitHub, S3…).

.terraform/terraform.tfstate

Estado del backend (solo si usas backend remoto). No es el tfstate principal.

terraform.tfstate

El estado principal (backend local). Contiene el estado real de la infra gestionada.

terraform.tfstate.backup

Copia de seguridad automática del tfstate anterior a cada apply.

.terraform.lock.hcl

Lock file de versiones de providers. SÍ se commitea al VCS.

Lock file y qué commitear al VCS

El archivo .terraform.lock.hcl fija las versiones exactas de los providers instalados para que todos los miembros del equipo usen exactamente las mismas versiones.

# .terraform.lock.hcl (generado por terraform init)
provider "registry.terraform.io/hashicorp/aws" {
  version     = "5.31.0"
  constraints = "~> 5.0"
  hashes = [
    "h1:ABC123...",   # hash del binario para verificación de integridad
    "zh:XYZ789...",
  ]
}
Archivo / Directorio¿Commitear?Motivo
*.tf✅ SíEs el código fuente de la infraestructura
.terraform.lock.hcl✅ SíFija versiones exactas de providers para reproducibilidad
terraform.tfstate❌ NoDatos sensibles en texto plano; usar backend remoto
terraform.tfstate.backup❌ NoMismo motivo que tfstate
.terraform/❌ NoBinarios pesados regenerables con terraform init
*.tfvars con secretos❌ NoCredenciales, tokens, contraseñas
*.auto.tfvars sin secretos✅ SíVariables de entorno no sensibles (región, tamaños, etc.)

¿Entendiste este tema?

Pon a prueba lo que acabas de aprender

Un desarrollador ejecuta terraform plan y observa que un recurso aws_instance aparece marcado con -/+. ¿Qué significa esto y qué ocurrirá en el siguiente apply?