Has construido una infraestructura completa, pero tras un apply te queda una pregunta práctica: ¿cuál es la IP de mi servidor para abrirlo en el navegador? Para eso existen los outputs. En este subcapítulo veremos cómo extraer información útil y profundizaremos en las referencias, el mecanismo que hace que todo encaje.

El problema que resuelven los outputs

Imagina que aplicas tu configuración y Terraform crea 8 recursos. ¿Cómo averiguas la IP pública del servidor? Podrías ir a la consola de AWS a buscarla... pero eso es justo lo que queremos evitar. Los outputs (recuerda el subcapítulo 10.1) hacen que Terraform te muestre los datos importantes al terminar.

Definir outputs

Creamos un archivo outputs.tf (o lo ponemos en cualquier .tf) con la información que nos interesa:

output "ip_publica" {
  description = "IP pública del servidor web"
  value       = aws_eip.web.public_ip
}

output "url_web" {
  description = "URL para abrir la web en el navegador"
  value       = "http://${aws_eip.web.public_ip}"
}

output "id_instancia" {
  description = "ID de la instancia EC2"
  value       = aws_instance.web.id
}

output "id_vpc" {
  description = "ID de la VPC creada"
  value       = aws_vpc.principal.id
}

Tras un terraform apply, verás algo así al final:

Apply complete! Resources: 8 added, 0 changed, 0 destroyed.

Outputs:

id_instancia = "i-0a1b2c3d4e5f67890"
id_vpc       = "vpc-0abc123def456"
ip_publica   = "52.48.123.45"
url_web      = "http://52.48.123.45"

¡Ya tienes la URL lista para copiar y pegar en el navegador! También puedes consultarlos en cualquier momento con terraform output (subcapítulo 11.4).

Fíjate en url_web: usamos interpolación ("http://${...}", subcapítulo 10.3) para construir una URL completa combinando texto con el valor de la IP. Los outputs no tienen por qué ser valores «en crudo»: puedes componer lo que necesites.

Las referencias: el pegamento de Terraform

A lo largo del capítulo hemos usado constantemente expresiones como aws_vpc.principal.id. Vamos a entender bien qué son, porque son el concepto central de Terraform.

Una referencia tiene esta forma:

aws_eip.web.public_ip
│        │    │
│        │    └── atributo: qué dato quiero (la IP pública)
│        └─────── nombre que YO le di al recurso
└──────────────── tipo de recurso

Cuando escribes aws_eip.web.public_ip, le dices a Terraform: «dame la IP pública del recurso Elastic IP que llamé web».

Por qué las referencias son tan importantes

Las referencias hacen dos cosas a la vez:

1. Pasan datos de un recurso a otro. La instancia necesita el ID de la subred, la Elastic IP necesita el ID de la instancia, etc. Las referencias conectan esa información.

2. Crean el grafo de dependencias automáticamente. Como vimos en el subcapítulo 9.4, Terraform deduce el orden de creación a partir de las referencias. Si A referencia a B, entonces B se crea antes que A.

Veámoslo en nuestra infraestructura:

aws_vpc.principal
   ▲
   │ (referenciada por)
   ├── aws_subnet.publica ────────┐
   ├── aws_internet_gateway.igw    │
   ├── aws_route_table.publica     │
   └── aws_security_group.web      │
                                   ▼
                          aws_instance.web
                                   ▲
                                   │
                              aws_eip.web

Terraform lee este grafo y crea las cosas en orden: primero la VPC, luego lo que depende de ella, luego la instancia, y por último la Elastic IP. Tú no especificas el orden: lo deduce de las referencias. Y donde puede, paraleliza para ir más rápido.

Esto es lo que hace mágico a Terraform. No escribes «haz esto, luego esto, luego esto otro» (eso sería imperativo, subcapítulo 9.2). Solo describes los recursos y cómo se relacionan, y Terraform descubre el orden correcto. Por eso es declarativo.

Referencias explícitas con depends_on

A veces dos recursos dependen uno del otro pero sin una referencia directa de datos. En esos casos raros, puedes forzar el orden con depends_on:

resource "aws_instance" "web" {
  # ...
  depends_on = [aws_internet_gateway.igw]
}

Esto le dice «no crees la instancia hasta que exista el Internet Gateway», aunque no uses ningún dato suyo. Es una herramienta de último recurso: en el 95 % de los casos las referencias normales bastan y son preferibles. Úsalo solo cuando Terraform no pueda deducir una dependencia por sí mismo.

Lo que debes recordar

  • Los outputs muestran información útil al terminar (apply) y se consultan con terraform output; perfectos para datos como la IP o URL del servidor.
  • Puedes componer outputs con interpolación (ej. construir una URL completa con "http://${...}").
  • Una referencia (tipo.nombre.atributo) hace dos cosas: pasa datos entre recursos y crea la dependencia (el orden de creación).
  • Terraform construye un grafo de dependencias a partir de las referencias y deduce el orden solo: tú no lo especificas. Eso es ser declarativo.
  • depends_on fuerza un orden cuando no hay referencia de datos; úsalo como último recurso, no por defecto.

En el último subcapítulo del capítulo daremos el salto al trabajo en equipo: cómo se revisan los cambios de infraestructura mediante Pull Requests y revisión de planes.

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