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.smallamb 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
- Què és una plataforma com a servei
- Què crea Beanstalk per sota
- Conceptes: aplicació, versió, entorn i plataforma
- Entorns de servidor web i entorns de treballador
- Plataformes admeses i desplegament de la botiga pas a pas
- Personalització amb
.ebextensionsi.platform - Polítiques de desplegament, configuracions guardades i IaC
- Escalat, estat millorat i tauler de salut
- Beanstalk amb una base de dades
- La decisió honesta per a MercadoFresco
- Comparativa amb CDK, Fargate, App Runner i Amplify
- La via de sortida
- Cost i neteja
- Errors habituals i consells
- Exercicis
- 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.logsó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=plataformaAquesta ú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-pruebasDos 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: trueFixa'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-verdeI 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=preproduccionEl 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.1La 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.
# .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: -1La 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/mfadminLa 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 sí 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:
- 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.
- Traduir la configuració. Cada
option_settingté el seu equivalent en CDK o CloudFormation, i cada ganxo, el seu lloc a l'AppSpecde CodeDeploy o a les dades d'usuari de la plantilla de llançament. - Aixecar la infraestructura nova en paral·lel, amb el seu propi ALB i el seu propi grup de destinació, sense trànsit.
- 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.
- 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 tableeb 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: LoadBalancedQuè 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
- Què és AWS?
- Configuració del teu compte d'AWS
- Infraestructura global d'AWS
- Consola d'administració d'AWS
- AWS CLI i SDK
Mòdul 2: Serveis principals d'AWS
Mòdul 3: Xarxes i lliurament de contingut
- Amazon VPC
- Grups de seguretat i llistes de control d'accés
- Elastic Load Balancing
- Amazon CloudFront
- Route 53
Mòdul 4: Seguretat i identitat
- AWS Identity and Access Management (IAM)
- AWS Key Management Service (KMS)
- Secrets Manager i Parameter Store
- AWS Shield
- AWS WAF
Mòdul 5: Monitoratge i gestió
- Amazon CloudWatch
- AWS X-Ray i traçabilitat distribuïda
- AWS CloudTrail
- AWS Config
- AWS Trusted Advisor
Mòdul 6: Bases de dades
- Com triar la base de dades adequada
- Amazon DynamoDB
- Amazon Aurora
- Amazon Redshift
- Amazon ElastiCache
Mòdul 7: Integració d'aplicacions
- Amazon SQS
- Amazon SNS
- Amazon EventBridge
- AWS Step Functions
- Patrons d'integració: idempotència, reintents i cues de missatges fallits
