Has construït una infraestructura completa, però després d’un apply et queda una pregunta pràctica: quina és la IP del meu servidor per obrir-lo al navegador? Per això existeixen els outputs. En aquest subcapítol veurem com extreure informació útil i aprofundirem en les referències, el mecanisme que fa que tot encaixi.

El problema que resolen els outputs

Imagina que apliques la teva configuració i Terraform crea 8 recursos. Com saps quina és la IP pública del servidor? Podries anar a la consola d’AWS a buscar-la... però això és just el que volem evitar. Els outputs (recorda el subcapítol 10.1) fan que Terraform et mostri les dades importants en acabar.

Definir outputs

Creem un fitxer outputs.tf (o ho posem a qualsevol .tf) amb la informació que ens interessa:

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

output "url_web" {
  description = "URL per obrir el web al navegador"
  value       = "http://${aws_eip.web.public_ip}"
}

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

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

Després d’un terraform apply, veuràs quelcom així 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"

Ja tens la URL llesta per copiar i enganxar al navegador! També pots consultar-los en qualsevol moment amb terraform output (subcapítol 11.4).

Fixa’t en url_web: fem servir interpolació ("http://${...}", subcapítol 10.3) per construir una URL completa combinant text amb el valor de la IP. Els outputs no han de ser valors «en brut»: pots compondre el que necessitis.

Les referències: la cola de Terraform

Al llarg del capítol hem fet servir constantment expressions com aws_vpc.principal.id. Anem a entendre bé què són, perquè són el concepte central de Terraform.

Una referència té aquesta forma:

aws_eip.web.public_ip
│        │    │
│        │    └── atribut: quina dada vull (la IP pública)
│        └─────── nom que JO li vaig donar al recurs
└──────────────── tipus de recurs

Quan escrius aws_eip.web.public_ip, li dius a Terraform: «dona’m la IP pública del recurs Elastic IP que vaig anomenar web».

Per què les referències són tan importants

Les referències fan dues coses alhora:

1. Passen dades d’un recurs a un altre. La instància necessita l’ID de la subxarxa, l’Elastic IP necessita l’ID de la instància, etc. Les referències connecten aquesta informació.

2. Creen el graf de dependències automàticament. Com vam veure al subcapítol 9.4, Terraform dedueix l’ordre de creació a partir de les referències. Si A referencia B, llavors B es crea abans que A.

Vegem-ho a la nostra infraestructura:

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

Terraform llegeix aquest graf i crea les coses en ordre: primer la VPC, després el que depèn d’ella, després la instància, i finalment l’Elastic IP. Tu no especifiques l’ordre: el dedueix de les referències. I on pot, paral·lelitza per anar més ràpid.

Això és el que fa màgic Terraform. No escrius «fes això, després això, després això altre» (això seria imperatiu, subcapítol 9.2). Només descrius els recursos i com es relacionen, i Terraform descobreix l’ordre correcte. Per això és declaratiu.

Referències explícites amb depends_on

A vegades dos recursos depenen l’un de l’altre però sense una referència directa de dades. En aquests casos rars, pots forçar l’ordre amb depends_on:

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

Això li diu «no creïs la instància fins que existeixi l’Internet Gateway», encara que no facis servir cap dada seva. És una eina d’últim recurs: en el 95 % dels casos les referències normals són suficients i són preferibles. Fes-la servir només quan Terraform no pugui deduir una dependència per si mateix.

El que has de recordar

  • Els outputs mostren informació útil en acabar (apply) i es consulten amb terraform output; perfectes per a dades com la IP o URL del servidor.
  • Pots compondre outputs amb interpolació (ex. construir una URL completa amb "http://${...}").
  • Una referència (tipus.nom.atribut) fa dues coses: passa dades entre recursos i crea la dependència (l’ordre de creació).
  • Terraform construeix un graf de dependències a partir de les referències i dedueix l’ordre sol: tu no l’especifiques. Això és ser declaratiu.
  • depends_on força un ordre quan no hi ha referència de dades; fes-lo servir com a últim recurs, no per defecte.

A l’últim subcapítol del capítol farem el salt al treball en equip: com es revisen els canvis d’infraestructura mitjançant Pull Requests i revisió de plans.

Cloud, AWS & Terraform — De zero a expert

Capítol 1 · Què és el cloud computing

Capítol 2 · El mercat cloud i els grans proveïdors

Capítol 3 · Regions, zones de disponibilitat i edge

Capítol 4 · Càlcul: EC2

Capítol 5 · Emmagatzematge: S3

Capítol 6 · Xarxes: VPC

Capítol 7 · Identitat i accés: IAM

Capítol 8 · Bases de dades gestionades

Capítol 9 · Per què Infraestructura com a Codi

Capítol 10 · HCL: el llenguatge de Terraform

Capítol 11 · Providers i estat

Capítol 12 · La teva primera infraestructura real amb Terraform

Capítol 13 · Balanceig de càrrega i autoescalat

Capítol 14 · Serverless amb Lambda

Capítol 15 · Missatgeria i esdeveniments

Capítol 16 · Lliurament de contingut i DNS

Capítol 17 · Contenidors a AWS

Capítol 18 · Mòduls: reutilització i composició

Capítol 19 · Workspaces i gestió d'entorns

Capítol 20 · Backends remots i locking

Capítol 21 · Testing d'infraestructura

Capítol 22 · Terraform en CI/CD

Capítol 23 · Seguretat en profunditat

Capítol 24 · Observabilitat: logs, mètriques i traces

Capítol 25 · Optimització de costos

Capítol 26 · Alta disponibilitat i disaster recovery

Capítol 27 · Well-Architected Framework d'AWS

Capítol 28 · Arquitectures serverless a escala

Capítol 29 · Plataformes de dades a AWS

Capítol 30 · Multi-compte i landing zones

Capítol 31 · Platform Engineering i Internal Developer Platform

Capítol 32 · Certificacions AWS rellevants

Capítol 33 · Projectes per consolidar el que s'ha après

Capítol 34 · Recursos i comunitat

© Copyright 2024. Tots els drets reservats