Herramienta de Infrastructure as Code de HashiCorp que permite definir, provisionar y gestionar infraestructura multi-cloud mediante archivos declarativos en HCL.
Terraform es la herramienta de IaC más adoptada del mercado. Usa un lenguaje declarativo (HCL) para definir infraestructura y un modelo de estado para rastrear qué recursos existen y cómo actualizarlos.
Write (.tf files) → Plan (preview changes) → Apply (execute changes)
terraform init # Descargar providers y módulos
terraform validate # Verificar sintaxis
terraform plan # Ver qué va a cambiar
terraform apply # Aplicar cambios
terraform destroy # Eliminar toda la infraestructuraPlugins que conectan Terraform con APIs de servicios:
terraform {
required_providers {
aws = {
source = "hashicorp/aws"
version = "~> 5.0"
}
}
}
provider "aws" {
region = "us-east-1"
}Más de 4,000 providers: AWS, Azure, GCP, Kubernetes, GitHub, Datadog, Cloudflare, etc.
Unidad básica — un recurso de infraestructura:
resource "aws_s3_bucket" "data" {
bucket = "my-app-data-${var.environment}"
tags = {
Environment = var.environment
ManagedBy = "terraform"
}
}
resource "aws_s3_bucket_versioning" "data" {
bucket = aws_s3_bucket.data.id
versioning_configuration {
status = "Enabled"
}
}# variables.tf
variable "environment" {
description = "Deployment environment"
type = string
validation {
condition = contains(["dev", "staging", "prod"], var.environment)
error_message = "Must be dev, staging, or prod."
}
}
variable "instance_count" {
description = "Number of instances"
type = number
default = 2
}# terraform.tfvars
environment = "prod"
instance_count = 3output "bucket_arn" {
description = "ARN of the S3 bucket"
value = aws_s3_bucket.data.arn
}
output "api_url" {
description = "API Gateway URL"
value = aws_apigatewayv2_api.main.api_endpoint
sensitive = false
}Leer información de recursos existentes (no gestionados por Terraform):
data "aws_ami" "amazon_linux" {
most_recent = true
owners = ["amazon"]
filter {
name = "name"
values = ["al2023-ami-*-x86_64"]
}
}
resource "aws_instance" "web" {
ami = data.aws_ami.amazon_linux.id
instance_type = "t3.micro"
}El state file es la fuente de verdad sobre qué recursos existen:
# Backend remoto (obligatorio para equipos)
terraform {
backend "s3" {
bucket = "company-terraform-state"
key = "services/api/terraform.tfstate"
region = "us-east-1"
dynamodb_table = "terraform-locks" # Locking
encrypt = true # Encryption at rest
}
}terraform state list # Listar recursos
terraform state show aws_instance.web # Detalle de un recurso
terraform state mv aws_instance.old aws_instance.new # Renombrar
terraform state rm aws_instance.legacy # Dejar de gestionar
terraform import aws_instance.web i-1234567890 # Importar existentePaquetes reutilizables de infraestructura:
# Módulo propio
module "api" {
source = "./modules/lambda-api"
function_name = "my-api"
runtime = "nodejs20.x"
memory_size = 256
environment = var.environment
}
# Módulo del registry
module "vpc" {
source = "terraform-aws-modules/vpc/aws"
version = "5.5.0"
name = "production"
cidr = "10.0.0.0/16"
}modules/lambda-api/
├── main.tf # Resources
├── variables.tf # Inputs
├── outputs.tf # Outputs
├── versions.tf # Provider requirements
└── README.md # Documentation
Múltiples entornos con el mismo código:
terraform workspace new staging
terraform workspace new production
terraform workspace select staging
terraform apply -var-file="staging.tfvars"# Crear múltiples recursos
resource "aws_iam_user" "team" {
for_each = toset(["alice", "bob", "carol"])
name = each.key
}
# Condicional
resource "aws_cloudwatch_log_group" "api" {
count = var.enable_logging ? 1 : 0
name = "/api/${var.environment}"
}moved {
from = aws_instance.server
to = aws_instance.web
}| Aspecto | Terraform | Pulumi | AWS CDK | CloudFormation |
|---|---|---|---|---|
| Lenguaje | HCL | TS, Python, Go | TS, Python | YAML/JSON |
| Multi-cloud | Sí | Sí | No (AWS) | No (AWS) |
| State | Self-managed/Cloud | Managed/self | AWS-managed | AWS-managed |
| Ecosistema | 4,000+ providers | 100+ providers | AWS only | AWS only |
| Licencia | BSL 1.1 | Apache 2.0 | Apache 2.0 | Propietario |
| Fork OSS | OpenTofu | — | — | — |
# Nunca hardcodear secretos
variable "db_password" {
type = string
sensitive = true # No aparece en logs ni plan
}
# Usar data sources para secretos
data "aws_secretsmanager_secret_version" "db" {
secret_id = "prod/db/password"
}main.tf. Dividir por dominio.terraform fmt — formateo consistente facilita code review.Terraform se ha convertido en el estándar de facto para infraestructura como código. Dominarlo no es opcional para equipos que operan en la nube — es la diferencia entre infraestructura reproducible y auditable, y configuración manual que nadie puede reconstruir cuando falla.
Práctica de definir y gestionar infraestructura mediante archivos de configuración versionados en lugar de procesos manuales. Fundamento de la automatización moderna de operaciones.
Conjunto de prácticas técnicas y culturales que implementan los principios DevOps — desde Infrastructure as Code hasta blameless post-mortems. El «cómo» detrás de la filosofía.
Continuous Integration y Continuous Delivery/Deployment — prácticas que automatizan la integración de código, testing y entrega a producción. Fundamento de la ingeniería de software moderna.
Módulos Terraform reutilizables para gestionar contenedores Docker y AWS ECS Fargate, con ejemplos progresivos y testing local con LocalStack.
Colección de 13 módulos Terraform publicados en el Terraform Registry para desplegar arquitecturas serverless en AWS, con 12 ejemplos que cubren desde ECS básico hasta CRUD full-stack con DynamoDB y AgentCore con MCP.
GitHub App serverless que auto-aprueba pull requests después de que CI pasa, con revisión de código opcional vía Amazon Bedrock. Cinco repositorios: app TypeScript/Probot, módulo Terraform AWS (Lambda + API Gateway + Secrets Manager + SQS DLQ), módulo Terraform GitHub (webhooks), infra de despliegue y repo de pruebas.
Sistema de tres agentes que automatiza el ciclo de vida de contenido MDX bilingüe: auditoría QA determinística, correcciones quirúrgicas y upgrades completos — todo orquestado con Strands Agents, Claude Sonnet 4 en Amazon Bedrock y GitHub Actions con patrón diamante.
Fork open source de Terraform mantenido por la Linux Foundation. Compatible con HCL y providers de Terraform, creado en respuesta al cambio de licencia de HashiCorp a BSL 1.1.
Servicio nativo de AWS para definir y aprovisionar infraestructura como código usando plantillas YAML o JSON, con gestión de estado y rollback automático.