Fins ara hem definit valors fixos. Però la veritable potència de Terraform ve de connectar coses entre si i transformar valors. Per això fem servir expressions, referències i funcions. Amb elles, la teva infraestructura deixa de ser una llista estàtica i esdevé dinàmica i intel·ligent.

Referències: connectar recursos entre si

Una referència és la manera d'utilitzar el valor d'un recurs (o variable) en un altre lloc. És el que permet que els recursos es connectin.

La sintaxi general per referir-te a un atribut d'un recurs és:

tipus_recurs.nom.atribut

Exemple: Tens una VPC i vols crear una subxarxa dins d'ella. La subxarxa necessita saber l'ID de la VPC. En lloc de copiar l'ID a mà, el referencies:

resource "aws_vpc" "principal" {
  cidr_block = "10.0.0.0/16"
}

resource "aws_subnet" "publica" {
  vpc_id     = aws_vpc.principal.id   # ← referència a l'ID de la VPC
  cidr_block = "10.0.1.0/24"
}

Aquí aws_vpc.principal.id significa: «l'atribut id del recurs aws_vpc que vaig anomenar principal».

Per què això és genial: No necessites saber l'ID de la VPC per endavant (l'assigna AWS en crear-la). Terraform ho resol automàticament. I aquí passa una cosa molt important...

Les dependències implícites

Quan un recurs referencia un altre, Terraform entén automàticament que hi ha una dependència: «la subxarxa necessita la VPC, així que crearé la VPC primer».

Això és la màgia de l'enfoc declaratiu (subcapítol 9.2): tu no indiques l'ordre; Terraform el dedueix de les referències i construeix un graf de dependències per crear-ho tot en l'ordre correcte.

Recorda l'analogia del taxi: tu declares què vols i com es connecten les coses; Terraform calcula l'ordre de creació. Les referències són les que li diuen «això depèn d'això».

Les diferents referències que ja coneixes:

  • var.nom → una variable (subcapítol 10.1).
  • local.nom → un local.
  • aws_vpc.principal.id → un atribut d'un recurs.

Expressions: combinar i calcular valors

Una expressió és qualsevol cosa que produeix un valor: un valor literal, una referència, una operació, o una combinació.

Interpolació de strings

Pots inserir valors dins d'un text usant ${ }:

resource "aws_instance" "web" {
  # ...
  tags = {
    Name = "servidor-${var.entorn}-web"
  }
}

Si var.entorn val "prod", el nom resultant serà "servidor-prod-web". Això s'anomena interpolació: posar el valor d'una variable dins d'un text.

Operacions

Pots fer operacions matemàtiques, comparacions i lògica:

quantitat = var.quantitat_base + 2        # suma
es_prod  = var.entorn == "prod"           # comparació (dona true/false)

Funcions built-in: transformar valors

Terraform inclou funcions integrades (built-in) per transformar i manipular valors. Són com les funcions d'un full de càlcul. No pots crear funcions noves, però les que hi ha cobreixen gairebé tot el que necessites.

La sintaxi és nom_funcio(arguments). Vegem les més útils agrupades per tipus:

Funcions de text

upper("hola")              # → "HOLA"
lower("HOLA")              # → "hola"
"${var.projecte}-${var.entorn}"   # combinar textos
trimspace("  hola  ")      # → "hola" (treu espais)

Funcions de col·leccions (llistes i maps)

length(["a", "b", "c"])    # → 3 (quants elements)
element(var.llista, 0)     # → el primer element
concat(llista1, llista2)   # → uneix dues llistes
lookup(var.map, "clau", "valor_per_defecte")  # busca en un map

Funcions numèriques

max(5, 10, 3)              # → 10
min(5, 10, 3)              # → 3

Funcions molt usades en infraestructura

cidrsubnet("10.0.0.0/16", 8, 1)   # calcula subxarxes automàticament
file("script.sh")                  # llegeix el contingut d'un fitxer
jsonencode({ clau = "valor" })     # converteix a format JSON

cidrsubnet és molt pràctic: calcula rangs de subxarxes a partir del rang de la VPC, sense que hagis de fer els càlculs de CIDR a mà (recorda el Capítol 6). Per exemple, divideix automàticament el teu 10.0.0.0/16 en subxarxes ordenades.

No memoritzis totes les funcions. N'hi ha desenes. L'important és saber que existeixen i que, quan necessitis transformar un valor, gairebé segur que hi ha una funció per a això. La documentació de Terraform les llista totes.

Un exemple que ho ajunta tot

variable "projecte" {
  type    = string
  default = "botiga"
}

variable "azs" {
  type    = list(string)
  default = ["eu-west-1a", "eu-west-1b"]
}

resource "aws_vpc" "principal" {
  cidr_block = "10.0.0.0/16"
  tags = {
    Name = "${var.projecte}-vpc"        # interpolació
  }
}

resource "aws_subnet" "publica" {
  vpc_id            = aws_vpc.principal.id              # referència (dependència)
  cidr_block        = cidrsubnet(aws_vpc.principal.cidr_block, 8, 1)  # funció
  availability_zone = element(var.azs, 0)              # funció sobre llista
  tags = {
    Name = upper("${var.projecte}-publica")            # funció + interpolació
  }
}

Aquest codi: anomena la VPC amb interpolació, crea una subxarxa que referencia la VPC (creant la dependència), calcula el seu CIDR amb una funció, tria una zona de la llista amb una altra funció, i posa el nom en majúscules. Tot connectat i dinàmic.

El que has de recordar

  • Les referències (aws_vpc.principal.id, var.x, local.y) connecten recursos i valors entre si.
  • Quan un recurs referencia un altre, Terraform dedueix automàticament la dependència i l'ordre de creació (no ho indiques tu).
  • Les expressions combinen i calculen valors: la interpolació ${...} insereix valors en textos; també hi ha operacions matemàtiques i lògiques.
  • Les funcions built-in transformen valors (upper, length, lookup, cidrsubnet, file…). No pots crear funcions noves, però n'hi ha moltes d'integrades.
  • No memoritzis funcions: recorda que existeixen i busca-les quan les necessitis.

A l'últim subcapítol d'HCL veurem com crear diversos recursos alhora i prendre decisions amb condicionals i bucles (count, for_each, for).

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