Concepto clave
La automatizacion y gestion de estado en Terraform son fundamentales para mantener infraestructura cloud consistente y repetible. Imagina que tu infraestructura es una receta de cocina: el codigo Terraform es la receta escrita, y el estado es el registro de que ingredientes ya tienes en tu despensa. Sin gestionar el estado, seria como cocinar sin saber que ya tienes en la nevera, pudiendo duplicar recursos o perder configuraciones.
El estado de Terraform (terraform.tfstate) es una base de datos que mapea tus recursos definidos en codigo con los recursos reales en AWS. Cuando ejecutas terraform apply, Terraform compara lo que esta en el estado con lo que esta en tu codigo, y genera un plan para sincronizarlos. Esto permite detectar drift (desviaciones) entre lo definido y lo desplegado, y corregirlo automaticamente.
Como funciona en la practica
Veamos un flujo tipico de trabajo con estado remoto en AWS:
- Configuras un backend S3 para almacenar el estado compartido entre tu equipo
- Escribes codigo Terraform que define recursos como EC2 o RDS
- Ejecutas terraform init para inicializar el backend
- Ejecutas terraform plan para ver que cambios se aplicarian
- Ejecutas terraform apply para crear/modificar recursos
- Terraform actualiza automaticamente el archivo de estado en S3
- Cualquier miembro del equipo que ejecute terraform plan vera el estado actualizado
Este proceso asegura que todos trabajen sobre la misma version de la infraestructura, evitando conflictos y sobrescrituras accidentales.
Codigo en accion
Configuracion de backend S3 para estado remoto:
terraform {
backend "s3" {
bucket = "mi-bucket-terraform-state"
key = "produccion/terraform.tfstate"
region = "us-east-1"
encrypt = true
dynamodb_table = "terraform-state-lock"
}
}Ejemplo de modulo que usa datos del estado para referencia cruzada:
# Modulo de red (network.tf)
resource "aws_vpc" "main" {
cidr_block = "10.0.0.0/16"
tags = {
Name = "main-vpc"
}
}
# Modulo de instancias (instances.tf) que referencia el VPC creado
data "terraform_remote_state" "network" {
backend = "s3"
config = {
bucket = "mi-bucket-terraform-state"
key = "produccion/network/terraform.tfstate"
region = "us-east-1"
}
}
resource "aws_instance" "app_server" {
ami = "ami-0c55b159cbfafe1f0"
instance_type = "t2.micro"
subnet_id = data.terraform_remote_state.network.outputs.public_subnet_id
tags = {
Name = "app-server"
}
}Errores comunes
- Estado local en equipo: Guardar terraform.tfstate localmente causa conflictos cuando multiples personas trabajan en el mismo proyecto. Solucion: Usar siempre backend remoto como S3 con bloqueo via DynamoDB.
- Modificar recursos manualmente en AWS Console: Esto crea drift entre el estado y la realidad. Solucion: Siempre hacer cambios via Terraform, y si es necesario modificar manualmente, importar el recurso con terraform import.
- No versionar el estado: Perder historial de cambios del estado. Solucion: Habilitar versionado en el bucket S3 y considerar herramientas como Terraform Cloud para historial visual.
- Credenciales en el estado: El estado puede contener datos sensibles. Solucion: Usar cifrado en S3 y considerar backend que soporte encriptacion nativa.
- Estado demasiado grande: Un estado con miles de recursos se vuelve lento. Solucion: Modularizar la infraestructura en estados separados por entorno o componente.
Checklist de dominio
- Configurar backend S3 con DynamoDB para bloqueo de estado
- Ejecutar terraform plan antes de cada apply para revisar cambios
- Usar workspaces o directorios separados para entornos (dev/prod)
- Implementar pipelines CI/CD que manejen el estado automaticamente
- Saber usar terraform state list/mv/rm para gestionar recursos
- Configurar notificaciones cuando haya drift en la infraestructura
- Realizar backups periodicos del archivo de estado
Migracion de estado local a remoto en S3
En este ejercicio practico, migraras un proyecto Terraform existente con estado local a usar un backend remoto en AWS S3 con bloqueo via DynamoDB.
- Crea un bucket S3 en tu cuenta AWS con versionado habilitado. Nombralo terraform-state-tu-iniciales (ej: terraform-state-jpg)
- Crea una tabla DynamoDB con clave primaria LockID (tipo String) para manejar bloqueos
- En tu proyecto Terraform existente, crea un archivo backend.tf con la configuracion del backend S3, referenciando tu bucket y tabla DynamoDB
- Ejecuta terraform init y confirma la migracion cuando te pregunte si quieres copiar el estado local al nuevo backend
- Verifica que el estado se haya copiado correctamente listando los recursos con terraform state list
- Prueba el bloqueo ejecutando terraform apply en dos terminales simultaneamente para ver como la segunda se bloquea
- Finalmente, elimina el archivo terraform.tfstate local y verifica que todo funciona con el estado remoto
- Usa el comando aws s3api create-bucket para crear el bucket S3 desde CLI
- Recuerda que DynamoDB necesita permisos IAM para que Terraform pueda acceder a la tabla
- Si tienes errores de permisos, revisa las politicas IAM del usuario/rol que ejecuta Terraform
Evalua tu comprension
Completa el quiz interactivo de arriba para ganar XP.