¡Es la hora de la verdad! En este capítulo construirás tu primera infraestructura real con Terraform, juntando todo lo aprendido: los servicios de AWS de la Parte II y el lenguaje Terraform de la Parte III. Empezamos por los cimientos de toda arquitectura: una VPC con subredes. Recuerda los conceptos del Capítulo 6, que ahora vas a escribir en código.

Qué vamos a construir

A lo largo del capítulo levantaremos una arquitectura sencilla pero completa:

┌──────────── VPC (10.0.0.0/16) ────────────┐
│                                            │
│   ┌─ Subred pública (10.0.1.0/24) ─┐       │
│   │   (aquí irá nuestro servidor)   │      │
│   └─────────────────────────────────┘      │
│                                            │
│   + Internet Gateway (puerta a internet)   │
│   + Route Table (rutas)                    │
└────────────────────────────────────────────┘

En este subcapítulo creamos la VPC, una subred y la conectividad básica a internet. En los siguientes añadiremos el servidor, el firewall, la IP y los outputs.

Paso 1: Configurar el provider

Todo proyecto empieza configurando el provider de AWS (recuerda el subcapítulo 11.1). Creamos un archivo, por ejemplo main.tf:

terraform {
  required_providers {
    aws = {
      source  = "hashicorp/aws"
      version = "~> 5.0"
    }
  }
}

provider "aws" {
  region = "eu-west-1"   # Irlanda (elige tu región, Capítulo 3)
}

Paso 2: Crear la VPC

La VPC es nuestra red privada (recuerda el subcapítulo 6.1). Con un rango 10.0.0.0/16:

resource "aws_vpc" "principal" {
  cidr_block           = "10.0.0.0/16"
  enable_dns_support   = true
  enable_dns_hostnames = true

  tags = {
    Name = "mi-primera-vpc"
  }
}
  • cidr_block define el rango de direcciones (subcapítulo 6.1).
  • Las opciones enable_dns_* permiten que los recursos tengan nombres DNS (útil para que el servidor tenga nombre).
  • tags da un nombre legible al recurso (muy recomendable etiquetar todo).

Paso 3: Crear una subred pública

Dentro de la VPC, creamos una subred (subcapítulo 6.2). La hacemos en una zona de disponibilidad concreta:

resource "aws_subnet" "publica" {
  vpc_id                  = aws_vpc.principal.id    # ← referencia a la VPC
  cidr_block              = "10.0.1.0/24"
  availability_zone       = "eu-west-1a"
  map_public_ip_on_launch = true                    # IP pública automática

  tags = {
    Name = "subred-publica"
  }
}

Fíjate en vpc_id = aws_vpc.principal.id: es una referencia (subcapítulo 10.3). Le decimos a la subred «perteneces a la VPC que creé antes». Esto crea la dependencia: Terraform sabe que debe crear la VPC primero.

map_public_ip_on_launch = true hace que los recursos en esta subred reciban una IP pública automáticamente, parte de lo que la convierte en «pública».

Paso 4: Crear el Internet Gateway

Para que la subred sea realmente pública, necesita una puerta a internet (subcapítulo 6.3):

resource "aws_internet_gateway" "igw" {
  vpc_id = aws_vpc.principal.id

  tags = {
    Name = "mi-igw"
  }
}

Esto crea el Internet Gateway y lo conecta a nuestra VPC.

Paso 5: Crear la Route Table y asociarla

El Internet Gateway por sí solo no basta: hay que decirle a la subred que use ese gateway para salir a internet. Eso se hace con una tabla de rutas (subcapítulo 6.4):

resource "aws_route_table" "publica" {
  vpc_id = aws_vpc.principal.id

  route {
    cidr_block = "0.0.0.0/0"                       # todo internet
    gateway_id = aws_internet_gateway.igw.id       # sale por el IGW
  }

  tags = {
    Name = "rt-publica"
  }
}

resource "aws_route_table_association" "publica" {
  subnet_id      = aws_subnet.publica.id
  route_table_id = aws_route_table.publica.id
}

Esto es exactamente lo que vimos en el subcapítulo 6.4: la ruta 0.0.0.0/0 → Internet Gateway es lo que convierte la subred en pública. El route_table_association conecta la tabla con nuestra subred.

El resultado

Con estos cinco pasos tienes una red funcional:

✓ VPC (10.0.0.0/16)
✓ Subred pública (10.0.1.0/24) en eu-west-1a
✓ Internet Gateway conectado
✓ Route Table que envía el tráfico de internet por el IGW
✓ Asociación de la tabla a la subred

Si ahora ejecutaras terraform init y terraform plan (subcapítulo 11.4), verías algo como:

Plan: 5 to add, 0 to change, 0 to destroy.
  + aws_vpc.principal
  + aws_subnet.publica
  + aws_internet_gateway.igw
  + aws_route_table.publica
  + aws_route_table_association.publica

Y con terraform apply (escribiendo yes), Terraform crearía toda la red en el orden correcto automáticamente, gracias a las referencias entre recursos.

Lo poderoso de esto: acabas de definir una red completa en unas pocas líneas de texto. Esta misma configuración la puedes reutilizar, versionar en Git y recrear las veces que quieras (recuerda los problemas del aprovisionamiento manual del Capítulo 9). Y si la borras con destroy, desaparece limpiamente.

Lo que debes recordar

  • Toda arquitectura empieza por la red: VPC + subredes + conectividad.
  • Los pasos: configurar el provider, crear la VPC, la subred, el Internet Gateway, la Route Table y su asociación.
  • Las referencias (aws_vpc.principal.id) conectan los recursos y crean las dependencias, para que Terraform los cree en el orden correcto.
  • La ruta 0.0.0.0/0 hacia el Internet Gateway es lo que hace pública a la subred (igual que vimos en el Capítulo 6, ahora en código).
  • Etiqueta (tags) todos tus recursos con nombres legibles: es una buena práctica.

En el siguiente subcapítulo pondremos un servidor EC2 dentro de esta subred pública.

Cloud, AWS & Terraform — De cero a experto

Capítulo 1 · Qué es el cloud computing

Capítulo 2 · El mercado cloud y los grandes proveedores

Capítulo 3 · Regiones, zonas de disponibilidad y edge

Capítulo 4 · Cómputo: EC2

Capítulo 5 · Almacenamiento: S3

Capítulo 6 · Redes: VPC

Capítulo 7 · Identidad y acceso: IAM

Capítulo 8 · Bases de datos gestionadas

Capítulo 9 · Por qué Infraestructura como Código

Capítulo 10 · HCL: el lenguaje de Terraform

Capítulo 11 · Providers y estado

Capítulo 12 · Tu primera infraestructura real en Terraform

Capítulo 13 · Balanceo de carga y autoescalado

Capítulo 14 · Serverless con Lambda

Capítulo 15 · Mensajería y eventos

Capítulo 16 · Entrega de contenido y DNS

Capítulo 17 · Contenedores en AWS

Capítulo 18 · Módulos: reutilización y composición

Capítulo 19 · Workspaces y gestión de entornos

Capítulo 20 · Backends remotos y locking

Capítulo 21 · Testing de infraestructura

Capítulo 22 · Terraform en CI/CD

Capítulo 23 · Seguridad en profundidad

Capítulo 24 · Observabilidad: logs, métricas y trazas

Capítulo 25 · Optimización de costes

Capítulo 26 · Alta disponibilidad y disaster recovery

Capítulo 27 · Well-Architected Framework de AWS

Capítulo 28 · Arquitecturas serverless a escala

Capítulo 29 · Plataformas de datos en AWS

Capítulo 30 · Multi-cuenta y landing zones

Capítulo 31 · Platform Engineering e Internal Developer Platform

Capítulo 32 · Certificaciones AWS relevantes

Capítulo 33 · Proyectos para consolidar lo aprendido

Capítulo 34 · Recursos y comunidad

© Copyright 2024. Todos los derechos reservados