Les dues lliçons anteriors han posat la infraestructura de MercadoFresco sota control: plantilles declaratives, constructes reutilitzables, proves i un pipeline que desplega la infraestructura i s'actualitza a si mateix. És el resultat de vuit mòduls de feina. I ara toca fer-se una pregunta incòmoda: calia tot això?

Existeix una alternativa que ningú de l'equip no va avaluar en el seu moment, perquè al mòdul 1 ningú no sabia que existia. Elastic Beanstalk desplega una aplicació lliurant-li un fitxer comprimit i una cadena amb la versió del llenguatge; a canvi, aprovisiona i manté EC2, autoescalat, balancejador, grups de seguretat i mètriques. Aquesta lliçó explica què fa exactament, què controla i què no, i acaba amb la decisió honesta per a MercadoFresco —que no és la que un esperaria després de dues lliçons d'infraestructura com a codi—.

Avís de cost. Beanstalk és gratuït: pagues exactament els recursos que crea. Un entorn de proves d'un sol t3.small amb balancejador costa uns 0,04 USD/hora, és a dir, al voltant d'1 USD al dia; si a més és un entorn de servidor web amb ALB, el balancejador tot sol ja són uns 0,025 USD/hora més el trànsit. L'apartat de neteja acaba l'entorn amb una ordre. Dades fictícies.

Contingut

  1. Què és una plataforma com a servei
  2. Què crea Beanstalk per sota
  3. Conceptes: aplicació, versió, entorn i plataforma
  4. Entorns de servidor web i entorns de treballador
  5. Plataformes admeses i desplegament de la botiga pas a pas
  6. Personalització amb .ebextensions i .platform
  7. Polítiques de desplegament, configuracions guardades i IaC
  8. Escalat, estat millorat i tauler de salut
  9. Beanstalk amb una base de dades
  10. La decisió honesta per a MercadoFresco
  11. Comparativa amb CDK, Fargate, App Runner i Amplify
  12. La via de sortida
  13. Cost i neteja
  14. Errors habituals i consells
  15. Exercicis
  16. Conclusió

Què és una plataforma com a servei

Una plataforma com a servei (PaaS) és un model en què el proveïdor gestiona tot el que hi ha per sota del teu codi: el sistema operatiu, el temps d'execució del llenguatge, el servidor d'aplicacions, el balanceig, l'escalat i el monitoratge bàsic. Tu lliures el codi i unes poques decisions de configuració.

Model Tu gestiones AWS gestiona Exemple en aquest curs
IaaS SO, temps d'execució, aplicació, escalat Maquinari, xarxa, virtualització EC2 amb l'ASG del mòdul 2
PaaS Aplicació i configuració Tota la resta Elastic Beanstalk
CaaS Imatge del contenidor Nodes, orquestració Fargate (10-02)
FaaS Funció Tota la resta Lambda (02-05)

Beanstalk se situa en un punt concret d'aquesta escala: més control que Lambda, molta menys feina que EC2. I, a diferència d'una PaaS tancada, no t'amaga la infraestructura: els recursos que crea són EC2, ASG, ALB i grups de seguretat normals, visibles a la consola i accessibles per la CLI. Pots entrar per SSH a les instàncies, mirar els registres i modificar l'ASG. Aquesta transparència és la seva virtut més gran, i també l'origen dels seus problemes quan algú toca a mà el que Beanstalk creu governar.

Què crea Beanstalk per sota

Quan crees un entorn, Beanstalk genera una plantilla de CloudFormation i desplega una pila. Ho has estat fent servir sense saber-ho des de 09-01: si llistes les piles d'un compte amb Beanstalk, en veuràs una anomenada awseb-e-abc123xyz-stack.

flowchart TB
    A[Codi: mercadofresco-tienda.zip] --> B["Beanstalk: versio d'aplicacio"]
    B --> C[Plantilla de CloudFormation<br/>generada per Beanstalk]
    C --> D[Pila awseb-e-xxxx-stack]
    D --> E["Grup d'autoescalat"]
    D --> F[Balancejador ALB]
    D --> G[Grups de seguretat]
    D --> H[Alarmes de CloudWatch]
    D --> I["Perfil d'instancia IAM"]
    E --> J["Instancies EC2 amb<br/>l'agent de Beanstalk"]
    J --> K["Servidor web + la teva aplicacio"]

Això té tres conseqüències que convé tenir clares des del principi:

  • No és màgia, és CloudFormation. Els mateixos estats, els mateixos temps i els mateixos límits de 09-01. Un desplegament que es queda a mitges deixa la pila en UPDATE_ROLLBACK_COMPLETE.
  • La pila és de Beanstalk, no teva. Modificar-la directament trenca el model: Beanstalk la sobreescriurà en la següent operació. Tot canvi es fa a través de les opcions de configuració de Beanstalk.
  • A cada instància hi ha un agent. És qui rep l'ordre de desplegar, descarrega la versió des d'S3, executa els ganxos i informa de l'estat. Quan alguna cosa falla de manera estranya, els seus registres a /var/log/eb-engine.log són el primer lloc on mirar.

Conceptes: aplicació, versió, entorn i plataforma

Beanstalk té cinc conceptes i la confusió entre els tres primers és la causa del 80 % dels errors inicials.

Concepte Què és Detall important
Aplicació Un contenidor lògic. Ex.: mercadofresco-tienda No costa res, no desplega res
Versió d'aplicació Un artefacte concret a S3 amb una etiqueta. Ex.: v1.6.0 Immutable: és l'artefacte de 08-02
Entorn Una versió desplegada sobre recursos. Ex.: mercadofresco-tienda-produccion Aquí hi ha tot el cost
Configuració guardada Una foto de les opcions d'un entorn Permet crear entorns idèntics
Plataforma SO + temps d'execució + servidor. Ex.: Python 3.12 en AL2023 S'actualitza; cal gestionar-ho

La relació és d'un a molts a cada nivell: una aplicació té N versions i M entorns, i cada entorn té desplegada una versió concreta. Això encaixa perfectament amb la disciplina de 08-05: es construeix l'artefacte una vegada i aquest mateix objecte es promociona pels entorns. A Beanstalk es tradueix en eb deploy --version v1.6.0 sobre cada entorn, sense reconstruir res.

Les actualitzacions de plataforma mereixen atenció perquè són la feina que Beanstalk no elimina, només redueix. Cada branca de plataforma té versions (Python 3.12 running on 64bit Amazon Linux 2023/4.2.1) i AWS en publica una de nova cada poques setmanes amb correccions de seguretat. Hi ha dues maneres d'aplicar-les:

# Actualitzacio gestionada: AWS l'aplica sola a la finestra indicada
eb config          # i a l'editor: ManagedActions: true, PreferredStartTime: Tue:03:00
# O manual, amb control total del moment
aws elasticbeanstalk update-environment --environment-name mercadofresco-tienda-produccion \
  --platform-arn "arn:aws:elasticbeanstalk:eu-west-1::platform/Python 3.12 .../4.2.1"

Les actualitzacions de plataforma gestionades són una de les raons de pes per triar Beanstalk: apliquen les correccions del sistema operatiu en una finestra definida, amb desplegament immutable i reversió automàtica si falla. És exactament la feina que al mòdul 2 obligava a reconstruir l'AMI a mà.

Entorns de servidor web i entorns de treballador

Beanstalk té dos tipus d'entorn, i el segon encaixa de manera gairebé literal amb l'arquitectura de MercadoFresco.

Un entorn de servidor web (web server) rep trànsit HTTP a través d'un ALB i té un nom DNS públic del tipus mercadofresco-tienda-produccion.eu-west-1.elasticbeanstalk.com.

Un entorn de treballador (worker) no té balancejador ni trànsit entrant. En comptes d'això, Beanstalk crea una cua d'SQS i desplega a cada instància un dimoni, sqsd, que llegeix missatges de la cua i els lliura a la teva aplicació com a peticions HTTP POST a localhost en una ruta configurable.

flowchart LR
    A[Botiga: entorn web] -->|publica| Q[cola-mercadofresco-pedidos]
    Q --> S["sqsd a cada instancia<br/>de l'entorn treballador"]
    S -->|POST localhost/tareas| W[El teu codi de processament]
    W -->|200 OK| S
    S -->|esborra el missatge| Q
    W -->|error o timeout| D[DLQ: mercadofresco-pedidos-fallidos]

El detall important és com es tradueix el resultat: si el teu codi respon 200, sqsd esborra el missatge de la cua; si respon un error o exhaureix el temps, el missatge torna a la cua i, després de MaxRetries intents, va a la cua de missatges fallits. És exactament el patró de 07-01 i 07-05 —visibilitat, reintents i DLQ— però amb el bucle de consum escrit per AWS.

Això té un avantatge i un parany. L'avantatge: el teu codi de treballador es converteix en un manejador HTTP normal, sense biblioteca d'SQS, sense receive_message, sense gestió de la visibilitat. El parany: la idempotència continua sent responsabilitat teva, perquè un missatge es pot lliurar més d'una vegada exactament igual que a 07-05. La taula mercadofresco-idempotencia continua fent falta.

Beanstalk permet a més fer servir una cua existent en comptes de crear-ne una: a les opcions de l'entorn, aws:elasticbeanstalk:sqsd/WorkerQueueURL apunta a cola-mercadofresco-pedidos. Amb això, l'asg-mercadofresco-trabajadores del mòdul 7 es podria substituir per un entorn de treballador sense tocar ni la cua ni el productor. És el cas d'ús on Beanstalk continua sent competitiu avui a MercadoFresco.

Un apunt útil: sqsd admet també tasques periòdiques mitjançant un fitxer cron.yaml al paquet, amb la qual cosa substitueix una regla programada d'EventBridge per a treballs recurrents senzills.

Plataformes admeses i desplegament de la botiga pas a pas

Plataforma Servidor que posa Beanstalk Què espera del teu paquet
Python nginx + Gunicorn application.py amb un objecte WSGI i requirements.txt
Node.js nginx + el teu procés package.json amb start, o app.js
Java SE / Tomcat El mateix JAR / Tomcat application.jar / un .war
.NET Core / Windows Kestrel darrere d'nginx / IIS El publicat del projecte
PHP / Ruby / Go nginx + PHP-FPM / Puma / binari Convencions pròpies de cadascuna
Docker El motor de contenidors Dockerfile o Dockerrun.aws.json

Les dues últimes files mereixen un aclariment: Beanstalk pot desplegar contenidors, tant una imatge solta com diverses amb ECS per sota. És una via perfectament vàlida, però si l'arquitectura ha de ser de contenidors, el raonable és fer servir ECS o Fargate directament —mòdul 10— en comptes d'una capa que els embolcalla. La botiga de MercadoFresco és Python, així que encaixa a la primera fila.

El requisit de la plataforma Python és senzill: un objecte WSGI anomenat application a application.py, o la ruta indicada a la configuració, i un requirements.txt.

pip install awsebcli --upgrade

cd mercadofresco-tienda
eb init tienda-mercadofresco \
  --platform "Python 3.12" --region eu-west-1 --profile mercadofresco-dev

eb create mercadofresco-tienda-pruebas \
  --instance-types t3.small \
  --elb-type application \
  --min-instances 2 --max-instances 4 \
  --envvars ENTORNO=pruebas,NIVEL_LOG=info \
  --tags Proyecto=mercadofresco,Entorno=pruebas,Componente=tienda,Propietario=luis,CentroCoste=plataforma

Aquesta única ordre eb create triga entre cinc i set minuts i crea l'ALB, el grup de destinació, l'ASG, la plantilla de llançament, dos grups de seguretat, el perfil d'instància d'IAM, dues alarmes de CloudWatch i el grup de registres. És el contingut d'aplicacion-mercadofresco.yaml de 09-01, sense escriure una línia. Aquesta frase és tot l'argument a favor de Beanstalk.

El cicle de treball diari és igual de curt:

eb status                    # estat, salut, versio desplegada i CNAME
eb deploy                    # empaqueta el directori, puja a S3 i desplega
eb deploy --version v1.6.0   # promociona una versio JA construida: el correcte (08-05)
eb logs --all                # descarrega els registres de totes les instancies
eb ssh                       # entra a una instancia (necessita clau i SG amb el 22 obert)
eb open                      # obre la URL al navegador
eb health --refresh          # tauler de salut al terminal, instancia a instancia
eb events -f                 # esdeveniments de l'entorn en directe: el primer quan alguna cosa falla
eb terminate mercadofresco-tienda-pruebas

Dos advertiments sobre eb deploy que provoquen sorpreses el primer dia. El primer: empaqueta el contingut del directori, no de l'últim commit —tret que facis servir eb deploy --staged o configuris artefactes—, així que un fitxer sense desar o un .env local pot acabar desplegat. El segon, conseqüència de l'anterior: eb deploy és exactament el «desplegar des del portàtil» que el mòdul 8 va eliminar. En un projecte seriós, eb deploy l'executa el pipeline, no una persona.

Personalització amb .ebextensions i .platform

Beanstalk és opinat, però no tancat. Hi ha dos mecanismes de personalització i serveixen per a coses diferents.

.ebextensions/*.config són fitxers YAML dins del paquet que configuren l'entorn i els recursos: opcions de Beanstalk, paquets del sistema, fitxers, ordres i recursos de CloudFormation addicionals.

# .ebextensions/01-opciones.config
option_settings:
  aws:elasticbeanstalk:application:environment:
    ENTORNO: produccion
    REGION_AWS: eu-west-1
  aws:autoscaling:asg:
    MinSize: 2
    MaxSize: 4
  aws:elasticbeanstalk:environment:
    LoadBalancerType: application
  aws:elasticbeanstalk:healthreporting:system:
    SystemType: enhanced          # estat millorat: imprescindible, veure mes avall
  aws:elasticbeanstalk:command:
    DeploymentPolicy: Immutable   # politica de desplegament

packages:
  yum:
    postgresql15: []              # client de psql per a diagnostic

files:
  "/etc/nginx/conf.d/limites.conf":
    mode: "000644"
    owner: root
    content: |
      client_max_body_size 20M;   # les fotos de producte pesen

container_commands:
  01_migraciones:
    command: "python manage.py migrate --noinput"
    leader_only: true             # NOMES en una instancia: evita migracions concurrents
# .ebextensions/02-recursos.config — recursos propis a la pila de Beanstalk
Resources:
  ColaCorreo:
    Type: AWS::SQS::Queue
    Properties:
      QueueName: !Sub 'cola-mercadofresco-correo-${AWSEBEnvironmentName}'

.platform/ és el mecanisme modern, disponible a les plataformes basades en Amazon Linux 2 i posteriors, i substitueix bona part de l'anterior amb fitxers normals en comptes de YAML:

.platform/
├── nginx/conf.d/limites.conf        # es copia tal qual a la configuracio d'nginx
├── hooks/prebuild/01-dependencias.sh   # abans de construir
├── hooks/predeploy/01-comprobar.sh     # abans d'activar la versio nova
└── hooks/postdeploy/01-avisar.sh       # despres, amb l'aplicacio ja funcionant
Mecanisme Format Quan s'executa Fes-lo servir per a
option_settings YAML En configurar l'entorn Opcions de Beanstalk i de l'ASG
packages, files, commands YAML Abans de desplegar l'aplicació Paquets del sistema, fitxers
container_commands YAML Amb l'aplicació desplegada, abans d'activar-la Migracions, recollida d'estàtics
.platform/hooks/* Scripts A les fases prebuild, predeploy i postdeploy Tota la resta, amb més control

Les opcions s'organitzen en espais de noms, i conèixer els principals estalvia molt de temps de cerca a la documentació:

Espai de noms Què controla
aws:elasticbeanstalk:application:environment Variables d'entorn de la teva aplicació
aws:elasticbeanstalk:command Política de desplegament, mida de lot, temps d'espera
aws:elasticbeanstalk:environment Tipus d'entorn, tipus de balancejador, rol de servei
aws:elasticbeanstalk:healthreporting:system Estat bàsic o millorat
aws:elasticbeanstalk:managedactions Actualitzacions de plataforma gestionades i la seva finestra
aws:elasticbeanstalk:sqsd Dimoni dels entorns de treballador
aws:autoscaling:asg / aws:autoscaling:trigger Mida de l'ASG i disparadors d'escalat
aws:ec2:vpc VPC, subxarxes i si el balancejador és públic
aws:elbv2:listener:443 Oient HTTPS, certificat i política de seguretat

Un exemple que en reuneix uns quants i que és, a la pràctica, la configuració mínima seriosa per a un entorn de producció de MercadoFresco:

# .ebextensions/05-produccion.config
option_settings:
  aws:ec2:vpc:
    VPCId: vpc-0a1b2c3d4e5f6a7b8
    Subnets: subnet-app-a,subnet-app-b            # instancies a les subxarxes d'aplicacio
    ELBSubnets: subnet-publica-a,subnet-publica-b # balancejador a les publiques
    ELBScheme: public
  aws:elbv2:listener:443:
    Protocol: HTTPS
    SSLCertificateArns: arn:aws:acm:eu-west-1:111122223333:certificate/abc-123
    SSLPolicy: ELBSecurityPolicy-TLS13-1-2-2021-06
  aws:elasticbeanstalk:managedactions:
    ManagedActionsEnabled: true
    PreferredStartTime: "Tue:03:00"               # dimarts de matinada, mai divendres
  aws:elasticbeanstalk:managedactions:platformupdate:
    UpdateLevel: minor                            # correccions i versions menors
    InstanceRefreshEnabled: true

Fixa't en PreferredStartTime: la finestra d'actualització de plataforma és una decisió de negoci, igual que la finestra de desplegament de 08-05. Un dimarts de matinada és acceptable; un divendres a la tarda, amb cinc vegades més comandes en joc, no.

Els límits d'aquest model són reals i convé conèixer-los abans de casar-se amb Beanstalk. leader_only només s'aplica en desplegaments, no quan l'ASG llança una instància nova, així que una migració a container_commands no s'executa en escalar —cosa que està bé— però tampoc no hi pots confiar per a inicialitzacions. Els ganxos s'executen a cada instància, així que tot el que facin ha de ser idempotent i ràpid: un ganxo lent multiplica el temps de desplegament pel nombre d'instàncies. I hi ha coses que senzillament no es poden canviar: l'estructura de la pila, el model d'un procés per instància o el fet que l'entorn sigui la unitat de tot.

Polítiques de desplegament

Aquí és on Beanstalk es pot comparar de tu a tu amb CodeDeploy (08-03), i la comparació és instructiva.

Política Com funciona Temps Cost extra Risc Capacitat durant
Totes alhora Actualitza totes les instàncies alhora El més ràpid Cap Alt: tall de servei 0 % durant el canvi
Renovació (rolling) Per lots; cada lot surt de l'ALB, s'actualitza i torna Mitjà Cap Mitjà Reduïda
Renovació amb lot addicional Afegeix instàncies abans de començar Mitjà-alt Una instància extra Baix 100 %
Immutable Crea un ASG nou amb instàncies noves i les uneix a l'ALB Alt Doble durant el canvi Molt baix 100 %
Blue/green (intercanvi de CNAME) Entorn nou complet i canvi de DNS El més alt Doble entorn Molt baix 100 %

Dues notes sobre les dues últimes, que són les úniques acceptables en producció:

Immutable és l'equivalent més proper al blue/green de 08-03 dins d'un mateix entorn: instàncies noves des de zero, sense residus de configuració, i si les comprovacions d'estat fallen es destrueixen les noves i no ha passat res. El seu avantatge sobre la renovació és que detecta problemes que només apareixen en una instància acabada d'arrencar —una dependència que ja no es descarrega, un permís que faltava— que en un desplegament per renovació queden emmascarats.

Blue/green per intercanvi de CNAME és el model de 08-03 portat a l'extrem: es crea un entorn complet amb la versió nova, es prova amb la seva pròpia URL i després eb swap intercanvia els CNAME dels dos entorns. És l'única opció que permet revertir en segons, perquè l'entorn blau continua viu.

eb create mercadofresco-tienda-verde --cname mercadofresco-tienda-verde
eb deploy mercadofresco-tienda-verde --version v1.6.0
./pruebas/humo.sh https://mercadofresco-tienda-verde.eu-west-1.elasticbeanstalk.com
eb swap mercadofresco-tienda-produccion --destination_name mercadofresco-tienda-verde

I aquí arriba la comparació honesta amb 08-03, que té dues parts.

El que Beanstalk fa igual de bé: les polítiques cobreixen l'espectre complet de compromisos entre velocitat, cost i risc, i la immutable ofereix garanties reals sense configurar res.

El que no fa: no hi ha canari —no es pot enviar el 10 % del trànsit a la versió nova i observar—, no hi ha reversió automàtica basada en mètriques de negoci, no hi ha ganxos de cicle de vida equivalents a BeforeAllowTraffic amb una Lambda de validació, i l'intercanvi de CNAME depèn del TTL del DNS: els clients amb l'entrada a la memòria cau continuen anant a l'entorn vell durant minuts. La porta de qualitat de 08-04, amb els seus quinze minuts de mètriques i la seva reversió en noranta segons, no té equivalent aquí. Aquesta diferència és la que fa que una botiga amb 900 comandes/hora els divendres no es pugui conformar amb Beanstalk.

flowchart TB
    subgraph R[Renovacio per lots]
      R1["Lot 1 surt de l'ALB"] --> R2["S'actualitza"] --> R3["Torna a l'ALB"]
      R3 --> R4[Lot 2: mateix cicle]
    end
    subgraph I[Immutable]
      I1[ASG temporal nou] --> I2[Instancies netes<br/>amb la versio nova]
      I2 --> I3{Comprovacions OK?}
      I3 -->|Si| I4["S'uneixen a l'ALB i<br/>es retiren les velles"]
      I3 -->|No| I5["Es destrueix l'ASG temporal<br/>no ha passat res"]
    end

Configuracions guardades: que preproducció no se separi de producció

El problema que va obrir aquest mòdul —que preproducció no és igual que producció— també té resposta dins de Beanstalk, encara que més limitada que la de 09-02. Una configuració guardada és una foto de totes les opcions d'un entorn, emmagatzemada a S3 i aplicable a un altre:

# Desar la configuracio de produccio amb un nom
eb config save mercadofresco-tienda-produccion --cfg base-produccion

# Queda a .elasticbeanstalk/saved_configs/base-produccion.cfg.yml: es VERSIONA a Git
git add .elasticbeanstalk/saved_configs/base-produccion.cfg.yml

# Crear preproduccio a partir d'exactament la mateixa configuracio
eb create mercadofresco-tienda-preproduccion --cfg base-produccion \
  --envvars ENTORNO=preproduccion

El fitxer resultant és llegible i comparable amb diff, que és justament el que calia:

EnvironmentConfigurationMetadata:
  Description: Base comuna dels entorns de la botiga
OptionSettings:
  aws:autoscaling:asg:
    MinSize: '2'
    MaxSize: '4'
  aws:elasticbeanstalk:command:
    DeploymentPolicy: Immutable
  aws:elasticbeanstalk:healthreporting:system:
    SystemType: enhanced
Platform:
  PlatformArn: arn:aws:elasticbeanstalk:eu-west-1::platform/Python 3.12 .../4.2.1

La diferència amb el config/entornos.ts de 09-02 és de grau: aquí la configuració es desa, es versiona i es compara, però no es genera des d'una sola font, així que res no impedeix que algú canviï una opció en un entorn i no a l'altre. És una foto, no un contracte.

Definir un entorn de Beanstalk des de CloudFormation o CDK

Beanstalk i la infraestructura com a codi no són excloents: hi ha tipus de recurs natius, de manera que un entorn pot viure dins del model unificat de 09-01 i 09-02.

Resources:
  AppTienda:
    Type: AWS::ElasticBeanstalk::Application
    Properties: { ApplicationName: tienda-mercadofresco }
  EntornoPruebas:
    Type: AWS::ElasticBeanstalk::Environment
    Properties:
      ApplicationName: !Ref AppTienda
      EnvironmentName: mercadofresco-tienda-pruebas
      SolutionStackName: '64bit Amazon Linux 2023 v4.2.1 running Python 3.12'
      OptionSettings:
        - { Namespace: 'aws:autoscaling:asg', OptionName: MinSize, Value: '2' }
        - { Namespace: 'aws:elasticbeanstalk:command',
            OptionName: DeploymentPolicy, Value: Immutable }

Això resol parcialment l'objecció de «la configuració viu al repositori de l'aplicació»: les opcions estructurals passen a la plantilla o al CDK, i .ebextensions es reserva per al que acompanya el codi. És la manera correcta de fer servir Beanstalk en un equip que ja practica infraestructura com a codi, i convé conèixer-la abans de descartar-lo per aquest motiu.

Escalat, estat millorat i tauler de salut

L'escalat és el del mòdul 2, perquè és un ASG: es configuren mínim, màxim i un disparador basat en una mètrica.

eb scale 4        # fixa el nombre desitjat d'instancies
# .ebextensions/03-escalado.config — escalat per peticions, no per CPU
option_settings:
  aws:autoscaling:trigger:
    MeasureName: RequestCount
    Statistic: Sum
    Unit: Count
    Period: 1
    BreachDuration: 2
    UpperThreshold: 6000        # peticions per minut agregades
    UpperBreachScaleIncrement: 1
    LowerThreshold: 2000
    LowerBreachScaleIncrement: -1

La peça pròpia de Beanstalk que sí que aporta valor real és l'estat millorat (enhanced health reporting). Un agent a cada instància combina mètriques del sistema, del servidor web i del balancejador i produeix un estat per instància i un estat global de l'entorn, amb causes concretes.

Color Significat Exemple típic
Verd (Ok) Tot normal
Gris (Info/Pending) Operació en curs Desplegament en marxa
Groc (Warning) Alguna cosa va malament però serveix trànsit Un 5 % de respostes 5xx
Taronja (Degraded) Impacte clar Diverses instàncies fallant la comprovació
Vermell (Severe) Greu Cap instància sana

eb health --refresh mostra aquest tauler al terminal amb les causes —«el procés de l'aplicació no respon al port 8080»—, que és força més útil que un gràfic de CPU. L'estat millorat publica a més mètriques pròpies a CloudWatch (ApplicationRequests5xx, ApplicationLatencyP99, InstancesSevere), sobre les quals es poden muntar les alarmes de 05-01 i connectar-les a alertas-mercadofresco.

Un advertiment que costa disgustos: l'estat millorat no ve activat en tots els camins de creació, i sense ell Beanstalk es limita a la comprovació bàsica de l'ALB. Activa'l sempre; és gratis tret de les mètriques de CloudWatch.

Beanstalk amb una base de dades

Beanstalk permet crear una instància d'RDS dins de l'entorn, i és el parany més conegut del servei.

Si ho fas, la base de dades passa a formar part de la pila de l'entorn. Això significa que eb terminate l'esborra, que una recreació de l'entorn la recrea buida, i que la base de dades hereta el cicle de vida de l'aplicació, que és justament el contrari del que ha de passar: l'aplicació canvia quatre vegades per setmana i les dades han de sobreviure a tot. És el mateix principi de partició per cicle de vida de 09-01, i aquí es viola de manera flagrant.

És còmode per a una demostració o per a un entorn de desenvolupament que es destrueix cada nit. Per a qualsevol altra cosa, la base de dades viu a fora i l'entorn s'hi connecta:

# .ebextensions/04-basedatos.config
option_settings:
  aws:elasticbeanstalk:application:environment:
    DB_HOST: aurora-mercadofresco-pedidos.cluster-abc123.eu-west-1.rds.amazonaws.com
    DB_NOMBRE: pedidos
    DB_SECRETO: mercadofresco/produccion/rds/mfadmin

La contrasenya no va en una variable d'entorn: va a Secrets Manager (04-03) i l'aplicació la resol en arrencar amb el rol d'instància, exactament igual que al mòdul 4. I la connectivitat es resol amb grups de seguretat com a 03-02: el SG que Beanstalk crea per a les instàncies s'autoritza com a origen a sg-mercadofresco-basedatos.

# Esbrinar el grup de seguretat de les instancies de l'entorn
aws elasticbeanstalk describe-configuration-settings \
  --application-name tienda-mercadofresco --environment-name mercadofresco-tienda-pruebas \
  --query "ConfigurationSettings[0].OptionSettings[?OptionName=='SecurityGroups']"

Si ja vas cometre l'error i tens la base de dades a dins, la sortida existeix però és incòmoda: instantània, restauració fora de l'entorn, canvi de la variable de connexió, verificació i desplegament. Amb una finestra de manteniment, perquè l'endpoint canvia.

La decisió honesta per a MercadoFresco

Aquí hi ha el cor de la lliçó, i la resposta té dues parts que semblen contradictòries.

Beanstalk hauria estat una decisió excel·lent al mòdul 2. En aquell moment, MercadoFresco tenia un monòlit Python en un servidor, un equip de tres persones sense experiència a AWS i quatre problemes urgents. Beanstalk n'hauria resolt dos —les caigudes dels divendres, amb autoescalat i balancejador; i bona part del risc de desplegament, amb la política immutable— en una tarda en comptes de en tres mòduls. El cost hauria estat idèntic, perquè Beanstalk no cobra res, i l'equip hauria guanyat mesos.

I avui ja no encaixa. No perquè Beanstalk sigui pitjor del que era, sinó perquè l'arquitectura ha canviat per sota:

El que avui té MercadoFresco Per què no encaixa a Beanstalk
Cinc funcions Lambda amb els seus disparadors Beanstalk no gestiona Lambda
Cues, temes, bus d'esdeveniments i una màquina d'estats Fora del seu àmbit; caldria gestionar-los a part
Aurora, DynamoDB, Redshift i ElastiCache Fora de l'entorn, amb la seva pròpia infraestructura
Blue/green amb canari i reversió per mètriques Beanstalk no té canari ni reversió per mètriques
VPC dissenyada amb sis subxarxes i endpoints Beanstalk la pot fer servir, però no la defineix
CloudFront, WAF, Route 53 Fora de l'entorn
Infraestructura com a codi revisada en PR La configuració de Beanstalk viu a .ebextensions, al repo de l'aplicació

La botiga web és avui una peça d'una arquitectura de vint, i Beanstalk està dissenyat per ser *l'*arquitectura. Ficar la botiga en un entorn de Beanstalk deixaria el 80 % del sistema fora, gestionat amb CDK, i crearia dos models d'infraestructura convivint: la pitjor de les dues opcions.

El criteri general, que serveix més enllà d'aquest cas:

Tria Beanstalk si… Evita'l si…
Equip petit sense especialista en infraestructura Ja tens pràctica en IaC i un pipeline madur
Aplicació monolítica estàndard en un llenguatge admès Arquitectura distribuïda amb molts serveis gestionats
Pressa: necessites alguna cosa en producció aquesta setmana El desplegament necessita canari o reversió per mètriques
Poca personalització d'infraestructura Necessites control fi de xarxa, IAM o desplegament
Treballadors que consumeixen d'una cua La infraestructura ha d'estar tota en un mateix model

I hi ha un cas concret on sí que continua tenint sentit per a MercadoFresco avui: els treballadors. Un entorn de treballador apuntant a cola-mercadofresco-pedidos eliminaria el codi de consum, la gestió de visibilitat i l'escalat de l'asg-mercadofresco-trabajadores, a canvi d'acceptar un segon model per a una peça acotada. La Marta ho deixa anotat com a opció a avaluar, no com a decisió presa.

Comparativa amb CDK, Fargate, App Runner i Amplify

Opció Unitat Control Feina inicial Encaix amb MercadoFresco
CloudFormation / CDK Recursos Total Alta L'escollit: tota l'arquitectura, un model
Elastic Beanstalk Aplicació Mitjà Molt baixa Bona opció al mòdul 2; avui, només treballadors
AWS Fargate (10-02) Contenidor Alt Mitjana Candidat seriós: sense instàncies que apedaçar
AWS App Runner Contenidor o repositori Baix Molt baixa Còmode, però sense control de xarxa fi
AWS Amplify Aplicació web frontal Baix Molt baixa Només per a la part estàtica i les API simples

App Runner és, en certa manera, «el Beanstalk dels contenidors»: li dones una imatge o un repositori i ell s'encarrega de tot, inclòs l'escalat a partir de zero peticions. És més simple que Beanstalk i també més limitat: control de xarxa reduït i menys opcions de desplegament.

Amplify resol un problema diferent —aplicacions web frontals amb allotjament, CI/CD i backend gestionat—, i per a MercadoFresco seria rellevant si el catàleg se servís com a aplicació d'una sola pàgina, no com a substitut de la botiga.

Fargate és la comparació important, i es desenvolupa a 10-02. La diferència essencial amb Beanstalk és què desapareix: Beanstalk gestiona les instàncies per tu, però continuen existint, cal apedaçar-les i triguen dos minuts a arrencar; Fargate elimina les instàncies, i la unitat passa a ser el contenidor. És exactament el problema amb què es tanca aquest mòdul.

La via de sortida

Un temor raonable abans d'adoptar qualsevol PaaS és quedar-se tancat. Amb Beanstalk el tancament és moderat, i convé saber per què abans de decidir.

El que no és específic de Beanstalk: el teu codi, que és una aplicació WSGI normal; els recursos que crea, que són EC2, ASG i ALB estàndard; i la base de dades, si la vas posar a fora. El que que ho és: els fitxers .ebextensions, el dimoni sqsd dels treballadors, les variables d'entorn definides a l'entorn i els ganxos de .platform.

La via de sortida, en cinc passos i sense tall de servei:

  1. Treure l'estat. Si la base de dades era a dins, es treu primer. No es mou res més fins que això estigui fet.
  2. Traduir la configuració. Cada option_setting té el seu equivalent en CDK o CloudFormation, i cada ganxo, el seu lloc a l'AppSpec de CodeDeploy o a les dades d'usuari de la plantilla de llançament.
  3. Aixecar la infraestructura nova en paral·lel, amb el seu propi ALB i el seu propi grup de destinació, sense trànsit.
  4. Moure el trànsit gradualment amb Route 53 (03-05), amb encaminament ponderat: 10 %, 50 %, 100 %, observant les mètriques a cada esglaó. Això és el que Beanstalk no oferia i que aquí sí que es pot fer.
  5. Acabar l'entorn de Beanstalk quan porti una setmana sense trànsit.

La lliçó general val per a qualsevol decisió d'aquest tipus: el tancament no es mesura pel servei, sinó per on viu l'estat i quanta configuració és específica. Si l'estat és a fora i la configuració és traduïble, començar pel que és simple i migrar després és una estratègia perfectament raonable, i gairebé sempre millor que construir l'arquitectura definitiva abans de tenir clients.

Cost i neteja

Beanstalk no cobra: pagues EC2, l'ALB, EBS, el trànsit i les mètriques de CloudWatch. Un entorn de producció típic de MercadoFresco —dos m6i.large, un ALB, estat millorat— voltaria els 165 USD al mes, exactament el mateix que costaria muntat a mà, perquè són els mateixos recursos.

Component Cost mensual aproximat Nota
2 × m6i.large sota demanda ~140 USD Els mateixos que crearia el CDK
ALB ~18 USD + trànsit Un ALB per entorn de servidor web
EBS (2 × 20 GB gp3) ~3,2 USD Volum arrel de cada instància
Estat millorat (mètriques) ~3 USD Mètriques personalitzades a CloudWatch
Beanstalk 0 USD El servei no cobra

Dues fonts de despesa invisible: les versions d'aplicació s'acumulen a S3 sense esborrar-se, i el límit per omissió és de 1.000 versions, després del qual els desplegaments fallen amb un error que no menciona la causa; i els entorns de desenvolupament oblidats, que costen el mateix que els de producció si tenen ALB. Un entorn amb --single (una instància amb IP elàstica i sense balancejador) baixa el cost d'un entorn de proves a menys de 10 USD al mes, i és el correcte per a desenvolupament.

# Politica de cicle de vida: conservar 50 versions i esborrar l'artefacte d'S3
aws elasticbeanstalk update-application-resource-lifecycle \
  --application-name tienda-mercadofresco \
  --resource-lifecycle-config 'ServiceRole=arn:aws:iam::111122223333:role/aws-elasticbeanstalk-service-role,VersionLifecycleConfig={MaxCountRule={Enabled=true,MaxCount=50,DeleteSourceFromS3=true}}'

# Neteja de l'entorn de proves d'aquesta llico
eb terminate mercadofresco-tienda-pruebas --force
aws elasticbeanstalk describe-environments --application-name tienda-mercadofresco \
  --query 'Environments[?Status!=`Terminated`].[EnvironmentName,Status]' --output table

eb terminate esborra la pila de CloudFormation subjacent i amb ella tots els recursos de l'entorn. Si vas crear la base de dades a dins, allà se'n va.

Errors Habituals i Consells

Error: crear la base de dades dins de l'entorn. És l'error clàssic i el més car. Consell: RDS i Aurora sempre a fora, connectats per variables d'entorn i grups de seguretat. L'única excepció és un entorn de desenvolupament rebutjable.

Error: modificar a mà els recursos que Beanstalk gestiona. Canviar l'ASG des de la consola sembla que funciona fins a la següent operació de l'entorn, que el sobreescriu. Consell: tot canvi, per option_settings o per eb config.

Error: confondre aplicació, versió i entorn. Molts «no es desplega el meu canvi» són en realitat un eb deploy contra l'entorn equivocat. Consell: eb status abans de desplegar i eb use per fixar l'entorn per defecte.

Error: fer servir «totes alhora» en producció. Està per omissió en alguns camins de creació i produeix un tall de servei a cada desplegament. Consell: Immutable o blue/green per CNAME en producció; «totes alhora» només en desenvolupament.

Error: desplegar des del portàtil amb eb deploy. Empaqueta el que hi ha al directori i se salta tot el pipeline. Consell: que ho executi CodeBuild amb --version sobre un artefacte ja construït.

Error: no activar l'estat millorat. Sense ell, el diagnòstic es queda en «unhealthy» sense causa. Consell: activa'l sempre i munta alarmes sobre ApplicationRequests5xx i InstancesSevere.

Consell: desa configuracions amb eb config save. Produeixen una plantilla reutilitzable amb la qual crear entorns idèntics: és la manera que té Beanstalk d'evitar que preproducció i producció divergeixin.

Consell: si fas servir entorns de treballador, apunta a la cua existent. WorkerQueueURL evita duplicar cues i permet conviure amb la resta de l'arquitectura de 07-01.

Consell: revisa /var/log/eb-engine.log abans que cap altre registre. Quan un desplegament falla sense motiu aparent, la causa sol ser-hi, no als registres de l'aplicació.

Consell: posa una política de cicle de vida de versions el primer dia. El límit de 1.000 versions s'assoleix abans del que sembla amb un pipeline actiu, i l'error que produeix no diu que el problema siguin les versions.

Consell: fes servir --single als entorns de desenvolupament. Sense balancejador, el cost cau a menys d'una cinquena part i per desenvolupar no es perd res rellevant.

Consell: activa les actualitzacions de plataforma gestionades amb una finestra explícita. És l'avantatge de Beanstalk que més feina estalvia a llarg termini, i la que més gent deixa sense configurar. Dimarts de matinada, mai divendres.

Exercicis

Exercici 1: els treballadors de MercadoFresco a Beanstalk

La Marta vol avaluar seriosament substituir l'asg-mercadofresco-trabajadores per un entorn de treballador de Beanstalk que consumeixi de cola-mercadofresco-pedidos. Descriu com el muntaries: quin tipus d'entorn, com es connecta a la cua existent, què canvia al codi del treballador respecte al consum actual amb receive_message, què passa amb la DLQ mercadofresco-pedidos-fallidos i amb la idempotència de 07-05, com es configura l'escalat i quina política de desplegament faries servir. Acaba amb tres arguments a favor i tres en contra de fer el canvi.

Exercici 2: triar política de desplegament

Per a cadascun d'aquests quatre casos, tria política de desplegament de Beanstalk i justifica-la en termes de temps, cost, risc i capacitat disponible: (a) entorn de desenvolupament on el Luis desplega quinze vegades al dia; (b) preproducció, on es valida cada versió abans de producció; (c) producció un dimarts al matí amb una versió que només canvia textos; (d) producció un dijous amb una versió que canvia la biblioteca d'accés a la base de dades i el procés d'arrencada. Indica en quins la reversió és ràpida i com es fa exactament.

Exercici 3: la decisió que no es va prendre

Imagina que MercadoFresco hagués adoptat Beanstalk al mòdul 2, amb la botiga monolítica en un entorn de servidor web i Aurora fora de l'entorn. Han passat els vuit mòduls del curs i han aparegut les mateixes necessitats: cues, Lambda, CloudFront, WAF, DynamoDB, un pipeline amb canari. Respon: (a) en quin moment exacte del curs Beanstalk hauria començat a fer nosa i per què; (b) quines tres necessitats concretes no hauria pogut cobrir; (c) si la sortida hauria estat més cara que no haver-hi entrat mai; (d) quina regla general n'extreus per triar el nivell d'abstracció d'una plataforma.

Solucions

Solució 1

El muntatge. Un entorn de treballador (eb create mercadofresco-trabajadores --tier worker) sobre la mateixa plataforma Python, a les subxarxes snet-mercadofresco-app-a/-b de la VPC existent i amb el SG sg-mercadofresco-tienda o un de propi que pugui arribar a Aurora i ElastiCache. La connexió a la cua existent es fa amb les opcions d'sqsd, no creant una cua nova:

# .ebextensions/10-trabajador.config
option_settings:
  aws:elasticbeanstalk:sqsd:
    WorkerQueueURL: https://sqs.eu-west-1.amazonaws.com/111122223333/cola-mercadofresco-pedidos
    HttpPath: /tareas/pedido
    MaxRetries: 5
    VisibilityTimeout: 180
    InactivityTimeout: 120
    HttpConnections: 10
  aws:elasticbeanstalk:environment:
    EnvironmentType: LoadBalanced

Què canvia al codi. Desapareix tot el bucle de consum: receive_message, delete_message, la gestió de la visibilitat, el control del lot i el maneig de reintents. El treballador passa a ser un manejador HTTP: rep un POST a /tareas/pedido amb el cos del missatge, processa i retorna 200. Un error o un temps exhaurit es tradueix en un codi diferent de 2xx i el missatge torna a la cua. És menys codi i menys superfície d'error, i el rol d'instància només necessita permisos de lectura i esborrat sobre la cua.

La DLQ i la idempotència. La DLQ no canvia en absolut: continua sent la política de reintents de la mateixa cua d'SQS, definida al seu RedrivePolicy amb maxReceiveCount, i mercadofresco-pedidos-fallidos continua rebent el que exhaureixi els intents. Hi ha un matís important: MaxRetries d'sqsd i maxReceiveCount de la cua són dos comptadors diferents, i mana el menor dels dos; configurar-los amb valors incoherents produeix el clàssic «els missatges no arriben mai a la DLQ». La idempotència continua sent responsabilitat del codi: sqsd no aporta cap garantia de lliurament únic, així que la taula mercadofresco-idempotencia de 07-05 es manté tal qual.

Escalat i desplegament. Escalat per profunditat de la cua, no per CPU: una alarma sobre ApproximateNumberOfMessagesVisible de cola-mercadofresco-pedidos connectada al disparador de l'ASG. És el correcte per a un treballador, perquè la CPU pot estar baixa mentre s'acumulen milers de missatges esperant la base de dades. Política de desplegament immutable: un treballador no atén usuaris, així que no hi ha pressa, i a canvi s'obtenen instàncies netes amb validació completa abans d'acceptar càrrega.

Tres a favor: desapareix codi d'infraestructura del treballador —el bucle de consum és on vivien dos errors del mòdul 7—; les correccions del sistema operatiu passen a ser actualitzacions gestionades; i l'escalat i les comprovacions d'estat vénen resolts.

Tres en contra: introdueix un segon model d'infraestructura convivint amb el CDK, que és exactament el que la lliçó anterior va evitar; la configuració del treballador es reparteix entre .ebextensions al repositori de l'aplicació i el CDK a mercadofresco-infra, amb la qual cosa la font de veritat deixa de ser única; i el model HTTP amaga el control fi del lot, que en el pic dels divendres pot importar.

Veredicte raonable: tècnicament funciona bé i és el millor encaix de Beanstalk a MercadoFresco avui, però l'argument de la unitat del model pesa més. Si l'avaluació es fa, s'ha de fer comparant-lo amb Fargate (10-02), que resol el mateix sense obrir un segon model.

Solució 2

(a) Desenvolupament, quinze desplegaments al dia: totes alhora. És la més ràpida —un parell de minuts—, no costa instàncies extra i el tall de servei no importa perquè només el pateix el Luis. Amb quinze desplegaments diaris, qualsevol política més lenta es tradueix en hores perdudes a la setmana. Reversió: tornar a desplegar la versió anterior; triga el mateix i no passa res.

(b) Preproducció: immutable. Encara que el risc de negoci sigui nul, preproducció existeix per assajar el desplegament de producció, i assajar-lo amb una altra política no assaja res. A més, la immutable és la que detecta els problemes d'arrencada en fred, que és precisament el que es vol descobrir abans de producció. El cost extra és acceptable perquè els desplegaments són pocs.

(c) Producció, dimarts, només textos: renovació amb lot addicional. El canvi és de baix risc i no toca dependències ni arrencada, així que la garantia extra de la immutable no compensa el seu temps. El lot addicional manté el 100 % de capacitat durant tot el procés —crític en una botiga— a canvi d'una sola instància extra durant uns minuts. Reversió: redesplegar la versió anterior amb la mateixa política; uns minuts.

(d) Producció, dijous, biblioteca de base de dades i arrencada: blue/green per intercanvi de CNAME. És el cas de més risc de l'exercici: un canvi al procés d'arrencada pot fallar només en instàncies noves, i un canvi de biblioteca de base de dades pot degradar el rendiment sense fallar cap comprovació d'estat. L'entorn verd permet executar les proves de fum amb trànsit real controlat i, sobretot, l'entorn blau continua viu: la reversió és un eb swap de tornada, en segons.

I la lectura transversal, que enllaça amb 08-05: la reversió és ràpida només a (d). A (a), (b) i (c) revertir significa desplegar una altra vegada, és a dir, minuts amb el sistema en l'estat dolent. Aquesta és la diferència real entre blue/green i tota la resta, i el motiu pel qual la política es tria pel risc del canvi, no per costum. Un detall final: l'eb swap depèn del TTL del CNAME, així que convé baixar-lo a 60 segons dies abans d'un desplegament així.

Solució 3

(a) Beanstalk hauria començat a fer nosa al mòdul 7, amb la integració d'aplicacions. Fins allà, l'arquitectura era una aplicació web amb una base de dades, i això és exactament el que Beanstalk fa bé; el mòdul 3 (VPC, ALB, CloudFront) i el 4 (IAM, WAF) haurien conviscut sense problema, perquè Beanstalk es pot desplegar en una VPC existent i CloudFront es posa davant de qualsevol ALB. El punt d'inflexió és el moment en què l'aplicació deixa de ser un procés i passa a ser un sistema de peces coordinades: cues, temes, un bus i una màquina d'estats que Beanstalk no gestiona. A partir d'aquí, l'entorn passa de ser «l'arquitectura» a ser «una peça més», que és justament el que no és.

(b) Tres necessitats no cobertes: el desplegament canari amb reversió automàtica per mètriques de negoci de 08-03 i 08-04, que no té equivalent; l'orquestració de les cinc Lambda i la màquina d'estats de 07-04, completament fora del seu àmbit; i la infraestructura com a codi unificada i revisable d'aquest mòdul, perquè la configuració de Beanstalk viu a .ebextensions dins del repositori de l'aplicació, barrejant dos cicles de vida que 09-01 recomana separar.

(c) No, la sortida no hauria estat més cara que no haver-hi entrat. Amb la base de dades a fora —que era la condició de l'enunciat—, l'estat no queda atrapat, i el que cal traduir són option_settings i ganxos, una feina de dies, no de mesos. La migració s'hauria fet amb encaminament ponderat de Route 53 sense tall de servei. Davant d'això, l'alternativa era haver construït al mòdul 2 una infraestructura que l'equip encara no sabia dissenyar, per a una arquitectura que encara no existia: probablement s'hauria fet malament i s'hauria hagut de refer igualment, però sense haver tingut res en producció mentrestant. El cost d'entrar i sortir és real, però és menor que el cost de la paràlisi inicial.

(d) La regla general. Tria el nivell d'abstracció més alt que cobreixi els teus requisits actuals, sempre que l'estat quedi a fora i la configuració sigui traduïble. Les tres condicions importen: «requisits actuals» i no imaginats, perquè construir per a una arquitectura futura que potser no arribarà és la manera més cara d'equivocar-se; «l'estat a fora», perquè és l'única cosa que no es migra sense dolor; i «configuració traduïble», perquè és el que converteix el canvi de plataforma en un projecte de dies. La regla s'aplica cap amunt i cap avall: per això MercadoFresco, que avui necessita control fi, fa servir CDK, i per això mateix a 10-02 es plantejarà tornar a pujar el nivell d'abstracció amb Fargate.

Conclusió

Elastic Beanstalk converteix un fitxer comprimit i una cadena amb la versió del llenguatge en una aplicació en producció amb balancejador, autoescalat, grups de seguretat, alarmes i perfil d'instància, i ho fa generant una plantilla de CloudFormation i desplegant una pila —awseb-e-xxxx-stack— amb les mateixes regles de 09-01. És una plataforma com a servei que no amaga la infraestructura: pots entrar per SSH, mirar els registres i veure els recursos, amb la contrapartida que modificar-los a mà trenca el model, perquè Beanstalk els sobreescriu en la següent operació.

Tens els seus cinc conceptes, i en particular la separació entre versió d'aplicació —l'artefacte immutable de 08-02, que es promociona amb eb deploy --version— i entorn, que és on hi ha tot el cost. Tens els entorns de treballador, amb sqsd traduint missatges d'SQS en peticions HTTP a localhost: el bucle de consum escrit per AWS, amb l'advertiment que la idempotència continua sent teva i que MaxRetries i maxReceiveCount són dos comptadors diferents on mana el menor. I tens la personalització amb .ebextensions i .platform, amb leader_only per a les migracions i l'avís que un ganxo lent multiplica el temps de desplegament pel nombre d'instàncies.

Les cinc polítiques de desplegament cobreixen l'espectre complet entre velocitat, cost i risc, i la comparació amb 08-03 és la part més útil de la lliçó: la immutable dóna garanties reals sense configurar res i detecta les fallades que només apareixen en instàncies acabades d'arrencar; el blue/green per intercanvi de CNAME és l'única cosa que permet revertir en segons, amb la salvetat del TTL del DNS. Però no hi ha canari, ni reversió automàtica per mètriques de negoci, ni ganxos de validació, i aquesta absència és la que descarta Beanstalk per a una botiga amb 900 comandes/hora els divendres. Més el parany més conegut del servei: la base de dades mai dins de l'entorn, perquè eb terminate se l'emporta.

I la decisió honesta, que té dues cares. Beanstalk hauria estat excel·lent al mòdul 2 —un monòlit, tres persones sense experiència a AWS, dos dels quatre problemes resolts en una tarda i cost idèntic, perquè el servei és gratis—. I avui ja no encaixa, no perquè hagi empitjorat, sinó perquè la botiga web va passar de ser l'arquitectura a ser una peça de vint: cinc Lambda, quatre cues, un bus, una màquina d'estats, quatre bases de dades i un pipeline amb canari que quedarien fora de l'entorn, obligant a mantenir dos models d'infraestructura alhora. La regla que en queda és més valuosa que el servei: tria el nivell d'abstracció més alt que cobreixi els teus requisits actuals, sempre que l'estat quedi a fora i la configuració sigui traduïble, perquè llavors la via de sortida és un projecte de dies i no una condemna.

Queda un problema que Beanstalk tampoc no resolia i que cap de les tres lliçons d'aquest mòdul no ha tocat encara. Tota la infraestructura de MercadoFresco —les nou piles del CDK, els tres entorns, el pipeline que es desplega a si mateix— viu en un sol compte, el 111122223333. Un cdk destroy mal dirigit arriba a producció, les quotes d'adreces IP elàstiques i d'instàncies es comparteixen entre desenvolupament i producció, cap política d'IAM no aïlla del tot qui ja té permisos amplis, i la factura no separa de veritat el que costa cada entorn. La infraestructura és reproduïble, però el radi d'explosió no està acotat.

A 09-04, «AWS Organizations», es tanca el mòdul atacant exactament això: comptes separats per entorn, unitats organitzatives, polítiques de control de serveis que limiten el que es pot fer fins i tot sent administrador, facturació consolidada, accés amb IAM Identity Center perquè la Marta, el Luis i la Sara treballin en quatre comptes sense multiplicar usuaris, i una línia base que es desplega sola a cada compte nou amb els StackSets de 09-01.

Curs d'AWS

Mòdul 1: Introducció a AWS

Mòdul 2: Serveis principals d'AWS

Mòdul 3: Xarxes i lliurament de contingut

Mòdul 4: Seguretat i identitat

Mòdul 5: Monitoratge i gestió

Mòdul 6: Bases de dades

Mòdul 7: Integració d'aplicacions

Mòdul 8: Eines per a desenvolupadors

Mòdul 9: Infraestructura com a codi i govern de comptes

Mòdul 10: Contenidors a AWS

Mòdul 11: Millors pràctiques i gestió de costos

© Copyright 2026. Tots els drets reservats