Concepto clave
En el mundo de DevOps, Terraform es como un arquitecto digital que diseña y construye infraestructura cloud usando código. Imagina que en lugar de dibujar planos en papel, escribes instrucciones precisas en un lenguaje que las máquinas entienden. Esto es Infraestructura como Código (IaC): definir servidores, redes y bases de datos en archivos de texto, no en interfaces gráficas.
La analogía perfecta es una receta de cocina. Tu archivo main.tf es la receta: lista ingredientes (recursos AWS como EC2 o S3) y pasos (configuraciones). Terraform es el chef que ejecuta la receta, asegurando que cada plato (infraestructura) sea idéntico cada vez. Esto elimina la "deriva de configuración" donde entornos manuales divergen, causando errores en producción.
Cómo funciona en la práctica
El flujo de trabajo de Terraform sigue cuatro pasos fundamentales que automatizan el ciclo de vida de la infraestructura. Primero, escribes archivos .tf declarando recursos AWS. Segundo, ejecutas terraform init para descargar proveedores como AWS. Tercero, terraform plan muestra un "antes y después" sin cambios reales, como un simulacro. Finalmente, terraform apply despliega los recursos, y Terraform guarda el estado en un archivo terraform.tfstate para rastrear lo creado.
Por ejemplo, para lanzar una instancia EC2 en AWS, defines un recurso en Terraform especificando tipo, AMI y región. Terraform se comunica con AWS via API, creando la instancia y registrando su ID en el estado. Si modificas el código, Terraform compara con el estado y actualiza solo lo necesario, como cambiar el tipo de instancia de t2.micro a t2.medium.
Código en acción
Este ejemplo crea una VPC y una instancia EC2 en AWS. Copia y pega en un archivo main.tf para probarlo (necesitas credenciales AWS configuradas).
# Configuración del proveedor AWS
provider "aws" {
region = "us-east-1"
}
# Crear una VPC
resource "aws_vpc" "main" {
cidr_block = "10.0.0.0/16"
tags = {
Name = "vpc-leccion"
}
}
# Crear una subred pública
resource "aws_subnet" "public" {
vpc_id = aws_vpc.main.id
cidr_block = "10.0.1.0/24"
tags = {
Name = "subnet-publica"
}
}
# Crear una instancia EC2
resource "aws_instance" "web" {
ami = "ami-0c55b159cbfafe1f0" # Amazon Linux 2 AMI
instance_type = "t2.micro"
subnet_id = aws_subnet.public.id
tags = {
Name = "servidor-web"
}
}Después de ejecutar terraform apply, puedes refactorizar para mejorar. Aquí, agregamos un grupo de seguridad:
# Antes: instancia sin seguridad
# Después: agregar grupo de seguridad
resource "aws_security_group" "web_sg" {
vpc_id = aws_vpc.main.id
ingress {
from_port = 80
to_port = 80
protocol = "tcp"
cidr_blocks = ["0.0.0.0/0"]
}
tags = {
Name = "sg-web"
}
}
# Actualizar la instancia EC2
resource "aws_instance" "web" {
ami = "ami-0c55b159cbfafe1f0"
instance_type = "t2.micro"
subnet_id = aws_subnet.public.id
vpc_security_group_ids = [aws_security_group.web_sg.id]
tags = {
Name = "servidor-web-seguro"
}
}Errores comunes
- Estado no versionado: Guardar terraform.tfstate localmente causa pérdidas en equipos. Solución: Usar backend remoto como S3 con bloqueo DynamoDB.
- Credenciales hardcodeadas: Escribir access keys en archivos .tf compromete seguridad. Solución: Usar variables de entorno o AWS Secrets Manager.
- Recursos huérfanos: Eliminar código sin terraform destroy deja recursos en AWS, generando costos. Solución: Revisar terraform plan antes de aplicar y monitorear la consola AWS.
- Dependencias implícitas: No definir depends_on cuando recursos necesitan orden específico, como una subred antes de una instancia. Solución: Declarar dependencias explícitas en el código.
- Ignorar outputs: No usar output para valores como IPs de instancias, dificultando la integración. Solución: Definir outputs clave para automatizar pipelines.
Checklist de dominio
- ¿Puedes explicar la diferencia entre Terraform y herramientas como CloudFormation en una frase?
- ¿Has configurado un proveedor AWS con autenticación segura (ej., IAM roles)?
- ¿Sabes ejecutar terraform plan y interpretar los cambios propuestos?
- ¿Has manejado el archivo de estado remoto para colaboración en equipo?
- ¿Puedes crear y modificar al menos tres recursos AWS (ej., VPC, EC2, S3) con Terraform?
- ¿Entiendes cómo usar variables y outputs para hacer tu código reutilizable?
- ¿Has probado terraform destroy para limpiar recursos y evitar costos innecesarios?
Despliega una infraestructura básica web en AWS con Terraform
En este ejercicio, crearás una infraestructura simple para una aplicación web usando Terraform en AWS. Sigue estos pasos:
- Prepara tu entorno: Asegúrate de tener Terraform instalado y credenciales AWS configuradas (ej., con AWS CLI). Crea un directorio nuevo para el proyecto.
- Escribe la configuración: Crea un archivo main.tf con este código base:
provider "aws" { region = "us-east-1" } resource "aws_vpc" "web_vpc" { cidr_block = "192.168.0.0/16" tags = { Name = "vpc-web" } } - Extiende la infraestructura: Agrega recursos para:
- Una subred pública con CIDR 192.168.1.0/24.
- Un grupo de seguridad que permita tráfico HTTP (puerto 80) desde cualquier IP.
- Una instancia EC2 t2.micro con una AMI de Amazon Linux 2 (usa ami-0c55b159cbfafe1f0).
- Inicializa y planifica: Ejecuta terraform init y luego terraform plan. Verifica que los cambios propuestos coincidan con tu diseño.
- Aplica y verifica: Ejecuta terraform apply, confirma con "yes", y revisa la consola AWS para ver los recursos creados. Anota la IP pública de la instancia EC2.
- Limpia: Al finalizar, ejecuta terraform destroy para eliminar todos los recursos y evitar cargos.
- Usa la documentación de Terraform para AWS (registry.terraform.io/providers/hashicorp/aws) si necesitas sintaxis específica de recursos.
- Recuerda que la instancia EC2 debe referenciar la subnet y el grupo de seguridad usando sus IDs, como aws_subnet.public.id.
- Si terraform plan muestra errores, revisa la región y las credenciales AWS; prueba con aws configure list.
Evalua tu comprension
Completa el quiz interactivo de arriba para ganar XP.