A la lliçó 02-01 vam dimensionar el grup d'Auto Scaling asg-mercadofresco-tienda per al pic dels
divendres: mínim 2, desitjat 2, màxim 4, amb la política cpu-objetivo-60 i l'acció programada
pico-viernes-tarde. Els números sortien: el pic dels divendres de 17:00 a 21:00 són 900 comandes
per hora, cada instància aguanta 600 comandes per hora, i amb dues instàncies hi ha capacitat de
sobres. A 03-01 i 03-02 els hem donat una xarxa pròpia i un tallafocs que les protegeix.
I tanmateix, MercadoFresco continua caient els divendres. Perquè l'ASG pot llançar quatre instàncies, però ningú no envia trànsit a les tres últimes. El domini apunta a una IP concreta, la de la primera màquina, i les altres es queden enceses i ocioses mentre aquella s'ofega. Falta la peça central: alguna cosa que rebi tot el trànsit i el reparteixi.
Això és un balancejador de càrrega. En aquesta lliçó la Marta munta alb-mercadofresco-tienda, el
connecta al grup d'Auto Scaling i acaba de resoldre el problema 1 del curs: les caigudes dels
divendres. Pel camí apareixen les comprovacions d'estat, que són la part que més aplicacions
ha tombat per estar mal configurada.
Contingut
- Per què cal un balancejador
- Els tipus de balancejador: ALB, NLB, GWLB i el CLB heretat
- Anatomia d'un ALB: oients, regles i grups de destinació
- Comprovacions d'estat: la part perillosa
- Integració amb el grup d'Auto Scaling
- Drenatge de connexions i desplegaments sense talls
- Encaminament avançat per ruta i per host
- Redireccions i respostes fixes
- HTTPS al balancejador: ACM, polítiques TLS i SNI
- Sessions enganxoses i per què és millor no necessitar-les
- Registres d'accés i mètriques
- Creació completa per CLI
- Cost de l'ALB i neteja
- El trànsit del divendres, d'extrem a extrem
Per què cal un balancejador
Un balancejador de càrrega és un servei gestionat que es col·loca davant d'un conjunt de servidors, rep totes les peticions i les distribueix entre ells. El que aporta va bastant més enllà del repartiment:
- Una única porta d'entrada. El domini
mercadofresco.exampleapunta al balancejador, no a cap instància. Les instàncies poden crear-se, morir o canviar d'IP sense que ningú se n'assabenti. - Comprovacions d'estat. El balancejador pregunta periòdicament a cada instància si està bé, i deixa d'enviar-li trànsit si no respon. Una fallada deixa de ser una caiguda.
- Alta disponibilitat entre zones. En ser a les dues subxarxes públiques, si
eu-west-1acau sencera, el trànsit continua entrant pereu-west-1b. - Terminació TLS. El certificat viu al balancejador, no a cada instància. Un sol lloc per renovar.
- Escalat elàstic real. L'ASG registra les instàncies noves automàticament, així que la capacitat afegida a les 17:00 del divendres comença a rebre trànsit sola.
- Aïllament. Les instàncies passen a subxarxes privades sense IP pública: només el balancejador hi parla.
Sense balancejador, cadascun d'aquests sis punts s'ha de resoldre a mà, i cap no es resol bé.
Els tipus de balancejador: ALB, NLB, GWLB i el CLB heretat
AWS ofereix tres balancejadors moderns i un d'heretat. Triar malament no trenca res, però costa diners o funcionalitat.
| ALB Application LB |
NLB Network LB |
GWLB Gateway LB |
CLB (heretat) |
|
|---|---|---|---|---|
| Capa OSI | 7 (aplicació) | 4 (transport) | 3 (xarxa) | 4 i 7, a mitges |
| Protocols | HTTP, HTTPS, gRPC, WebSocket | TCP, UDP, TLS | IP (GENEVE) | HTTP, HTTPS, TCP, SSL |
| Encamina per | Ruta, host, capçalera, mètode, cadena de consulta, IP d'origen | Port i protocol | Tot el trànsit | Port |
| Latència afegida | ~mil·lisegons | ~microsegons | Baixa | Mil·lisegons |
| IP estàtica | No (nom DNS) | Sí, una IP elàstica per AZ | No aplica | No |
| Destinacions | Instàncies, IP, Lambda, ALB niat | Instàncies, IP, ALB | Aplicacions virtuals | Instàncies |
| Acaba TLS | Sí | Sí | No | Sí |
| Conserva la IP d'origen | A la capçalera X-Forwarded-For |
Sí, de forma nativa | Sí | A la capçalera |
| Rendiment | Milions de peticions/s | Milions de connexions/s | Alt | Limitat |
| Cas d'ús | Aplicacions web i API | Jocs, IoT, MQTT, latència extrema, IP fixa | Tallafocs i IDS de tercers | Res de nou |
L'elecció de MercadoFresco és l'ALB, i les raons són concretes:
- El trànsit és HTTP/HTTPS. És exactament per al que existeix l'ALB.
- Caldrà encaminar per ruta:
/api/*cap al servei de comandes i la resta cap a la botiga. Un NLB no pot fer-ho perquè no llegeix la petició HTTP. - Es necessita redirecció automàtica d'HTTP a HTTPS, que l'ALB fa de forma nativa.
- Els mil·lisegons de latència addicional són irrellevants per a una botiga; per a un videojoc en temps real no ho serien, i llavors la resposta seria NLB.
Sobre el CLB: és la primera generació, continua existint per compatibilitat i no s'ha de fer servir en res nou. Si te'n trobes un, la migració a ALB és gairebé sempre directa.
Un patró que convé conèixer encara que no el fem servir: NLB davant d'ALB. Serveix per obtenir una IP fixa (per exemple, perquè un proveïdor de pagaments exigeix una llista blanca d'IP) mantenint l' encaminament per ruta de l'ALB.
Anatomia d'un ALB: oients, regles i grups de destinació
Un ALB té quatre peces i cal tenir-les clares perquè la CLI les crea una a una:
flowchart TB
NET["Internet"]
subgraph ALB["alb-mercadofresco-tienda (subxarxes publiques de 1a i 1b)"]
L80["Oient HTTP :80<br/>accio per defecte: redirigir a HTTPS"]
L443["Oient HTTPS :443<br/>certificat ACM"]
R1["Regla 10: ruta = /api/*"]
R2["Regla 20: host = admin.mercadofresco.example"]
RD["Accio per defecte"]
end
subgraph TGS["Grups de destinacio"]
TG1["tg-mercadofresco-tienda<br/>protocol HTTPS :443"]
TG2["tg-mercadofresco-api<br/>protocol HTTPS :443"]
TG3["tg-mercadofresco-admin"]
end
E1["Instancies de l'ASG<br/>snet-app-a"]
E2["Instancies de l'ASG<br/>snet-app-b"]
NET --> L80
NET --> L443
L443 --> R1 --> TG2
L443 --> R2 --> TG3
L443 --> RD --> TG1
TG1 --> E1
TG1 --> E2
| Peça | Què és | Detall important |
|---|---|---|
| Balancejador | El recurs en si, amb el seu nom DNS | Ha d'estar en almenys dues subxarxes d'AZ diferents |
| Oient (listener) | Un port i protocol a l'escolta | Cadascun té una acció per defecte obligatòria |
| Regla | Condició + acció, dins d'un oient | S'avaluen per prioritat ascendent |
| Grup de destinació (target group) | El conjunt de destinacions i la seva comprovació d'estat | Aquí viu el health check, no al balancejador |
Dos conceptes que la gent confon:
- El grup de destinació té el seu propi protocol i port, independents de l'oient. L' oient pot rebre HTTPS al 443 i reenviar a les instàncies en HTTP pel 8080. Això és la terminació TLS.
- La comprovació d'estat es defineix al grup de destinació, no al balancejador. Un mateix balancejador pot tenir grups amb comprovacions molt diferents.
Els tipus de destinació disponibles:
| Tipus | Què registra | Quan es fa servir |
|---|---|---|
instance |
ID d'instància EC2 | El més habitual amb un ASG |
ip |
IP privades concretes | Contenidors, destinacions on-premise per VPN |
lambda |
Una funció Lambda | API sense servidor darrere d'un ALB |
alb |
Un altre ALB | Només des d'un NLB, per al patró d'IP fixa |
I els algorismes de repartiment d'un grup de destinació:
| Algorisme | Com reparteix | Quan |
|---|---|---|
round_robin |
Un a cada destinació per torns | Per defecte; peticions homogènies |
least_outstanding_requests |
A la destinació amb menys peticions en curs | Recomanat quan les peticions duren temps molt diferents |
weighted_random |
Aleatori amb pesos | Amb anomaly mitigation activada |
Per a MercadoFresco, least_outstanding_requests: no dura el mateix carregar la portada que confirmar
una comanda amb passarel·la de pagament.
Comprovacions d'estat: la part perillosa
El balancejador envia periòdicament una petició a cada destinació registrada. Si respon bé un nombre de vegades seguides, la marca sana (healthy) i li envia trànsit. Si falla, la marca no sana (unhealthy) i deixa d'enviar-n'hi.
Paràmetres i valors recomanats per a MercadoFresco:
| Paràmetre | Què és | Per defecte | MercadoFresco | Raó |
|---|---|---|---|---|
HealthCheckPath |
Ruta que se sol·licita | / |
/salud |
Un punt d'enllaç dedicat, no la portada |
HealthCheckProtocol |
HTTP o HTTPS | HTTP | HTTPS | Coherent amb el grup de destinació |
HealthCheckIntervalSeconds |
Cada quant es pregunta | 30 s | 15 s | Detectar fallades abans |
HealthCheckTimeoutSeconds |
Quant s'espera la resposta | 5 s | 5 s | Menor que l'interval, sempre |
HealthyThresholdCount |
Encerts per declarar-la sana | 5 | 2 | Reincorporar de pressa |
UnhealthyThresholdCount |
Fallades per declarar-la no sana | 2 | 3 | Tolerar un pic puntual |
Matcher |
Codis HTTP acceptats | 200 |
200 |
Explícit i estricte |
Amb aquests valors, una instància caiguda triga com a màxim 3 × 15 = 45 segons a deixar de rebre trànsit.
Què passa realment quan una instància es marca com a no sana
Aquesta és la seqüència exacta, i val la pena detallar-la perquè hi ha un efecte en cadena que sorprèn:
- L'ALB deixa d'enviar-li peticions noves. Les que ja estaven en curs es completen.
- La instància continua encesa i continua costant diners. L'ALB no l'apaga.
- La mètrica
HealthyHostCountdel grup de destinació baixa en un. - Tot el trànsit es reparteix entre les instàncies restants. Si n'eren dues i en queda una, aquella rep el doble.
- Si l'ASG té la comprovació d'estat del balancejador activada (
--health-check-type ELB), l'ASG acaba la instància i en llança una de nova.
El pas 4 és el perill. Imagina't un /salud que consulta la base de dades. Si la base de dades es
posa lenta un moment, totes les instàncies fallen la comprovació alhora, l'ALB les marca
totes com a no sanes i respon 503 Service Unavailable a tots els clients. L'aplicació
funcionava; el health check l'ha tombada.
Encara pitjor amb l'ASG en mode ELB: l'ASG acaba totes les instàncies i en llança de noves, que
també fallen perquè la base de dades continua lenta, i entra en un bucle de reemplaçament perpetu.
Com escriure un health check que no tombi l'aplicació
La regla: la comprovació d'estat ha de verificar que AQUESTA instància pot servir trànsit, no que tot el sistema funciona.
# A l'aplicació de la botiga: dos punts d'enllaç diferents i amb propòsits diferents.
@app.route("/salud")
def salut():
"""Comprovació per al balancejador. Ha de ser ràpida, local i NO tocar dependències.
Només respon: aquest procés està viu i a punt per atendre peticions?"""
if not app.config.get("ARRENCADA_COMPLETADA"):
return {"estat": "arrencant"}, 503
return {"estat": "ok", "versio": app.config["VERSIO"]}, 200
@app.route("/salud/profunda")
def salut_profunda():
"""Comprovació per a la monitorització (CloudWatch, 05-01). Sí que consulta dependències,
però MAI la fa servir el balancejador: serveix per alertar, no per retirar instàncies."""
resultat = {"base_dades": "ok", "s3": "ok", "efs": "ok"}
codi = 200
try:
with obtenir_connexio() as conn:
conn.execute("SELECT 1")
except Exception as e:
resultat["base_dades"] = f"error: {type(e).__name__}"
codi = 503
return resultat, codiLa diferència entre els dos punts d'enllaç és tota la lliçó:
/saludrespon en microsegons, no depèn de res extern i només pot fallar si aquesta instància està trencada. Si falla, retirar-la és sempre la decisió correcta./salud/profundasí que comprova dependències, però la seva fallada ha de generar una alarma perquè algú ho miri, no la retirada automàtica de servidors sans.
El 503 durant l'arrencada és igualment important: fa que l'ALB no enviï trànsit a una
instància que encara està descarregant l'aplicació al user-data-tienda.sh.
Integració amb el grup d'Auto Scaling
Connectar asg-mercadofresco-tienda amb el grup de destinació es fa amb una sola comanda, i a partir
d'aquí tot és automàtic:
aws autoscaling attach-load-balancer-target-groups \
--profile mercadofresco-dev --region eu-west-1 \
--auto-scaling-group-name asg-mercadofresco-tienda \
--target-group-arns "$TG_ARN"El que passa a partir d'aquell moment:
| Esdeveniment | Què fa l'ASG | Què fa l'ALB |
|---|---|---|
La política cpu-objetivo-60 llança una instància |
La crea des de lt-mercadofresco-tienda |
La registra al grup, estat initial |
La instància arrenca i /salud respon 200 dues vegades |
— | Passa a healthy i comença a rebre trànsit |
| El pic passa i l'ASG redueix capacitat | Marca la instància per acabar-la | La posa en draining |
| Acaben les connexions en curs | Espera al deregistration_delay |
La treu del grup |
L'ALB marca una instància unhealthy |
Amb --health-check-type ELB, la reemplaça |
Deixa d'enviar-li trànsit |
El segon canvi important és el tipus de comprovació d'estat de l'ASG:
aws autoscaling update-auto-scaling-group \
--profile mercadofresco-dev --region eu-west-1 \
--auto-scaling-group-name asg-mercadofresco-tienda \
--health-check-type ELB \
--health-check-grace-period 300| Tipus | Què comprova l'ASG | Problema |
|---|---|---|
EC2 (per defecte) |
Només l'estat de l'hipervisor i del sistema | Una instància amb l'aplicació morta hi consta com a sana |
ELB |
L'estat de l'hipervisor i el del grup de destinació | Detecta aplicacions caigudes, no només màquines caigudes |
El --health-check-grace-period 300 és tan important com el tipus: són els segons que l'ASG
espera des que la instància arrenca abans de fer cas al balancejador. El
user-data-tienda.sh de MercadoFresco triga uns dos minuts a instal·lar i arrencar l'aplicació;
sense marge de gràcia, l'ASG mataria la instància just abans que acabés d'arrencar, i ho
faria en bucle. Cinc minuts donen prou folgança.
Drenatge de connexions i desplegaments sense talls
Quan una instància es dona de baixa, l'ALB no talla les connexions obertes de cop: la posa en
estat draining. Durant el retard de baixa de registre (deregistration_delay.timeout_seconds,
300 segons per defecte) no rep peticions noves, però acaba les que tenia en curs.
aws elbv2 modify-target-group-attributes \
--profile mercadofresco-dev --region eu-west-1 \
--target-group-arn "$TG_ARN" \
--attributes \
Key=deregistration_delay.timeout_seconds,Value=60 \
Key=load_balancing.algorithm.type,Value=least_outstanding_requests \
Key=stickiness.enabled,Value=falseCom triar el valor: el temps de la petició més llarga que serveix la teva aplicació, més un marge.
| Tipus d'aplicació | Valor recomanat |
|---|---|
| API amb respostes de mil·lisegons | 15-30 s |
| Botiga amb confirmació de comanda i passarel·la de pagament | 60 s |
| Pujada de fitxers grans | 180-300 s |
| WebSocket de llarga durada | Fins a 3600 s |
Els 60 segons de MercadoFresco cobreixen el pitjor cas: un client que ha premut «confirmar comanda» i està esperant la resposta de la passarel·la. Amb el valor per defecte de 300 s, reduir capacitat després del pic del divendres trigaria cinc minuts de més pagant instàncies ocioses; amb 5 s, es tallaria un pagament a mitges.
Encaminament avançat per ruta i per host
Aquí és on l'ALB es guanya el nom: llegeix la petició HTTP i decideix en funció del seu contingut. MercadoFresco necessita tres destinacions diferents sota el mateix balancejador.
# Regla 10: tot allo que comenci per /api/ va al grup de l'API
aws elbv2 create-rule --profile mercadofresco-dev --region eu-west-1 \
--listener-arn "$LISTENER_443" \
--priority 10 \
--conditions '[{"Field":"path-pattern","Values":["/api/*"]}]' \
--actions "[{\"Type\":\"forward\",\"TargetGroupArn\":\"$TG_API\"}]"
# Regla 20: el tauler d'administracio, per host
aws elbv2 create-rule --profile mercadofresco-dev --region eu-west-1 \
--listener-arn "$LISTENER_443" \
--priority 20 \
--conditions '[{"Field":"host-header","Values":["admin.mercadofresco.example"]}]' \
--actions "[{\"Type\":\"forward\",\"TargetGroupArn\":\"$TG_ADMIN\"}]"Les condicions disponibles i un exemple de cadascuna:
| Condició | Exemple | Ús a MercadoFresco |
|---|---|---|
path-pattern |
/api/* |
Separar l'API del web |
host-header |
admin.mercadofresco.example |
Tauler intern al seu subdomini |
http-header |
X-Canario: si |
Proves dirigides abans d'un desplegament |
http-request-method |
POST |
Encaminar escriptures a un grup diferent |
query-string |
version=beta |
Activar una versió nova amb un paràmetre |
source-ip |
81.45.20.7/32 |
Restringir /admin a l'oficina |
Regles d'avaluació que cal conèixer:
- Les regles s'avaluen per prioritat ascendent i s'aplica la primera que coincideix. Deixa buits entre prioritats (10, 20, 30) per poder inserir-ne.
- Si no en coincideix cap, s'aplica l'acció per defecte de l'oient.
- Els patrons de ruta distingeixen majúscules i minúscules i admeten
*i?. - Una regla pot combinar fins a 5 condicions, i totes s'han de complir (
AND). - Un ALB admet fins a 100 regles per oient.
Redireccions i respostes fixes
A més de reenviar, un oient pot respondre per si mateix, sense tocar cap instància.
Redirecció d'HTTP a HTTPS, la configuració estàndard de l'oient del port 80:
aws elbv2 create-listener --profile mercadofresco-dev --region eu-west-1 \
--load-balancer-arn "$ALB_ARN" \
--protocol HTTP --port 80 \
--default-actions '[{
"Type": "redirect",
"RedirectConfig": {
"Protocol": "HTTPS",
"Port": "443",
"Host": "#{host}",
"Path": "/#{path}",
"Query": "#{query}",
"StatusCode": "HTTP_301"
}
}]'Els marcadors #{host}, #{path} i #{query} conserven el que va demanar el client: qui entri a
http://mercadofresco.example/producto/tomate?origen=email acaba a la mateixa pàgina per HTTPS. Un
301 és permanent i el navegador el desa a la memòria cau, amb la qual cosa la segona visita ja no passa pel port
80. Si estiguessis provant i no volguessis que es desés a la memòria cau, faries servir HTTP_302.
Resposta fixa, útil per bloquejar rutes o donar manteniment:
aws elbv2 create-rule --profile mercadofresco-dev --region eu-west-1 \
--listener-arn "$LISTENER_443" --priority 5 \
--conditions '[{"Field":"path-pattern","Values":["/.env","/.git/*","/wp-admin/*"]}]' \
--actions '[{
"Type": "fixed-response",
"FixedResponseConfig": {
"StatusCode": "403",
"ContentType": "text/plain",
"MessageBody": "Prohibit"
}
}]'Aquella regla, amb prioritat 5 (la més alta), talla al balancejador els intents automatitzats de llegir fitxers de configuració. No arriben ni a tocar una instància. És un filtratge tosc: el filtratge seriós de peticions malicioses és AWS WAF, a 04-05.
HTTPS al balancejador: ACM, polítiques TLS i SNI
MercadoFresco encara serveix per HTTP. Posar-li HTTPS amb AWS és gratis i són dos passos.
AWS Certificate Manager (ACM) emet certificats TLS públics sense cost i els renova automàticament mentre estiguin associats a un recurs d'AWS. Això elimina de cop el problema clàssic del certificat que caduca un diumenge.
aws acm request-certificate --profile mercadofresco-dev --region eu-west-1 \
--domain-name mercadofresco.example \
--subject-alternative-names "*.mercadofresco.example" \
--validation-method DNS \
--tags Key=Proyecto,Value=mercadofresco Key=Entorno,Value=produccion \
Key=Componente,Value=tienda Key=Propietario,Value=marta \
Key=CentroCoste,Value=operacionesDos detalls:
- El comodí
*.mercadofresco.examplecobreixwww,admin,apii qualsevol subdomini futur amb un sol certificat. - La regió importa: per a un ALB, el certificat ha d'estar a la mateixa regió que l'ALB
(
eu-west-1). Per a CloudFront ha d'estar aus-east-1, un parany que veurem a 03-04.
El certificat queda en estat PENDING_VALIDATION fins que es demostri que el domini és teu
creant un registre CNAME que ACM indica. Aquesta validació per DNS es completa a la lliçó 03-05,
quan tinguem la zona allotjada de Route 53. Fins llavors, per practicar pots crear l'
oient HTTPS amb un certificat autosignat importat, o treballar només amb el port 80.
L'oient HTTPS, un cop emès el certificat:
LISTENER_443=$(aws elbv2 create-listener --profile mercadofresco-dev --region eu-west-1 \
--load-balancer-arn "$ALB_ARN" \
--protocol HTTPS --port 443 \
--certificates CertificateArn="$CERT_ARN" \
--ssl-policy ELBSecurityPolicy-TLS13-1-2-2021-06 \
--default-actions "Type=forward,TargetGroupArn=$TG_TIENDA" \
--query 'Listeners[0].ListenerArn' --output text)Les polítiques de seguretat TLS defineixen quines versions i xifratges s'accepten:
| Política | TLS admès | Comentari |
|---|---|---|
ELBSecurityPolicy-TLS13-1-2-2021-06 |
1.2 i 1.3 | Recomanada: segura i compatible amb qualsevol navegador actual |
ELBSecurityPolicy-TLS13-1-3-2021-06 |
Només 1.3 | Màxima seguretat; trenca clients antics |
ELBSecurityPolicy-FS-1-2-Res-2020-10 |
1.2 amb forward secrecy obligatori | Entorns amb requisits de compliment |
ELBSecurityPolicy-2016-08 |
1.0, 1.1, 1.2 | No fer servir: admet TLS 1.0 |
Terminació TLS significa que l'ALB desxifra el trànsit i decideix què fer amb la petició ja en
clar. És l'única manera d'encaminar per ruta o per capçalera: per llegir /api/* cal poder llegir la
petició. De l'ALB a les instàncies, el trànsit pot anar en clar (més ràpid, i viatja per la xarxa
privada d'AWS dins de la teva VPC) o tornar-se a xifrar. MercadoFresco el torna a xifrar: el grup de destinació
fa servir HTTPS al 443, perquè la política interna exigeix xifratge extrem a extrem encara que el tram sigui
privat.
SNI (Server Name Indication) permet allotjar diversos certificats en un mateix oient: el
client indica quin domini vol a la salutació TLS i l'ALB presenta el certificat adequat. Així, un
únic ALB pot servir mercadofresco.example i, en el futur, mercadofresco.pt amb certificats
diferents, sense balancejadors addicionals.
# Afegir un segon certificat al mateix oient
aws elbv2 add-listener-certificates --profile mercadofresco-dev --region eu-west-1 \
--listener-arn "$LISTENER_443" \
--certificates CertificateArn="$CERT_ARN_PT"Sessions enganxoses i per què és millor no necessitar-les
Les sessions enganxoses (stickiness) fan que un mateix client vagi sempre a la mateixa
instància. L'ALB insereix una galeta (AWSALB, o una de pròpia de l'aplicació) i la fa servir per dirigir
les peticions següents.
aws elbv2 modify-target-group-attributes --profile mercadofresco-dev --region eu-west-1 \
--target-group-arn "$TG_TIENDA" \
--attributes \
Key=stickiness.enabled,Value=true \
Key=stickiness.type,Value=lb_cookie \
Key=stickiness.lb_cookie.duration_seconds,Value=3600Serveix quan l'aplicació guarda l'estat de la sessió a la memòria del servidor: la cistella de la compra, per exemple. I porta quatre problemes seriosos:
| Problema | Conseqüència real a MercadoFresco |
|---|---|
| Repartiment desigual | El divendres, les instàncies noves arrenquen buides i les velles continuen amb tots els clients enganxats. Es paga capacitat que no descarrega ningú |
| Pèrdua de sessió | Si l'ASG acaba aquella instància en baixar el pic, el client perd la cistella |
| Desplegaments destructius | Cada actualització expulsa tots els usuaris de la instància substituïda |
| Escalat inútil | Afegir instàncies no ajuda els usuaris ja connectats |
Per això MercadoFresco té stickiness.enabled=false i l'aplicació és sense estat (stateless):
la sessió es guarda fora de la instància. Les opcions:
| On guardar la sessió | Avantatge | Inconvenient |
|---|---|---|
| ElastiCache (Redis) | Ràpid, mil·lisegons, l'estàndard de la indústria | Un servei més per operar — s'estudia a 06-05 |
| DynamoDB | Sense servidor, sense operació, TTL automàtic | Latència una mica més gran — s'estudia a 06-02 |
| Galeta signada al client | Zero infraestructura | Mida limitada, les dades viatgen a cada petició |
| Base de dades relacional | Ja existeix | Càrrega innecessària a RDS |
MercadoFresco acabarà fent servir ElastiCache. Mentrestant, les sessions enganxoses són un pedaç acceptable si es documenta com a deute tècnic; el que no és acceptable és activar-les i oblidar per què.
Registres d'accés i mètriques
Registres d'accés. L'ALB pot abocar a S3 una línia per petició, amb la IP del client, la ruta, el codi de resposta, els temps de processament i la destinació que la va atendre. Estan desactivats per defecte.
aws elbv2 modify-load-balancer-attributes --profile mercadofresco-dev --region eu-west-1 \
--load-balancer-arn "$ALB_ARN" \
--attributes \
Key=access_logs.s3.enabled,Value=true \
Key=access_logs.s3.bucket,Value=mercadofresco-registros-web \
Key=access_logs.s3.prefix,Value=alb \
Key=idle_timeout.timeout_seconds,Value=60 \
Key=routing.http.drop_invalid_header_fields.enabled,Value=trueEl bucket mercadofresco-registros-web necessita una política que autoritzi el servei a escriure-hi;
sense ella la comanda sembla funcionar però no apareix cap fitxer. Un avís de cost discret:
en una botiga amb trànsit, aquests registres creixen de pressa. Aplica la regla de cicle de vida que
vam veure a 02-03 per moure'ls a Glacier als 30 dies.
Mètriques clau de l'ALB a CloudWatch:
| Mètrica | Què mesura | Per què importa a MercadoFresco |
|---|---|---|
RequestCount |
Peticions ateses | Confirma amb dades el pic dels divendres de 17:00 a 21:00 |
TargetResponseTime |
Temps que triguen les instàncies | Si puja abans que la CPU, el coll d'ampolla és a RDS |
HTTPCode_Target_5XX_Count |
Errors generats per l'aplicació | L'aplicació falla |
HTTPCode_ELB_5XX_Count |
Errors generats pel balancejador | No hi ha destinacions sanes: el 503 clàssic |
HealthyHostCount |
Destinacions sanes per AZ | Si baixa de 2, s'ha perdut redundància |
UnHealthyHostCount |
Destinacions no sanes | Detecta instàncies trencades abans que ho facin els clients |
ActiveConnectionCount |
Connexions obertes | Dimensionar i detectar esgotament |
RejectedConnectionCount |
Connexions rebutjades per límit | L'ALB no ha escalat a temps davant d'un pic brusc |
La distinció entre HTTPCode_Target_5XX_Count i HTTPCode_ELB_5XX_Count és la més útil del quadre:
el primer significa «l'aplicació va retornar un error», el segon «no hi havia a qui preguntar». La
creació d'alarmes i taulers sobre aquestes mètriques s'estudia a 05-01; aquí n'hi ha prou de saber què
mirar.
Creació completa per CLI
Partim de les variables de 03-01 i 03-02 ($VPC_ID, $PUB_A, $PUB_B, $SG_ALB, $SG_TIENDA).
# 1. El balancejador, a les DUES subxarxes publiques
ALB_ARN=$(aws elbv2 create-load-balancer \
--profile mercadofresco-dev --region eu-west-1 \
--name alb-mercadofresco-tienda \
--type application \
--scheme internet-facing \
--ip-address-type ipv4 \
--subnets "$PUB_A" "$PUB_B" \
--security-groups "$SG_ALB" \
--tags Key=Name,Value=alb-mercadofresco-tienda \
Key=Proyecto,Value=mercadofresco Key=Entorno,Value=produccion \
Key=Componente,Value=tienda Key=Propietario,Value=marta \
Key=CentroCoste,Value=operaciones \
--query 'LoadBalancers[0].LoadBalancerArn' --output text)
# 2. El grup de destinacio, amb la comprovacio d'estat ben ajustada
TG_TIENDA=$(aws elbv2 create-target-group \
--profile mercadofresco-dev --region eu-west-1 \
--name tg-mercadofresco-tienda \
--protocol HTTPS --port 443 \
--vpc-id "$VPC_ID" \
--target-type instance \
--health-check-protocol HTTPS \
--health-check-path /salud \
--health-check-interval-seconds 15 \
--health-check-timeout-seconds 5 \
--healthy-threshold-count 2 \
--unhealthy-threshold-count 3 \
--matcher HttpCode=200 \
--tags Key=Proyecto,Value=mercadofresco Key=Entorno,Value=produccion \
Key=Componente,Value=tienda Key=Propietario,Value=marta \
Key=CentroCoste,Value=operaciones \
--query 'TargetGroups[0].TargetGroupArn' --output text)
# 3. Atributs del grup de destinacio
aws elbv2 modify-target-group-attributes --profile mercadofresco-dev --region eu-west-1 \
--target-group-arn "$TG_TIENDA" \
--attributes \
Key=deregistration_delay.timeout_seconds,Value=60 \
Key=load_balancing.algorithm.type,Value=least_outstanding_requests \
Key=stickiness.enabled,Value=false
# 4. Oient HTTPS (requereix el certificat; vegeu 03-05 per a la validacio)
LISTENER_443=$(aws elbv2 create-listener --profile mercadofresco-dev --region eu-west-1 \
--load-balancer-arn "$ALB_ARN" --protocol HTTPS --port 443 \
--certificates CertificateArn="$CERT_ARN" \
--ssl-policy ELBSecurityPolicy-TLS13-1-2-2021-06 \
--default-actions "Type=forward,TargetGroupArn=$TG_TIENDA" \
--query 'Listeners[0].ListenerArn' --output text)
# 5. Oient HTTP que nomes redirigeix
aws elbv2 create-listener --profile mercadofresco-dev --region eu-west-1 \
--load-balancer-arn "$ALB_ARN" --protocol HTTP --port 80 \
--default-actions '[{"Type":"redirect","RedirectConfig":{
"Protocol":"HTTPS","Port":"443","Host":"#{host}","Path":"/#{path}",
"Query":"#{query}","StatusCode":"HTTP_301"}}]'
# 6. Connectar l'ASG i fer que confii en el balancejador
aws autoscaling attach-load-balancer-target-groups \
--profile mercadofresco-dev --region eu-west-1 \
--auto-scaling-group-name asg-mercadofresco-tienda \
--target-group-arns "$TG_TIENDA"
aws autoscaling update-auto-scaling-group \
--profile mercadofresco-dev --region eu-west-1 \
--auto-scaling-group-name asg-mercadofresco-tienda \
--health-check-type ELB --health-check-grace-period 300
# 7. Esperar que l'ALB estigui actiu i obtenir-ne el nom DNS
aws elbv2 wait load-balancer-available --profile mercadofresco-dev --region eu-west-1 \
--load-balancer-arns "$ALB_ARN"
aws elbv2 describe-load-balancers --profile mercadofresco-dev --region eu-west-1 \
--load-balancer-arns "$ALB_ARN" \
--query 'LoadBalancers[0].DNSName' --output textL'última comanda retorna una cosa com
alb-mercadofresco-tienda-1234567890.eu-west-1.elb.amazonaws.com. Aquell nom és la nova porta d'
entrada de MercadoFresco. Que mercadofresco.example hi apunti és exactament la feina de la
lliçó 03-05.
Comprovació de l'estat de les destinacions, la comanda que més es fa servir cada dia:
aws elbv2 describe-target-health --profile mercadofresco-dev --region eu-west-1 \
--target-group-arn "$TG_TIENDA" \
--query 'TargetHealthDescriptions[].{
Instancia:Target.Id, Port:Target.Port,
Estat:TargetHealth.State, Motiu:TargetHealth.Reason,
Detall:TargetHealth.Description}' \
--output tableEls motius que més apareixen i què signifiquen de debò:
Reason |
Significat | On mirar |
|---|---|---|
Elb.RegistrationInProgress |
Acabada de registrar, encara sense comprovar | Esperar |
Elb.InitialHealthChecking |
Comprovant per primera vegada | Esperar |
Target.Timeout |
No respon a temps | Grup de seguretat (03-02) o aplicació caiguda |
Target.FailedHealthChecks |
Respon, però no com s'espera | Codi HTTP diferent del Matcher |
Target.ResponseCodeMismatch |
Retorna 302, 404, 500… | La ruta /salud no existeix o redirigeix |
Target.NotInUse |
El grup no està associat a cap oient | Falta el pas 4 |
Target.DeregistrationInProgress |
Drenant connexions | Normal en reduir capacitat |
Target.Timeout és gairebé sempre el mateix: el grup sg-mercadofresco-tienda no accepta el 443 des de
sg-mercadofresco-alb. Si vas seguir la lliçó 03-02, ja està resolt.
Cost de l'ALB i neteja
⚠️ Avís de cost: l'ALB cobra per hora encara que no rebi ni una petició
A
eu-west-1el preu té dos components:
- Hora de balancejador: ≈ 0,027 USD/h → ≈ 20 USD al mes només per existir.
- LCU (Load Balancer Capacity Unit): ≈ 0,008 USD/LCU-hora.
Una LCU és el màxim de quatre dimensions mesurades per hora: 25 connexions noves per segon, 3.000 connexions actives per segon, 1 GB/hora processat, o 1.000 avaluacions de regla per segon. Es factura només la dimensió més alta, no la suma.
Estimació per a MercadoFresco: unes 2 LCU de mitjana → 2 × 0,008 × 730 ≈ 12 USD/mes. Total, uns 32 USD al mes. Comparat amb els 70 USD dels dos NAT Gateway de 03-01, és barat per al que aporta, però no és a la capa gratuïta.
Per practicar: munta l'ALB, verifica que reparteix i esborra'l el mateix dia. Un ALB oblidat costa 20 USD al mes indefinidament i farà saltar el pressupost de 10 USD que vam configurar a 01-02 cap a
[email protected].
Neteja, en ordre:
# 1. Desconnectar l'ASG (si no, tornaria a registrar instancies)
aws autoscaling detach-load-balancer-target-groups \
--profile mercadofresco-dev --region eu-west-1 \
--auto-scaling-group-name asg-mercadofresco-tienda \
--target-group-arns "$TG_TIENDA"
# 2. Tornar l'ASG a la comprovacio basica
aws autoscaling update-auto-scaling-group --profile mercadofresco-dev --region eu-west-1 \
--auto-scaling-group-name asg-mercadofresco-tienda --health-check-type EC2
# 3. Esborrar el balancejador (aixo elimina tambe els seus oients)
aws elbv2 delete-load-balancer --profile mercadofresco-dev --region eu-west-1 \
--load-balancer-arn "$ALB_ARN"
aws elbv2 wait load-balancers-deleted --profile mercadofresco-dev --region eu-west-1 \
--load-balancer-arns "$ALB_ARN"
# 4. Esborrar el grup de destinacio (no es pot abans: depen de l'oient)
aws elbv2 delete-target-group --profile mercadofresco-dev --region eu-west-1 \
--target-group-arn "$TG_TIENDA"
# 5. Comprovar que no en queda cap de viu a la regio
aws elbv2 describe-load-balancers --profile mercadofresco-dev --region eu-west-1 \
--query 'LoadBalancers[].[LoadBalancerName,State.Code]' --output tableEl certificat d'ACM no costa res, així que es pot deixar.
El trànsit del divendres, d'extrem a extrem
flowchart TB
U["Clients<br/>900 comandes/hora (divendres 17-21 h)"]
DNS["mercadofresco.example<br/>(Route 53, llico 03-05)"]
subgraph VPC["vpc-mercadofresco"]
subgraph PUBS["Subxarxes publiques"]
NA["Node de l'ALB<br/>eu-west-1a"]
NB["Node de l'ALB<br/>eu-west-1b"]
end
TG["tg-mercadofresco-tienda<br/>comprovacio /salud cada 15 s<br/>least_outstanding_requests"]
subgraph APPS["Subxarxes d'aplicacio (sense IP publica)"]
I1["tienda-01 · 600 com/h"]
I2["tienda-02 · 600 com/h"]
I3["tienda-03 · pic"]
I4["tienda-04 · pic"]
end
RDS[("mercadofresco-pedidos<br/>subxarxes de dades")]
end
U --> DNS --> NA
DNS --> NB
NA --> TG
NB --> TG
TG --> I1
TG --> I2
TG -.->|"afegides per<br/>pico-viernes-tarde"| I3
TG -.-> I4
I1 --> RDS
I2 --> RDS
I els comptes del divendres, ara complets:
| Moment | Instàncies sanes | Capacitat | Demanda | Marge |
|---|---|---|---|---|
| Dimarts 11:00 | 2 | 1.200 com/h | ~100 com/h | 12× |
Divendres 16:45 (acció pico-viernes-tarde) |
4 | 2.400 com/h | ~200 com/h | Preparat |
| Divendres 19:00 (pic real) | 4 | 2.400 com/h | 900 com/h | 2,6× |
| Divendres 19:00 amb una instància caiguda | 3 | 1.800 com/h | 900 com/h | 2× |
Divendres 19:00 amb l'AZ 1a caiguda sencera |
2 | 1.200 com/h | 900 com/h | 1,3× — s'aguanta |
Divendres 22:00 (cpu-objetivo-60 redueix) |
2 | 1.200 com/h | ~150 com/h | 8× |
La penúltima fila és la que justifica tota la feina de les tres lliçons: perdre una zona de disponibilitat completa en ple pic del divendres ja no tomba MercadoFresco. El problema 1 queda resolt.
Errors Habituals i Consells
Posar el balancejador en una sola subxarxa. AWS l'exigeix en dues AZ com a mínim, però si registres instàncies només en una, perds tota la redundància sense cap avís.
Fer servir / com a ruta de comprovació d'estat. La portada consulta la base de dades, carrega el
catàleg i triga centenars de mil·lisegons. Si la base de dades s'alenteix, totes les instàncies
fallen alhora i l'ALB retorna 503 amb l'aplicació sana. Fes servir un /salud local i trivial.
Posar un marge de gràcia massa curt a l'ASG. Amb --health-check-grace-period 60 i un
arrencada de dos minuts, l'ASG mata cada instància just abans que acabi d'arrencar, en
bucle, gastant diners sense servir res.
Deixar el retard de baixa de registre en 300 segons. Reduir capacitat després del pic triga cinc minuts de més. Ajusta'l a la durada de la teva petició més llarga.
Activar sessions enganxoses per «arreglar» un problema de sessió. Funciona avui i trenca l' escalat demà. És deute tècnic: documenta'l i planifica treure la sessió de la instància.
Oblidar la política del bucket de registres. La comanda d'activació no dona error, però no
apareix cap fitxer a mercadofresco-registros-web.
Confondre HTTPCode_ELB_5XX_Count amb HTTPCode_Target_5XX_Count. El primer significa que no
hi ha destinacions sanes; el segon, que l'aplicació retorna errors. Són incidències diferents i s'
arreglen en llocs diferents.
Demanar el certificat d'ACM a la regió equivocada. Per a un ALB, a la regió de l'ALB. Per a
CloudFront, sempre a us-east-1. Ho veurem a 03-04.
Deixar un ALB de proves encès. 20 USD al mes per un recurs que no fa servir ningú. Revisa
describe-load-balancers a totes les regions on hagis practicat.
Consell d'or: abans de connectar l'ASG, registra una instància a mà al grup de destinació i
comprova que passa a healthy. Si no ho fa, el problema és el grup de seguretat o el health
check, i és molt més fàcil de diagnosticar amb una sola instància que amb quatre.
Exercicis
Exercici 1: diagnosticar un ALB que retorna 503
La Marta desplega l'ALB i en obrir el seu nom DNS rep 503 Service Unavailable. A
describe-target-health les dues instàncies apareixen com a unhealthy amb motiu Target.Timeout.
Enumera almenys cinc causes possibles, ordenades de més a menys probable, i la comanda concreta
que confirma o descarta cadascuna.
Exercici 2: dissenyar l'encaminament complet
MercadoFresco necessita, sota un únic ALB: la botiga a l'arrel; l'API a /api/* amb un grup de
destinació propi; el tauler a admin.mercadofresco.example accessible només des de la IP de l'oficina
81.45.20.7; un 410 Gone per a la ruta antiga /tienda-antigua/*; i redirecció de tot el
trànsit HTTP a HTTPS. Escriu les regles amb les seves prioritats i justifica'n l'ordre.
Exercici 3: calcular el cost i contrastar la capacitat
Amb les dades de MercadoFresco (2 instàncies en horari normal, 4 els divendres de 17:00 a 21:00, 900 comandes/hora al pic, 600 comandes/hora per instància), calcula: el cost mensual de l'ALB suposant 3 LCU de mitjana, quantes instàncies caldrien si el negoci creixés fins a 3.000 comandes/hora, i si l'ASG actual ho suportaria.
Solucions
Solució 1
Causes, de més a menys probable:
1. El grup de seguretat de les instàncies no accepta trànsit del balancejador. És la causa número
u de Target.Timeout.
aws ec2 describe-security-groups --profile mercadofresco-dev --region eu-west-1 \
--group-ids "$SG_TIENDA" \
--query 'SecurityGroups[0].IpPermissions[].{P:FromPort,Grups:UserIdGroupPairs[].GroupId}'Hi ha d'aparèixer el port 443 amb $SG_ALB a UserIdGroupPairs.
2. L'aplicació no escolta al port del grup de destinació. El grup apunta al 443 però l' aplicació escolta al 8080.
aws ssm start-session --profile mercadofresco-dev --region eu-west-1 --target "$ID_INSTANCIA"
# ja a dins: ss -lntp | grep -E ':(443|8080)'3. La ruta /salud no existeix. Donaria Target.ResponseCodeMismatch amb un 404, però si el
servidor no respon en absolut a aquella ruta, es manifesta com a Target.Timeout.
4. Les instàncies són en subxarxes sense ruta i l'ALB no hi arriba. Comprovar que les subxarxes de l'ASG són a la mateixa VPC que el balancejador i que les AZ de l'ALB inclouen les de les instàncies.
aws elbv2 describe-load-balancers --profile mercadofresco-dev --region eu-west-1 \
--load-balancer-arns "$ALB_ARN" --query 'LoadBalancers[0].AvailabilityZones[].[ZoneName,SubnetId]'5. Una NACL bloqueja el trànsit de tornada. Falta el rang de ports efímers a la sortida de la
subxarxa d'aplicació (lliçó 03-02). Es confirma als Flow Logs amb ACCEPT d'entrada i
REJECT de sortida.
6. Menys probable però real: el marge de gràcia de l'ASG és curt i les instàncies s'estan
reemplaçant abans d'arrencar; es veu a describe-scaling-activities amb reemplaçaments continus.
Solució 2
| Prioritat | Condició | Acció | Per què en aquest ordre |
|---|---|---|---|
| 10 | host-header = admin.mercadofresco.example AND source-ip = 81.45.20.7/32 |
forward → tg-mercadofresco-admin |
S'ha d'avaluar abans que la regla 20, que nega la resta |
| 20 | host-header = admin.mercadofresco.example |
fixed-response 403 |
Captura els accessos al tauler des de qualsevol altra IP |
| 30 | path-pattern = /tienda-antigua/* |
fixed-response 410 |
Abans que /api/* i que l'acció per defecte |
| 40 | path-pattern = /api/* |
forward → tg-mercadofresco-api |
Després de les regles específiques |
| (defecte) | — | forward → tg-mercadofresco-tienda |
Tota la resta |
Justificació de l'ordre: la clau és al parell 10/20. Les regles s'avaluen per prioritat
ascendent i guanya la primera que coincideix; si la 20 tingués prioritat menor, capturaria també
el trànsit legítim de l'oficina i el tauler seria inaccessible per a tothom. La condició de la regla
10 combina dos camps amb AND, que és com funcionen les condicions múltiples d'un ALB.
aws elbv2 create-rule --profile mercadofresco-dev --region eu-west-1 \
--listener-arn "$LISTENER_443" --priority 10 \
--conditions '[
{"Field":"host-header","HostHeaderConfig":{"Values":["admin.mercadofresco.example"]}},
{"Field":"source-ip","SourceIpConfig":{"Values":["81.45.20.7/32"]}}]' \
--actions "[{\"Type\":\"forward\",\"TargetGroupArn\":\"$TG_ADMIN\"}]"
aws elbv2 create-rule --profile mercadofresco-dev --region eu-west-1 \
--listener-arn "$LISTENER_443" --priority 20 \
--conditions '[{"Field":"host-header","HostHeaderConfig":{"Values":["admin.mercadofresco.example"]}}]' \
--actions '[{"Type":"fixed-response","FixedResponseConfig":{
"StatusCode":"403","ContentType":"text/plain","MessageBody":"Acces restringit"}}]'L'oient del 80 es queda amb la redirecció 301 com a acció per defecte, sense regles: així tot el trànsit HTTP, inclòs el del tauler, acaba en HTTPS.
Matís honest: filtrar per source-ip a l'ALB funciona, però si demà es posa CloudFront al davant
(lliçó 03-04), l'ALB veurà la IP de CloudFront i no la del client. Llavors caldria filtrar a
WAF (04-05) o per la capçalera X-Forwarded-For.
Solució 3
Cost mensual de l'ALB:
- Hores: 0,027 USD/h × 730 h = 19,71 USD
- LCU: 3 LCU × 0,008 USD × 730 h = 17,52 USD
- Total ≈ 37,23 USD/mes
Comparat amb la infraestructura de xarxa completa: ALB ≈ 37 USD + 2 NAT Gateway ≈ 70 USD = 107 USD al mes només en xarxa, sense comptar instàncies ni base de dades. És l'argument per revisar a 11-03 si els dos NAT compensen.
Instàncies necessàries per a 3.000 comandes/hora:
- Capacitat estricta: 3.000 ÷ 600 = 5 instàncies.
- Però cal sobreviure a la caiguda d'una zona de disponibilitat completa. Amb instàncies repartides en 2 AZ, perdre'n una deixa la meitat. Perquè la meitat supervivent aguanti 3.000 com/h calen 10 instàncies, 5 per AZ.
- Un compromís raonable, acceptant degradació en el pitjor cas: 8 instàncies (4 per AZ). Amb una AZ caiguda queden 4 × 600 = 2.400 com/h, un 80 % de la demanda: la botiga va lenta però no cau.
Ho suportaria l'ASG actual? No. asg-mercadofresco-tienda té màxim 4, és a dir, 2.400
comandes/hora. Amb 3.000 de demanda es quedaria curt en un 20 % fins i tot sense fallades. Els canvis
necessaris:
aws autoscaling update-auto-scaling-group --profile mercadofresco-dev --region eu-west-1 \
--auto-scaling-group-name asg-mercadofresco-tienda \
--min-size 4 --desired-capacity 4 --max-size 10I abans de donar el canvi per bo, cal comprovar tres coses més: que RDS aguanta 10 instàncies
obrint connexions (o cal un pool, o Aurora, que es veu a 06-03), que les subxarxes tenen
IP lliures (amb /20 en sobren) i que la quota d'instàncies del compte ho permet. Escalar la capa
web és la part fàcil; el coll d'ampolla es trasllada a la base de dades.
Conclusió
MercadoFresco té per fi una porta d'entrada única. Saps per què cal un balancejador més enllà del repartiment: comprovacions d'estat, alta disponibilitat entre zones, terminació TLS en un sol lloc i la possibilitat que les instàncies visquin en subxarxes privades sense IP pública. Distingeixes els quatre tipus —ALB per a HTTP i HTTPS amb encaminament per contingut, NLB per a capa 4, latència de microsegons i IP fixa, GWLB per a aplicacions virtuals de seguretat, i el CLB que només s'hereta— i saps justificar per què MercadoFresco necessita un ALB.
Coneixes la seva anatomia —balancejador, oients, regles i grups de destinació— i el detall que la
comprovació d'estat viu al grup de destinació, no al balancejador. I sobretot has
entès la part perillosa: un health check que consulta la base de dades pot marcar totes
les instàncies com a no sanes alhora i retornar 503 amb l'aplicació perfectament sana, o ficar
l'ASG en un bucle de reemplaçament. Per això /salud és local i trivial, /salud/profunda és per a la
monitorització, i el marge de gràcia de l'ASG és de 300 segons.
Has connectat asg-mercadofresco-tienda al grup tg-mercadofresco-tienda perquè el registre i la
baixa siguin automàtics, has canviat la comprovació de l'ASG a ELB perquè detecti aplicacions
mortes i no només màquines mortes, i has ajustat el drenatge de connexions a 60 segons, el
temps de la comanda més llarga. Saps encaminar per ruta i per host, combinar condicions, fer servir
respostes fixes per tallar peticions malicioses al balancejador i redirigir HTTP a HTTPS amb un
301 que conserva la ruta. Has demanat un certificat gratuït a ACM amb comodí, has triat la
política TLS 1.2/1.3 i entens què és la terminació TLS i per a què serveix SNI —sabent que la
validació per DNS queda pendent de la propera lliçó. Saps per què les sessions enganxoses
són un pedaç que trenca l'escalat i on ha de viure la sessió de debò. Has activat els
registres d'accés cap a mercadofresco-registros-web i saps què signifiquen RequestCount,
TargetResponseTime, HealthyHostCount i la diferència entre els 5XX de la destinació i els del
balancejador.
I els comptes tanquen: amb quatre instàncies sanes repartides en dues zones, MercadoFresco aguanta les 900 comandes per hora del divendres fins i tot perdent una zona de disponibilitat sencera. El problema 1, les caigudes dels divendres, queda resolt.
Queden els diners. A la lliçó 02-03 vam fer un càlcul que va doldre: el 97 % del cost d'S3 és
transferència de sortida, perquè cada foto del catàleg es descarrega íntegra des d'Irlanda cada vegada
que algú la mira, i ara a més tot el trànsit dinàmic passa per un ALB que cobra per GB
processat. A la lliçó 03-04, «Amazon CloudFront», posarem una xarxa de distribució de
contingut davant de tot: les fotos se serviran des de l'edge location més propera al client, el
bucket mercadofresco-catalogo-fotos deixarà de ser accessible directament gràcies a l'Origin Access
Control, i veurem amb números quant baixa la factura. L'ALB que acabes de muntar continuarà allà
darrere, però rebent només allò que de debò no es pot desar a la memòria cau.
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
