Uso de Terraform con AWS: La Guía Completa
Uso de Terraform con AWS: La Guía Completa
La gestión de infraestructura ha evolucionado desde clics manuales en consolas y scripts frágiles hasta código declarativo que se puede versionar, revisar y compartir. Para los equipos que trabajan en Amazon Web Services, Terraform se ha convertido en el estándar para infraestructura como código (IaC), y saber cómo usar terraform con aws de manera efectiva es ahora una habilidad fundamental para los ingenieros en la nube. Esta guía te lleva a través del flujo de trabajo completo, desde la configuración del proveedor de AWS hasta el despliegue de recursos reales con prácticas de nivel profesional.
Lo Que Aprenderás
Al finalizar esta guía, comprenderás el flujo de trabajo completo de Terraform en AWS, desde la configuración del proveedor y la definición de recursos hasta la gestión del estado y la colaboración en equipo. Podrás desplegar, actualizar y destruir infraestructura de AWS con confianza usando el enfoque declarativo de Terraform, y obtendrás un modelo mental claro para estructurar tus propios proyectos. También aprenderás medidas de seguridad prácticas para evitar errores costosos, como desplegar en la cuenta de AWS equivocada.
Comprendiendo los Conceptos Clave: Proveedores, Recursos y Estado
Antes de escribir cualquier configuración, es útil entender los bloques fundamentales de Terraform. A diferencia de AWS CloudFormation —que es nativo de AWS y asume que los recursos se crean dentro de una cuenta de AWS— Terraform es independiente de la nube y requiere que declares explícitamente proveedores que interactúan con APIs específicas.
¿Qué es un Proveedor?
Un proveedor es un plugin que actúa como puente entre Terraform y una plataforma objetivo. El Proveedor de AWS es lo que permite a Terraform llamar a las APIs de AWS para crear, leer, actualizar y eliminar recursos. Dado que Terraform admite múltiples proveedores —AWS, Kubernetes, Helm e incluso herramientas SaaS de terceros— puedes aprovisionar un clúster de Amazon EKS y desplegar charts de Helm en él dentro de la misma configuración.
Recursos y Fuentes de Datos
Un recurso define un componente de tu infraestructura: una instancia EC2, un bucket S3 o un grupo de seguridad. Los recursos se declaran de forma declarativa: especificas qué quieres, y Terraform descubre cómo crearlo.
Una fuente de datos, por otro lado, consulta a AWS para obtener información sobre recursos existentes. Por ejemplo, en lugar de codificar un ID de AMI que podría cambiar o variar según la región, puedes usar una fuente de datos para obtener dinámicamente la AMI más reciente de Amazon Linux 2023.
Estado: La Fuente de Verdad
Terraform mantiene un archivo de estado que rastrea los recursos que gestiona. Este estado asigna tu configuración a la infraestructura real y es esencial para planificar actualizaciones, detectar desviaciones y eliminar recursos de manera limpia. Para entornos de equipo, se recomienda almacenar el estado en un backend remoto como Amazon S3 para evitar conflictos y garantizar la consistencia.
Primeros Pasos: Instalación de Herramientas y Configuración de Credenciales de AWS
Requisitos Previos
Antes de escribir una sola línea de configuración, configura tu entorno local:
- Terraform CLI 1.5 o posterior – Descarga el binario y agrégalo a tu PATH.
- AWS CLI – Instálalo y configúralo con credenciales IAM que tengan permisos suficientes.
- Una cuenta de AWS – Usa el Nivel Gratuito para practicar y evitar cargos inesperados.
Autenticación del Proveedor de AWS
El proveedor de AWS de Terraform se autentica usando los mismos métodos que la AWS CLI. El enfoque más simple es establecer variables de entorno con tus credenciales IAM:
export AWS_ACCESS_KEY_ID=<tu_clave_de_acceso>
export AWS_SECRET_ACCESS_KEY=<tu_clave_secreta>
Alternativamente, Terraform puede leer desde el archivo de credenciales predeterminado en ~/.aws/credentials.
Paso 1: Escribe Tu Primera Configuración de Terraform
Crea un nuevo directorio para tu proyecto y define el proveedor y los recursos. Los archivos de configuración de Terraform usan el Lenguaje de Configuración de HashiCorp (HCL) y terminan con .tf.
El Bloque terraform
El bloque terraform configura el propio Terraform, incluyendo las fuentes de los proveedores y las restricciones de versión. Fijar las versiones de los proveedores evita desviaciones inesperadas cuando se actualiza el proveedor.
terraform {
required_providers {
aws = {
source = "hashicorp/aws"
version = "~> 5.0"
}
}
required_version = ">= 1.2"
}
El argumento source apunta al proveedor en el Registro de Terraform. HashiCorp mantiene el proveedor de AWS, por lo que su fuente es hashicorp/aws.
El Bloque provider
El bloque provider configura el proveedor de AWS, incluyendo la región predeterminada:
provider "aws" {
region = "us-west-2"
}
Define una Instancia EC2
Un bloque resource declara un componente de infraestructura. Aquí te mostramos cómo definir una instancia EC2 usando una fuente de datos para obtener la AMI más reciente de Ubuntu:
data "aws_ami" "ubuntu" {
most_recent = true
owners = ["099720109477"] # Canonical
filter {
name = "name"
values = ["ubuntu/images/hvm-ssd-gp3/ubuntu-noble-24.04-amd64-server-*"]
}
}
resource "aws_instance" "app_server" {
ami = data.aws_ami.ubuntu.id
instance_type = "t2.micro"
tags = {
Name = "terraform-demo"
}
}
Usar una fuente de datos para la AMI mantiene tu configuración dinámica y portátil entre regiones.
Paso 2: Inicializa, Planifica y Aplica
El flujo de trabajo de Terraform consta de tres comandos principales:
terraform init
Inicializa el directorio de trabajo. Esto descarga los plugins de proveedores requeridos y configura el backend:
terraform init
Terraform lee el bloque required_providers e instala la versión del proveedor de AWS que especificaste.
terraform plan
Previsualiza los cambios que Terraform hará en tu infraestructura:
terraform plan
El plan muestra adiciones, modificaciones y eliminaciones; esta es tu oportunidad de detectar errores antes de aplicar.
terraform apply
Aplica la configuración para crear recursos. Terraform mostrará el plan nuevamente y pedirá confirmación:
terraform apply
Escribe yes para continuar. Terraform aprovisionará la instancia EC2 y mostrará los resultados.
terraform destroy
Cuando termines, limpia para evitar cargos:
terraform destroy
Terraform calcula qué eliminar según el archivo de estado y pide confirmación.
Paso 3: Agrega un Grupo de Seguridad y Lógica de Aprovisionamiento
Un servidor es inútil sin acceso a la red. Agrega un grupo de seguridad para controlar el tráfico entrante y saliente:
resource "aws_security_group" "web" {
name = "web-sg"
description = "Permitir HTTP y SSH"
vpc_id = var.vpc_id
ingress {
from_port = 80
to_port = 80
protocol = "tcp"
cidr_blocks = ["0.0.0.0/0"]
}
ingress {
from_port = 22
to_port = 22
protocol = "tcp"
cidr_blocks = ["10.0.0.0/16"] # Restringir SSH
}
egress {
from_port = 0
to_port = 0
protocol = "-1"
cidr_blocks = ["0.0.0.0/0"]
}
}
Adjunta el grupo de seguridad a tu instancia EC2 referenciando aws_security_group.web.id en el argumento vpc_security_group_ids.
Automatización de la Instalación de Software con Datos de Usuario
Usa los datos de usuario de EC2 para instalar software cuando la instancia se inicie por primera vez. Por ejemplo, para instalar Nginx en Amazon Linux 2023:
resource "aws_instance" "web" {
ami = data.aws_ami.al2023.id
instance_type = "t3.micro"
vpc_security_group_ids = [aws_security_group.web.id]
key_name = var.key_name
user_data = <<-EOF
#!/bin/bash
dnf install -y nginx
systemctl start nginx
echo "<h1>Hola desde Terraform</h1>" > /usr/share/nginx/html/index.html
EOF
}
Los datos de usuario se ejecutan durante el arranque inicial y son una forma sencilla de arrancar instancias sin herramientas adicionales de gestión de configuración.
Paso 4: Usa Variables, Salidas y Módulos
Variables para Reutilización
Codificar valores hace que las configuraciones sean frágiles. Define variables en un archivo variables.tf:
variable "instance_type" {
description = "Tipo de instancia EC2"
type = string
default = "t2.micro"
}
variable "aws_region" {
description = "Región de AWS"
type = string
default = "us-west-2"
}
Referencia las variables en tu configuración con var.instance_type.
Salidas para Mostrar Información
Las salidas te permiten recuperar información después de aplicar, como la IP pública de la instancia:
output "instance_public_ip" {
description = "IP pública de la instancia EC2"
value = aws_instance.app_server.public_ip
}
Módulos para Componentes Reutilizables
Los módulos son contenedores para múltiples recursos que se pueden compartir entre proyectos. El Registro de Terraform proporciona miles de módulos de la comunidad, y también puedes escribir los tuyos propios. Usar módulos mantiene tu configuración raíz limpia y promueve la reutilización.
Paso 5: Estado Remoto y Colaboración en Equipo
Para cualquier entorno de equipo, almacenar el estado localmente es peligroso: puede quedar desactualizado o entrar en conflicto con los cambios de otros usuarios. Configura un backend remoto, típicamente usando Amazon S3 con DynamoDB para el bloqueo de estado:
terraform {
backend "s3" {
bucket = "mi-bucket-de-estado-terraform"
key = "prod/terraform.tfstate"
region = "us-west-2"
encrypt = true
dynamodb_table = "terraform-locks"
}
}
Esta configuración asegura que el estado se comparta y se bloquee durante las operaciones de aplicación, evitando modificaciones concurrentes que podrían corromper el archivo de estado.
Paso 6: Mejores Prácticas de Seguridad
Restringir el Proveedor a Cuentas Específicas de AWS
Uno de los errores más peligrosos es ejecutar Terraform contra la cuenta de AWS equivocada —por ejemplo, con la intención de desplegar en desarrollo pero usando accidentalmente credenciales de producción. La configuración allowed_account_ids en el bloque del proveedor crea una red de seguridad:
provider "aws" {
region = "us-west-2"
allowed_account_ids = ["123456789012"] # Solo esta cuenta
}
Si intentas ejecutar Terraform con credenciales de una cuenta diferente, el plan generará un error de inmediato, evitando errores costosos.
Usa Roles IAM, No Claves Estáticas
Para instancias EC2, siempre usa perfiles de instancia IAM en lugar de incrustar credenciales estáticas. Esto mejora la seguridad y simplifica la rotación de credenciales.
Control de Versiones y Revisión
Todas las configuraciones de Terraform deben almacenarse en control de versiones. Las solicitudes de extracción para cambios de infraestructura deben revisarse como si fueran código de aplicación —este es el valor central de IaC.
Cómo Usar Terraform con AWS en Pipelines CI/CD
Integrar Terraform en pipelines CI/CD automatiza los despliegues y garantiza la consistencia. Un flujo de trabajo típico de GitHub Actions:
name: Terraform Apply
on:
push:
branches: [ main ]
jobs:
terraform:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: hashicorp/setup-terraform@v1
- name: Terraform Init
run: terraform init
- name: Terraform Plan
run: terraform plan
- name: Terraform Apply
run: terraform apply -auto-approve
Este enfoque elimina los pasos manuales de aplicación y asegura que cada fusión en la rama principal despliegue infraestructura que ha sido revisada y probada.
Preguntas Frecuentes
1. ¿Cuál es la diferencia entre Terraform y AWS CloudFormation?
Terraform es independiente de la nube y admite múltiples proveedores —AWS, Azure, Google Cloud y cientos más— mientras que CloudFormation es solo para AWS. Terraform también ofrece un flujo de trabajo más flexible con etapas de planificación/aplicación y admite una gama más amplia de recursos de terceros.
2. ¿Dónde almacena Terraform el estado de mi infraestructura?
Por defecto, Terraform almacena el estado en un archivo local terraform.tfstate. Para producción y uso en equipo, debes configurar un backend remoto como Amazon S3 para almacenar el estado de forma centralizada con bloqueo para evitar conflictos.
3. ¿Qué son los módulos de Terraform y por qué debería usarlos?
Los módulos son contenedores para múltiples recursos que se pueden reutilizar entre proyectos. Usar módulos reduce la duplicación, garantiza la consistencia y te permite compartir patrones de infraestructura entre equipos a través del Registro de Terraform.
4. ¿Cómo evito desplegar accidentalmente en la cuenta de AWS equivocada?
Usa la configuración allowed_account_ids en tu bloque de proveedor de AWS para restringir Terraform a IDs de cuenta específicos. Si las credenciales no coinciden con la lista permitida, Terraform generará un error antes de hacer cualquier cambio.
5. ¿Cuál es la diferencia entre terraform plan y terraform apply?
terraform plan previsualiza los cambios que Terraform haría en tu infraestructura. terraform apply ejecuta esos cambios. Siempre ejecuta plan primero para detectar errores antes de modificar recursos.
Fuentes
- Terrateam, "Cómo desplegar Nginx con Terraform en AWS" (2026)
- Guía de Prescripción de AWS, "Comprendiendo los recursos y proveedores de Terraform" (2024)
- Guía de Prescripción de AWS, "Mejores prácticas del proveedor de AWS de Terraform" (2024)
- HashiCorp Developer, "Crear infraestructura" (2025)
- Refine, "Primeros pasos con Terraform en AWS" (2024)
- DevelopersIO, "allowed_account_ids del proveedor de AWS de Terraform" (2025)
- GitHub, "terraform-basics-aws" repositorio
— Editorial Team
Aún no hay comentarios.