Terraform es la herramienta de Infraestructura como Código (IaC) más usada del mundo. En lugar de hacer clic en la consola de AWS o Azure, describes tu infraestructura en código y Terraform la crea, modifica y destruye por ti.
¿Qué es Infraestructura como Código?
IaC significa que tu infraestructura — servidores, redes, bases de datos, DNS — vive en archivos de código versionados en Git. Las ventajas son enormes: reproducibilidad total, historial de cambios, revisión de código para cambios de infraestructura, y ambientes idénticos de desarrollo, staging y producción.
Instalación
# Linux/macOS (usando tfenv para gestionar versiones)
git clone https://github.com/tfutils/tfenv.git ~/.tfenv
echo 'export PATH="$HOME/.tfenv/bin:$PATH"' >> ~/.bashrc
tfenv install latest
tfenv use latest
# Verificar
terraform version
Conceptos fundamentales
| Concepto | Descripción |
|---|---|
| Provider | Plugin que conecta con una plataforma: AWS, Azure, GCP, DigitalOcean, Docker, etc. |
| Resource | Un objeto de infraestructura: instancia EC2, grupo de seguridad, bucket S3. |
| State | Archivo .tfstate que mapea tu código con la infraestructura real. No editar manualmente. |
| Plan | Vista previa de cambios antes de aplicarlos. Como un git diff para infraestructura. |
| Module | Grupo reutilizable de recursos. Como una función en programación. |
Primer archivo: servidor en DigitalOcean
# main.tf
terraform {
required_providers {
digitalocean = {
source = "digitalocean/digitalocean"
version = "~> 2.0"
}
}
}
# Configurar el provider con tu token
provider "digitalocean" {
token = var.do_token
}
# Variable para el token (no hardcodear credenciales)
variable "do_token" {
description = "DigitalOcean API Token"
type = string
sensitive = true
}
# Crear un Droplet (VPS)
resource "digitalocean_droplet" "web" {
name = "mi-servidor-web"
region = "nyc3"
size = "s-1vcpu-1gb" # $6/mes
image = "ubuntu-22-04-x64"
tags = ["web", "production"]
}
# Mostrar la IP al terminar
output "ip_publica" {
value = digitalocean_droplet.web.ipv4_address
}
El flujo de trabajo
# 1. Inicializar: descarga providers
terraform init
# 2. Ver qué va a crear/cambiar/destruir (sin hacer nada)
terraform plan
# 3. Aplicar los cambios
terraform apply
# Te muestra el plan y pide confirmación:
# Plan: 1 to add, 0 to change, 0 to destroy.
# Do you want to perform these actions? yes
# 4. Ver el estado actual
terraform show
# 5. Destruir toda la infraestructura cuando no la necesites
terraform destroy
Variables y archivos de variables
# terraform.tfvars (NO subir a Git si tiene secretos)
do_token = "tu_token_aqui"
# O pasar por variable de entorno (recomendado para CI/CD)
export TF_VAR_do_token="tu_token_aqui"
terraform apply
Backend remoto: state en equipo
# Guardar el state en un bucket S3 (para trabajo en equipo)
terraform {
backend "s3" {
bucket = "mi-terraform-state"
key = "production/terraform.tfstate"
region = "us-east-1"
encrypt = true
}
}
✅ Reglas de oro: Nunca editar el .tfstate manualmente · State remoto para trabajo en equipo · terraform plan siempre antes de apply · Variables sensibles por env vars o Vault · Un directorio por ambiente (dev/staging/prod)
"Con Terraform puedes crear un ambiente completo de 50 recursos en 5 minutos y destruirlo en 2. Eso cambia por completo cómo piensas la infraestructura."