En el subcapítol anterior vam afegir una taula de DynamoDB al nostre backend «per al locking». Ara entendrem bé què és el state locking i per què és imprescindible quan diverses persones treballen sobre la mateixa infraestructura. És la peça que evita un dels pitjors desastres possibles amb Terraform: la corrupció de l’estat.
El problema: dues persones alhora
Recorda que l’estat (Capítol 11) és l’arxiu que registra quins recursos existeixen i com es relacionen. És la «font de la veritat» de Terraform. Ara imagina aquesta situació en un equip:
L’Ana executa "terraform apply" ┐
├─► al MATEIX temps sobre el MATEIX estat
En Carles executa "terraform apply" ┘Si ambdós modifiquen l’estat al mateix temps, els seus canvis es barregen i es corrompen. L’arxiu d’estat pot quedar inconsistent: registres a mitges, recursos duplicats, o un estat que ja no reflecteix la realitat. Un estat corrupte és un malson: Terraform perd la noció de què existeix, i arreglar-ho a mà és lent i perillós.
Analogia: és com dues persones editant el mateix document alhora sense coordinació, cadascuna guardant per sobre de l’altra. El resultat és un document destrossat on es perden canvis i res té sentit. Necessites que, mentre un edita, l’altre esperi el seu torn.
La solució: el state locking (bloqueig de l’estat)
El state locking (bloqueig de l’estat) resol això amb una regla senzilla: mentre algú està modificant l’estat, ningú més pot fer-ho alhora. Terraform posa un «cadenat» (lock) abans de començar a treballar i el treu en acabar.
L’Ana executa apply → Terraform posa el CADENAT 🔒
(L’Ana treballa tranquil·la)
En Carles executa apply → "L’estat està bloquejat, espera..."
(En Carles espera)
L’Ana acaba → Terraform treu el cadenat 🔓
En Carles → ara sí, posa el seu cadenat i treballaAixí, les operacions es serialitzen: passen una darrere l’altra, mai alhora. L’estat mai es corromp per accessos simultanis.
Com funciona amb DynamoDB
Aquí entra la taula de DynamoDB que vam configurar al subcapítol 20.1. Funciona com el «porter del cadenat»:
- Quan algú executa
apply(oplan), Terraform escriu un registre de bloqueig a la taula DynamoDB (a la clauLockID). - Si una altra persona intenta executar Terraform, aquest comprova la taula, veu que ja hi ha un bloqueig actiu i espera (o avisa que està bloquejat).
- Quan el primer acaba, Terraform esborra el registre de bloqueig, alliberant el cadenat.
DynamoDB (taula de locks)
LockID: "mi-estado" → ocupat per l’Ana des de les 10:32 🔒
(En Carles veu això i espera)DynamoDB és ideal per això perquè garanteix operacions atòmiques i consistents: dues persones no poden «agafar el cadenat» alhora; només un guanya.
Què veus quan l’estat està bloquejat
Si intentes executar Terraform mentre una altra persona té el cadenat, veuràs un missatge semblant a aquest:
Error: Error acquiring the state lock Lock Info: ID: a1b2c3d4-... Who: [email protected] Created: 2024-...
Això t’indica qui té el bloqueig i des de quan. No és un error «dolent»: és Terraform protegint-te. Simplement esperes que l’altra persona acabi i ho tornes a intentar.
El locking ocorre automàticament
La bona notícia: un cop configurat el backend amb DynamoDB (subcapítol 20.1), el locking funciona sol, sense que hagis de fer res. Terraform posa i treu el cadenat automàticament a cada operació. Tu simplement treballes amb normalitat, i el sistema et protegeix per darrere.
Quan un lock es queda «encallat»
Ocasionalment, un bloqueig pot quedar-se «enganxat»: per exemple, si la connexió d’algú es talla a mig apply, el cadenat podria no alliberar-se. En aquests casos rars, existeix el comandament terraform force-unlock per treure el cadenat manualment:
⚠️ Fes-lo servir amb moltíssima cura. Abans de forçar el desbloqueig, assegura’t que de veritat ningú està treballant sobre l’estat. Si forces el desbloqueig mentre una altra persona realment està aplicant canvis, tornes a arriscar-te a la corrupció que el locking pretenia evitar. Confirma sempre amb el teu equip primer.
Per què això és tan important
El state locking, juntament amb l’estat remot (subcapítol 20.1), és el que fa que Terraform sigui segur en equip. Sense ell, la col·laboració seria una bomba de rellotgeria: tard o d’hora dues persones coincidirien i corromprien l’estat. Amb ell, desenes de persones poden treballar sobre la mateixa infraestructura sense por. És la base, juntament amb el flux de PR (subcapítol 12.5), del treball professional amb Terraform.
El que has de recordar
- Si dues persones modifiquen l’estat alhora, aquest es corromp (queda inconsistent), cosa que és un desastre difícil d’arreglar. Com dues persones editant el mateix document sense coordinació.
- El state locking (bloqueig) evita això: mentre algú treballa, posa un cadenat que impedeix que altres modifiquin l’estat alhora. Les operacions es serialitzen (una darrere l’altra).
- Amb el backend S3 + DynamoDB, el locking funciona automàticament: Terraform escriu un registre de bloqueig a DynamoDB en començar i l’esborra en acabar.
- Si l’estat està bloquejat, veuràs un missatge indicant qui el té; no és un error dolent, és protecció. Simplement esperes.
- En casos rars de bloqueig «encallat», existeix
terraform force-unlock, però fes-lo servir amb extremada cura i només després de confirmar que ningú està treballant.
Al següent subcapítol veurem com moure l’estat entre backends de manera segura, una cosa necessària quan reorganitzes o migres la teva infraestructura.
Cloud, AWS & Terraform — De zero a expert
Capítol 1 · Què és el cloud computing
- 1.1 El model client-servidor tradicional
- 1.2 Problemes que venia a resoldre el núvol
- 1.3 On-premise vs cloud vs híbrid
- 1.4 Els tres models de servei: IaaS, PaaS, SaaS
- 1.5 Els cinc pilars del cloud (segons NIST)
- 1.6 Avantatges reals: elasticitat, pagament per ús, disponibilitat global
Capítol 2 · El mercat cloud i els grans proveïdors
- 2.1 AWS, Azure i GCP: diferències i quotes de mercat
- 2.2 Per què aprendre AWS primer
- 2.3 Conceptes que són universals entre proveïdors
Capítol 3 · Regions, zones de disponibilitat i edge
- 3.1 Què és una regió AWS i com triar-la
- 3.2 Availability Zones: alta disponibilitat des del disseny
- 3.3 Edge locations i CloudFront
- 3.4 Latència, resiliència i sobirania de dades
Capítol 4 · Càlcul: EC2
- 4.1 Instàncies: tipus, famílies i quan triar cadascuna
- 4.2 AMIs, key pairs i Security Groups
- 4.3 Cicle de vida d'una instància
- 4.4 Elastic IPs i Placement Groups
- 4.5 Savings Plans vs Reserved vs On-Demand vs Spot
Capítol 5 · Emmagatzematge: S3
- 5.1 Buckets, objectes i claus
- 5.2 Classes d'emmagatzematge (Standard, IA, Glacier…)
- 5.3 Versionat i cicle de vida d'objectes
- 5.4 Polítiques de bucket i ACLs
- 5.5 Hosting de llocs web estàtics
Capítol 6 · Xarxes: VPC
- 6.1 Què és una VPC i per què la necessites
- 6.2 Subxarxes públiques i privades
- 6.3 Internet Gateway i NAT Gateway
- 6.4 Route Tables i Network ACLs
- 6.5 VPC Peering i endpoints
Capítol 7 · Identitat i accés: IAM
- 7.1 Usuaris, grups, rols i polítiques
- 7.2 El principi de mínim privilegi
- 7.3 Polítiques basades en identitat vs en recurs
- 7.4 MFA i credencials temporals (STS)
- 7.5 Bones pràctiques de seguretat IAM
Capítol 8 · Bases de dades gestionades
- 8.1 RDS: motors, Multi-AZ i rèpliques de lectura
- 8.2 Aurora i els seus avantatges sobre RDS vanilla
- 8.3 DynamoDB: model clau-valor / documents
- 8.4 ElastiCache per a memòria cau en memòria
- 8.5 Quan utilitzar cada tipus de base de dades
Capítol 9 · Per què Infraestructura com a Codi
- 9.1 Problemes del provisionament manual
- 9.2 IaC declaratiu vs imperatiu
- 9.3 Terraform vs CloudFormation vs Pulumi vs CDK
- 9.4 El cicle plan → apply → destroy
Capítol 10 · HCL: el llenguatge de Terraform
- 10.1 Blocs resource, variable, output, locals
- 10.2 Tipus de dades: string, number, bool, list, map, object
- 10.3 Expressions, referències i funcions built-in
- 10.4 Condicionals i bucles (count, for_each, for)
Capítol 11 · Providers i estat
- 11.1 Com funciona el provider d'AWS
- 11.2 El fitxer terraform.tfstate i la seva importància
- 11.3 State local vs state remot (S3 + DynamoDB)
- 11.4 Comandes essencials: init, plan, apply, destroy, fmt, validate
Capítol 12 · La teva primera infraestructura real amb Terraform
- 12.1 Crear una VPC amb subxarxes des de zero
- 12.2 Posar en marxa una instància EC2 pública
- 12.3 Associar un Security Group i una Elastic IP
- 12.4 Outputs i referències entre recursos
- 12.5 Flux de treball en equip: PR review de plans
Capítol 13 · Balanceig de càrrega i autoescalat
- 13.1 Application Load Balancer vs Network Load Balancer
- 13.2 Target Groups, listeners i regles
- 13.3 Auto Scaling Groups: polítiques i mètriques
- 13.4 Warm pools i lifecycle hooks
Capítol 14 · Serverless amb Lambda
- 14.1 El model d'execució de Lambda
- 14.2 Triggers: API Gateway, S3, DynamoDB Streams, SQS
- 14.3 Gestió de dependències i capes (Layers)
- 14.4 Cold starts i estratègies per reduir-los
- 14.5 Límits i antipatrones
Capítol 15 · Missatgeria i esdeveniments
- 15.1 SQS: cues estàndard vs FIFO, DLQ
- 15.2 SNS: topics, subscripcions, fan-out
- 15.3 EventBridge: event buses i regles
- 15.4 Patrons: pub/sub, desacoblament, saga
Capítol 16 · Lliurament de contingut i DNS
- 16.1 Route 53: tipus de registres i routing policies
- 16.2 CloudFront: distribucions, memòries cau i origins
- 16.3 ACM: certificats SSL/TLS gratuïts
- 16.4 WAF integrat amb CloudFront
Capítol 17 · Contenidors a AWS
- 17.1 Docker: repàs exprés de conceptes clau
- 17.2 ECR: registre privat d'imatges
- 17.3 ECS: task definitions, services, Fargate vs EC2
- 17.4 EKS: quan Kubernetes i quan no
Capítol 18 · Mòduls: reutilització i composició
- 18.1 Anatomia d'un mòdul Terraform
- 18.2 Variables d'entrada, outputs i dependències
- 18.3 Mòduls locals vs mòduls del Terraform Registry
- 18.4 Versionat de mòduls amb Git tags
- 18.5 Disseny de mòduls genèrics vs específics de domini
Capítol 19 · Workspaces i gestió d'entorns
- 19.1 Workspaces de Terraform: casos d'ús i limitacions
- 19.2 Estratègia de directoris per entorn (dev/stg/prod)
- 19.3 Terragrunt: DRY per a configuracions d'entorn
- 19.4 Variables d'entorn i fitxers .tfvars
Capítol 20 · Backends remots i locking
- 20.1 Configurar S3 + DynamoDB com a backend
- 20.2 State locking: evitar corrupció en equip
- 20.3 Migració d'estat entre backends
- 20.4 terraform import: portar recursos existents a l'estat
Capítol 21 · Testing d'infraestructura
- 21.1 Terraform validate i fmt en CI
- 21.2 Checkov i tfsec: anàlisi de seguretat estàtica
- 21.3 Terratest: tests d'integració en Go
- 21.4 Contract testing entre mòduls
Capítol 22 · Terraform en CI/CD
- 22.1 Pipeline bàsic: lint → plan → apply a GitHub Actions
- 22.2 Atlantis: GitOps per a Terraform
- 22.3 Terraform Cloud / HCP Terraform
- 22.4 Drift detection i reconciliació automàtica
Capítol 23 · Seguretat en profunditat
- 23.1 AWS Organizations i Service Control Policies
- 23.2 AWS Config: compliment continu
- 23.3 GuardDuty: detecció d'amenaces
- 23.4 Security Hub: visió centralitzada
- 23.5 KMS: gestió de claus i rotació
- 23.6 Secrets Manager vs Parameter Store
Capítol 24 · Observabilitat: logs, mètriques i traces
- 24.1 CloudWatch Logs, mètriques i alarmes
- 24.2 CloudWatch Dashboards i Contributor Insights
- 24.3 X-Ray: traçat distribuït
- 24.4 OpenTelemetry a AWS
- 24.5 Managed Grafana i Managed Prometheus
Capítol 25 · Optimització de costos
- 25.1 AWS Cost Explorer i pressupostos amb alertes
- 25.2 Trusted Advisor i Compute Optimizer
- 25.3 Rightsizing: com detectar sobredimensionament
- 25.4 Savings Plans vs Reserved Instances: decisió estratègica
- 25.5 FinOps: cultura i processos per controlar la despesa
Capítol 26 · Alta disponibilitat i disaster recovery
- 26.1 RTO i RPO: definir els objectius
- 26.2 Estratègies: backup/restore, pilot light, warm standby, multi-site
- 26.3 Route 53 health checks i failover automàtic
- 26.4 AWS Backup: política centralitzada de còpies
Capítol 27 · Well-Architected Framework d'AWS
- 27.1 Els sis pilars: excel·lència operacional, seguretat, fiabilitat, eficiència de rendiment, optimització de costos, sostenibilitat
- 27.2 Well-Architected Tool: revisions formals
- 27.3 Com aplicar el framework en decisions de disseny
Capítol 28 · Arquitectures serverless a escala
- 28.1 Event-driven architecture amb Lambda + EventBridge
- 28.2 Saga pattern per a transaccions distribuïdes
- 28.3 Step Functions: orquestració de workflows complexos
- 28.4 Lambda@Edge i CloudFront Functions
Capítol 29 · Plataformes de dades a AWS
- 29.1 Data Lake amb S3, Glue i Athena
- 29.2 Kinesis Data Streams i Firehose per a streaming
- 29.3 Redshift: data warehousing a escala
- 29.4 Lake Formation: govern del dada
Capítol 30 · Multi-compte i landing zones
- 30.1 Per què separar workloads en comptes diferents
- 30.2 AWS Control Tower i Account Factory
- 30.3 Gestió centralitzada de logs i seguretat
- 30.4 Terraform a escala multi-compte amb mòduls compartits
Capítol 31 · Platform Engineering i Internal Developer Platform
- 31.1 Golden paths i abstraccions sobre Terraform
- 31.2 Service Catalog d'AWS
- 31.3 Backstage com a portal de desenvolupadors
- 31.4 Mòduls Terraform com a producte intern
Capítol 32 · Certificacions AWS rellevants
- 32.1 Cloud Practitioner: val la pena?
- 32.2 Solutions Architect Associate → Professional
- 32.3 DevOps Engineer Professional
- 32.4 Specialty: Security, Database, Networking
- 32.5 HashiCorp Terraform Associate
Capítol 33 · Projectes per consolidar el que s'ha après
- 33.1 Projecte 1: blog serverless (S3 + CloudFront + Lambda + DynamoDB)
- 33.2 Projecte 2: API REST amb ECS Fargate + RDS + ALB
- 33.3 Projecte 3: plataforma de dades amb Glue + Athena + Redshift
- 33.4 Projecte 4: landing zone multi-compte amb Terraform i Control Tower
