Vam tancar el mòdul anterior amb MercadoFresco a punt: compte segur, regió triada, consola
dominada i CLI configurada amb el perfil mercadofresco-dev. Tot allò era la bastida. Ara
comença l'obra. En aquesta lliçó aixequem el primer servidor real de MercadoFresco al núvol
amb Amazon EC2 (Elastic Compute Cloud), el servei que proporciona màquines virtuals sota
demanda i la peça sobre la qual s'aguanta bona part del que ve després.
EC2 és el servei amb què gairebé tothom entra a AWS, i també on més diners es llencen per
descuit. Per això no farem un passeig per la pantalla de creació: entendrem què és realment una
instància, com se'n tria la mida sense endevinar, què són els crèdits de CPU (que seran decisius
per al pic dels divendres), com s'automatitza l'arrencada del servidor amb user data, i com un
grup d'Auto Scaling converteix el problema 1 de MercadoFresco —les caigudes dels divendres—
en un problema resolt per configuració.
Contingut
- Què és una instància EC2 i quin problema resol
- AMI: la plantilla de la qual neix la instància
- Famílies i tipus d'instància: com llegir
t3.micro - Com triar la mida sense endevinar
- Instàncies burstable i crèdits de CPU
- Models de compra: sota demanda, spot, reservades i Savings Plans
- Cicle de vida d'una instància: aturar no és terminar
- Accés a la instància: parells de claus, SSH, Instance Connect i Session Manager
user data: que la instància s'instal·li sola- Metadades d'instància i IMDSv2
- Crear la instància per consola, pas a pas
- Crear la instància per CLI amb l'esquema d'etiquetatge
- Plantilles de llançament i Auto Scaling: la solució al pic dels divendres
- Apagar i esborrar-ho tot per no gastar
Què és una instància EC2 i quin problema resol
Una instància EC2 és una màquina virtual que s'executa sobre la infraestructura física d'AWS. Té CPU, memòria, xarxa, un disc d'arrencada i un sistema operatiu complet: per al teu programari és indistingible d'un servidor de veritat. Hi pots instal·lar el que vulguis, obrir una sessió SSH, mirar els registres i reiniciar-la.
La diferència amb el servidor de l'oficina de MercadoFresco no és en allò que la màquina és, sinó en com s'obté i es retorna:
| Servidor físic de l'oficina | Instància EC2 | |
|---|---|---|
| Temps d'aprovisionament | Setmanes (compra, enviament, instal·lació) | Menys d'un minut |
| Cost inicial | 6.000 € pagats de cop | 0 € |
| Cost continu | Llum, manteniment, recanvis | Per segon d'ús |
| Canviar de mida | Comprar RAM i obrir la caixa | Aturar, canviar el tipus, arrencar |
| Tenir-ne 10 d'iguals | Comprar 10 servidors | Una crida a l'API |
| Retornar-lo | Vendre'l de segona mà | terminate-instances |
Aquesta darrera fila és la clau conceptual de tot el mòdul: a AWS, crear i destruir són operacions simètriques i barates. Quan la Marta necessiti quatre servidors de botiga el divendres a les 17:00 i només un el dissabte al matí, això deixa de ser una fantasia per convertir-se en una línia de configuració.
Nota sobre allò que EC2 no cobreix en aquesta lliçó. Tota instància viu dins d'una xarxa virtual (VPC) i està protegida per un grup de seguretat, que és el seu tallafocs. Aquí farem servir la VPC per defecte i crearem un grup de seguretat mínim, sense entrar en detall: les xarxes són el mòdul 3 sencer (03-01 VPC, 03-02 grups de seguretat i NACL). El disc de la instància es gestiona amb EBS, que és la lliçó 02-02.
AMI: la plantilla de la qual neix la instància
Una AMI (Amazon Machine Image) és una imatge de disc congelada: sistema operatiu, paquets instal·lats, configuració i fitxers. Quan llances una instància, AWS copia l'AMI a un volum nou i arrenca la màquina des d'allà. L'AMI és la plantilla; la instància és la còpia viva.
Hi ha quatre orígens possibles:
| Origen | Què és | Quan fer-lo servir |
|---|---|---|
| AMI d'AWS | Amazon Linux 2023, Ubuntu, Windows Server, Debian… mantingudes i amb els pedaços al dia | Punt de partida habitual |
| AWS Marketplace | Imatges de tercers (de vegades amb cost per hora afegit) | Programari comercial preinstal·lat |
| AMI de la comunitat | Publicades per qualsevol usuari | Amb precaució: no auditades |
| AMI pròpia | Creada per tu a partir d'una instància configurada | Arrencades ràpides i reproduïbles |
Per a MercadoFresco farem servir Amazon Linux 2023: és gratuïta, està optimitzada per a EC2, inclou l'AWS CLI v2 preinstal·lada i l'agent de Systems Manager ja actiu (important per a Session Manager, més avall).
Un detall que confon al principi: l'identificador d'una AMI és diferent a cada regió.
La mateixa Amazon Linux 2023 té un ami-0abc… a eu-west-1 i un altre de diferent a eu-central-1.
Per això no s'escriu mai a mà en un script; es consulta. La manera robusta és preguntar-ho al
magatzem de paràmetres públic d'AWS:
# Obté l'ID de l'AMI més recent d'Amazon Linux 2023 (x86_64) a eu-west-1.
# El paràmetre és públic: AWS l'actualitza cada vegada que publica una imatge nova.
aws ssm get-parameter \
--name /aws/service/ami-amazon-linux-latest/al2023-ami-kernel-default-x86_64 \
--query 'Parameter.Value' \
--output text \
--profile mercadofresco-dev \
--region eu-west-1Sortida (exemple; el teu serà diferent):
Desglossament de la comanda:
aws ssm get-parameter: Systems Manager Parameter Store desa parells clau/valor. AWS hi publica els ID de les seves AMI perquè no els hagis de buscar.--query 'Parameter.Value': JMESPath, tal com vam veure a 01-05, per quedar-nos només amb el valor.--output text: sense cometes, a punt per posar-lo en una variable de shell.
Desa'l en una variable, perquè el farem servir diverses vegades:
AMI_ID=$(aws ssm get-parameter \
--name /aws/service/ami-amazon-linux-latest/al2023-ami-kernel-default-x86_64 \
--query 'Parameter.Value' --output text \
--profile mercadofresco-dev --region eu-west-1)
echo "AMI seleccionada: $AMI_ID"Famílies i tipus d'instància: com llegir t3.micro
El tipus d'instància defineix quanta CPU, memòria, xarxa i disc té la màquina. AWS n'ofereix centenars, però el nom és un codi llegible que es desxifra per parts:
t3.micro │││ └──── mida dins de la família ││└─────── (opcional) atributs extra: a = AMD, g = Graviton/ARM, d = disc local, n = xarxa millorada │└──────── generació (3 = tercera; com més alta, més moderna i normalment millor preu/rendiment) └───────── família: per a què està optimitzada
Un altre exemple: m6g.large = família m (equilibrada), generació 6, g de Graviton
(processador ARM d'AWS), mida large.
Les famílies que necessites conèixer:
| Família | Optimitzada per a | Relació vCPU:RAM aprox. | Exemple d'ús a MercadoFresco |
|---|---|---|---|
| T (t3, t4g) | Ús general burstable, barata | 1:2 / 1:4 | Entorn de desenvolupament del Luis, servidor de la botiga amb trànsit irregular |
| M (m6i, m7g) | Ús general equilibrat, rendiment sostingut | 1:4 | Servidor de la botiga en producció |
| C (c6i, c7g) | Còmput intensiu (molta CPU) | 1:2 | Processament d'imatges del catàleg, càlcul de rutes de repartiment |
| R (r6i, r7g) | Memòria intensiva | 1:8 | Memòries cau grans, informes analítics de la Sara en memòria |
| G / P | GPU (gràfics, aprenentatge automàtic) | Variable | Avui no aplica a MercadoFresco |
| I / D | Emmagatzematge local ràpid | Variable | Bases de dades amb NVMe local |
I les mides, que en general dupliquen recursos i preu a cada esglaó:
| Mida | vCPU | RAM (família t3) | Preu relatiu |
|---|---|---|---|
nano |
2 (burst) | 0,5 GiB | 1× |
micro |
2 (burst) | 1 GiB | 2× |
small |
2 (burst) | 2 GiB | 4× |
medium |
2 (burst) | 4 GiB | 8× |
large |
2 | 8 GiB | 16× |
xlarge |
4 | 16 GiB | 32× |
2xlarge |
8 | 32 GiB | 64× |
Aquesta linealitat té una conseqüència important i contraintuïtiva: dues instàncies large
costen el mateix que una xlarge, però dues instàncies sobreviuen a la caiguda d'una zona de
disponibilitat i una xlarge no. És el primer argument del disseny multi-AZ que vam veure a 01-03, i
una de les raons per les quals preferirem escalar horitzontalment (més màquines) abans que
verticalment (màquines més grans).
Com triar la mida sense endevinar
El mètode professional no és intuir, és mesurar. Per a MercadoFresco:
- Parteix de la dada coneguda. Una instància de la botiga suporta 600 comandes/hora. El pic dels divendres és de 900 comandes/hora. Amb una sola màquina, el 33 % de les comandes del pic es perd: això són les caigudes del problema 1.
- Comença petit. Al núvol, canviar de mida costa un reinici. Començar gros "per si de cas" costa diners cada hora, per sempre.
- Mesura amb CloudWatch (lliçó 05-01): CPU, memòria (requereix l'agent), xarxa i latència durant almenys una setmana sencera, incloent-hi un divendres.
- Aplica la regla del 40-60 %. Si la CPU mitjana està per sota del 40 %, sobra màquina. Si supera el 70 % de manera sostinguda, en falta.
- Consulta Compute Optimizer, el servei gratuït d'AWS que analitza les teves mètriques i recomana tipus i mida.
Per al nostre punt de partida triem t3.micro per dues raons: entra a la capa gratuïta
(750 hores al mes durant 12 mesos) i el seu comportament burstable ens permet explicar els crèdits
de CPU, que són justament allò que fa fracassar molta gent en el seu primer pic de trànsit.
Instàncies burstable i crèdits de CPU
Aquí hi ha el concepte que més disgustos dona a qui comença, i el que més importa per al divendres de MercadoFresco.
Les instàncies de la família T no et donen la CPU sencera tota l'estona. Et donen una línia base —un percentatge del nucli— i acumulen crèdits de CPU quan consumeixes menys d'aquesta línia. Quan en necessites més, gastes crèdits per arribar al 100 %. Si se t'acaben, la instància s'estrangula (throttling) i baixa bruscament a la línia base, encara que la CPU física estigui lliure.
| Tipus | vCPU | Línia base per vCPU | Crèdits guanyats/hora | Crèdits màx. acumulables |
|---|---|---|---|---|
t3.nano |
2 | 5 % | 6 | 144 |
t3.micro |
2 | 10 % | 12 | 288 |
t3.small |
2 | 20 % | 24 | 576 |
t3.medium |
2 | 20 % | 24 | 576 |
t3.large |
2 | 30 % | 36 | 864 |
Un crèdit = un minut d'una vCPU al 100 %.
Fem el càlcul real de MercadoFresco. Un t3.micro acumula 12 crèdits/hora, amb un màxim de
288 (equivalent a 24 hores d'acumulació). El pic dels divendres dura de 17:00 a 21:00, quatre
hores, i en aquesta estona la botiga estaria al 100 % de CPU amb les seves 2 vCPU:
Consum durant el pic = 2 vCPU × 100 % × 60 min × 4 h = 480 crèdits Crèdits disponibles = 288 acumulats + (12/h × 4 h) = 336 crèdits Dèficit = 480 − 336 = 144 crèdits
És a dir: el t3.micro aguanta menys de tres hores del pic i després s'estrangula al 10 % de
CPU. La botiga no cau per falta de servidor, cau per falta de crèdits, i al tauler de
CloudWatch la CPU apareix plana i baixa, cosa que despista moltíssim si no coneixes el mecanisme.
Hi ha dues sortides, i convé entendre que només una és bona:
- Mode
unlimited(activat per defecte a T3): quan s'acaben els crèdits, AWS deixa que continuïs al 100 % i et cobra un extra per cada vCPU-hora sobrera. Evita la caiguda, però la factura es dispara si el pic és habitual. Es pot forçar el modestandardperquè mai no cobri de més, a canvi d'acceptar l'estrangulament. - Escalar horitzontalment: afegir instàncies durant el pic. És la solució correcta, i la veurem al final d'aquesta lliçó amb Auto Scaling.
Consultar el saldo de crèdits (mètrica CPUCreditBalance, a CloudWatch):
aws cloudwatch get-metric-statistics \
--namespace AWS/EC2 \
--metric-name CPUCreditBalance \
--dimensions Name=InstanceId,Value=i-0123456789abcdef0 \
--start-time 2026-08-01T00:00:00Z \
--end-time 2026-08-02T00:00:00Z \
--period 3600 \
--statistics Average \
--profile mercadofresco-dev --region eu-west-1Regla pràctica. Les instàncies T són excel·lents per a càrregues irregulars amb valls llargues (desenvolupament, entorns de proves, serveis interns). Per a una càrrega sostinguda i previsible, una M surt més barata i més previsible que una T en mode
unlimited.
Models de compra: sota demanda, spot, reservades i Savings Plans
La mateixa instància pot costar quatre preus diferents segons el compromís que adquireixis. Aquí només els comparem perquè sàpigues que existeixen i quan es fa servir cadascun; l'anàlisi econòmica completa, amb càlculs d'amortització, és la lliçó 11-05.
| Model | Descompte típic | Compromís | Es pot interrompre | Ús a MercadoFresco |
|---|---|---|---|---|
| Sota demanda | 0 % (preu base) | Cap | No | Tot el que farem al curs; pics imprevisibles |
| Spot | Fins al 90 % | Cap | Sí, amb 2 min d'avís | Processament nocturn d'imatges del catàleg |
| Reservades (RI) | Fins al 72 % | 1 o 3 anys, tipus concret | No | Base fixa de la botiga un cop estabilitzada |
| Savings Plans | Fins al 72 % | 1 o 3 anys, despesa/hora, no tipus | No | Igual que RI però amb flexibilitat de família |
| Host dedicat | — (més car) | Variable | No | Llicències que exigeixen maquinari físic propi |
Tres idees per quedar-te:
- Spot no vol dir "barat i pitjor": és exactament la mateixa màquina, amb la condició que AWS pot recuperar-la. Només serveix per a càrregues que toleren ser interrompudes i reintentades.
- Reservades i Savings Plans no són màquines, són descomptes de facturació que s'apliquen automàticament al consum que ja tens.
- No compris compromisos fins a tenir tres mesos de dades reals. La Marta no reservarà res fins al mòdul 11.
Cicle de vida d'una instància: aturar no és terminar
Una instància passa per estats ben definits, i confondre'n dos —stopped i terminated—
és l'error més car i més irreversible d'EC2.
stateDiagram-v2
[*] --> pending: run-instances
pending --> running: arrencada completada
running --> stopping: stop-instances
stopping --> stopped: apagat
stopped --> pending: start-instances
running --> shutting_down: terminate-instances
stopped --> shutting_down: terminate-instances
shutting_down --> terminated: recursos alliberats
terminated --> [*]
running --> rebooting: reboot-instances
rebooting --> running: mateix host, mateix disc
Què passa exactament a cada transició:
| Acció | Es cobra la instància? | Es conserva el disc arrel? | Canvia la IP pública? | Reversible? |
|---|---|---|---|---|
Reiniciar (reboot) |
Sí (mai no s'ha aturat) | Sí | No | — |
Aturar (stop) |
No (sí el disc EBS) | Sí | Sí, es perd la IP pública automàtica | Sí |
| Hibernar | No | Sí, inclosa la RAM abocada a disc | Sí | Sí |
Terminar (terminate) |
No | No, s'esborra per defecte | — | No, mai |
Els quatre matisos que cal memoritzar:
- Aturar no esborra res. El volum EBS arrel continua existint i continua costant diners (uns 0,08 USD per GB i mes amb gp3). Una instància aturada és gairebé gratis, però no del tot.
- Terminar és definitiu. No hi ha paperera. El volum arrel s'elimina llevat que hagis
desactivat
DeleteOnTermination. Si hi desaves dades, han desaparegut. - La IP pública automàtica es perd en aturar. En arrencar de nou en reps una altra de diferent. Si necessites una IP estable, es fa servir una Elastic IP (mòdul 3) o, millor, un nom DNS (03-05).
- La IP privada sí que es conserva mentre la instància existeixi.
Per a producció, la Marta activarà sempre la protecció contra la terminació:
# Impedeix que un terminate-instances accidental destrueixi la instància.
aws ec2 modify-instance-attribute \
--instance-id i-0123456789abcdef0 \
--disable-api-termination \
--profile mercadofresco-dev --region eu-west-1Per tornar a permetre l'esborrat cal executar la comanda amb --no-disable-api-termination.
És una fricció deliberada: dos passos conscients en comptes d'un clic irreversible.
Accés a la instància: parells de claus, SSH, Instance Connect i Session Manager
Un parell de claus és una parella de claus criptogràfiques. AWS desa la pública i la col·loca
dins de la instància en arrencar (a ~/.ssh/authorized_keys); tu et quedes la privada en un
fitxer .pem. AWS no guarda còpia de la clau privada: si la perds, no hi ha recuperació
possible per part del suport.
# Crea el parell de claus i desa la privada amb permisos correctes.
aws ec2 create-key-pair \
--key-name mercadofresco-tienda \
--key-type ed25519 \
--query 'KeyMaterial' --output text \
--profile mercadofresco-dev --region eu-west-1 \
> ~/.ssh/mercadofresco-tienda.pem
# Sense aquest chmod, el client SSH es nega a fer servir la clau perquè és llegible per altres usuaris.
chmod 400 ~/.ssh/mercadofresco-tienda.pemNotes de la comanda:
--key-type ed25519és més modern i curt que RSA; tots dos serveixen, però ed25519 és l'elecció per defecte avui (Windows amb instàncies antigues pot requerirrsa).- La sortida de
KeyMaterialnomés es mostra una vegada. Si no la rediriges a un fitxer, l'has perduda.
Connexió, un cop la instància estigui en running:
L'usuari per defecte depèn de l'AMI: ec2-user a Amazon Linux, ubuntu a Ubuntu, admin a
Debian. Connectar-se com a root està deshabilitat expressament.
Existeixen dues alternatives que eviten gestionar fitxers .pem, i convé conèixer-les:
| Mètode | Requereix clau .pem |
Requereix el port 22 obert | Registre d'auditoria | Comentari |
|---|---|---|---|---|
| SSH clàssic | Sí | Sí, des de la teva IP | No, llevat que te'l muntis | Universal, funciona sempre |
| EC2 Instance Connect | No | Sí (des de rangs d'AWS) | Sí, a CloudTrail | Botó "Connectar" de la consola; injecta una clau temporal de 60 s |
| Session Manager | No | No, cap port obert | Sí, complet, amb gravació de sessió | Requereix l'agent SSM i un rol IAM a la instància |
Session Manager (part d'AWS Systems Manager) és l'opció que farà servir MercadoFresco en producció: la instància no necessita IP pública ni port SSH obert, perquè és ella qui inicia la connexió sortint cap a AWS. Menys superfície d'atac i auditoria completa de qui va entrar i què va teclejar.
# Amb el connector de Session Manager instal·lat al teu equip:
aws ssm start-session \
--target i-0123456789abcdef0 \
--profile mercadofresco-dev --region eu-west-1Els permisos IAM que això requereix es detallen a la lliçó 04-01; els grups de seguretat que controlen el port 22, a la 03-02.
user data: que la instància s'instal·li sola
El camp user data és un script que la instància executa com a root, una sola vegada, a la
seva primera arrencada. És la diferència entre "he creat un servidor" i "he creat un servidor que ja
està servint la botiga".
Aquest és l'script de MercadoFresco. Desa'l com a user-data-tienda.sh:
#!/bin/bash
set -euxo pipefail
# set -e : avorta a la primera ordre que falli
# set -u : error si es fa servir una variable no definida
# set -x : traça cada ordre al registre (imprescindible per depurar després)
# pipefail: una fallada al mig d'una canonada no queda emmascarada
# 1. Actualitzar el sistema i registrar la marca temporal d'arrencada
dnf update -y
echo "Arrencada d'instancia MercadoFresco: $(date -Is)" >> /var/log/mercadofresco-arranque.log
# 2. Instal·lar el servidor web i PHP (el monòlit de MercadoFresco és PHP)
dnf install -y nginx php-fpm php-pgsql
# 3. Recuperar metadades de la mateixa instància fent servir IMDSv2 (vegeu l'apartat següent)
TOKEN=$(curl -sX PUT "http://169.254.169.254/latest/api/token" \
-H "X-aws-ec2-metadata-token-ttl-seconds: 300")
INSTANCE_ID=$(curl -s -H "X-aws-ec2-metadata-token: $TOKEN" \
http://169.254.169.254/latest/meta-data/instance-id)
AZ=$(curl -s -H "X-aws-ec2-metadata-token: $TOKEN" \
http://169.254.169.254/latest/meta-data/placement/availability-zone)
# 4. Pàgina d'inici provisional que identifica quina instància respon.
# Això és fonamental quan en tinguem diverses darrere d'un balancejador (lliçó 03-03):
# recarregant la pàgina es veu quina t'ha tocat.
cat > /usr/share/nginx/html/index.html <<HTML
<!doctype html>
<html lang="ca">
<head><meta charset="utf-8"><title>MercadoFresco</title></head>
<body style="font-family:system-ui;max-width:40rem;margin:4rem auto">
<h1>MercadoFresco</h1>
<p>Producte fresc en 24 hores.</p>
<hr>
<p><strong>Instancia:</strong> ${INSTANCE_ID}</p>
<p><strong>Zona de disponibilitat:</strong> ${AZ}</p>
</body>
</html>
HTML
# 5. Punt de comprovació de salut per al balancejador i per a Auto Scaling.
# Ha de respondre 200 i ser barat: res de consultar la base de dades aquí.
echo "OK" > /usr/share/nginx/html/salud
# 6. Arrencar els serveis i deixar-los habilitats per a futurs reinicis
systemctl enable --now nginx php-fpmCom es comporta i com es depura:
- S'executa només a la primera arrencada. Si atures i arrenques la instància, no es repeteix.
- La sortida completa queda a
/var/log/cloud-init-output.logdins de la instància. Quan alguna cosa "no funciona i no sé per què", aquest fitxer és la primera parada. - Ha de ser idempotent i sense interacció: res d'
apt installsense-y, res d'esperar una pulsació de tecla. - No posis mai credencials al
user data: qualsevol que tingui accés a la instància pot llegir-lo ambcurla les metadades. Per als secrets es fa servir Secrets Manager (lliçó 04-03).
Metadades d'instància i IMDSv2
Cada instància es pot preguntar a si mateixa qui és, consultant una adreça especial que només
respon des de dins: 169.254.169.254. Allà hi viuen les metadades d'instància: el seu ID, el seu
tipus, la seva AZ, les seves IP, les seves etiquetes (si ho habilites) i —molt important— les credencials
temporals del rol IAM associat.
Aquesta darrera part explica per què la seguretat d'aquest punt d'enllaç importa tant. La versió 1 (IMDSv1)
responia a qualsevol GET, cosa que permetia que una vulnerabilitat de tipus SSRF a l'aplicació
web fes que el mateix servidor filtrés les seves credencials. IMDSv2 exigeix obtenir abans un
testimoni per PUT, cosa que un SSRF simple no pot fer.
# Pas 1: demanar el testimoni (obligatori a IMDSv2). TTL en segons.
TOKEN=$(curl -sX PUT "http://169.254.169.254/latest/api/token" \
-H "X-aws-ec2-metadata-token-ttl-seconds: 21600")
# Pas 2: fer servir el testimoni a cada consulta
curl -s -H "X-aws-ec2-metadata-token: $TOKEN" \
http://169.254.169.254/latest/meta-data/instance-id
curl -s -H "X-aws-ec2-metadata-token: $TOKEN" \
http://169.254.169.254/latest/meta-data/instance-type
# Llistar totes les rutes disponibles
curl -s -H "X-aws-ec2-metadata-token: $TOKEN" \
http://169.254.169.254/latest/meta-data/Rutes útils en el dia a dia:
| Ruta | Retorna |
|---|---|
instance-id |
i-0123456789abcdef0 |
instance-type |
t3.micro |
placement/availability-zone |
eu-west-1a |
placement/region |
eu-west-1 |
local-ipv4 / public-ipv4 |
IP privada / pública |
iam/security-credentials/<rol> |
Credencials temporals del rol |
spot/instance-action |
Avís de recuperació d'una instància spot |
Política de MercadoFresco: exigir IMDSv2 sempre. Es força en llançar la instància amb
--metadata-options "HttpTokens=required", tal com farem a la comanda de creació.
Crear la instància per consola, pas a pas
Farem primer el camí visual, perquè ensenya el vocabulari, i després el mateix resultat per CLI, que és el que s'automatitza.
- Consola → busca EC2 → comprova a dalt a la dreta que la regió és Irlanda
(
eu-west-1). Aquesta comprovació no és opcional: és el parany que vam veure a 01-04. - Instàncies → Llançar instàncies.
- Nom i etiquetes:
mercadofresco-tienda-01. Prem Afegir etiquetes addicionals i completa l'esquema obligatori del projecte:Proyecto = mercadofrescoEntorno = desarrolloComponente = tiendaPropietario = luisCentroCoste = operaciones
- Imatge (AMI): Amazon Linux 2023, arquitectura
x86_64. Fixa't en l'etiqueta Apte per a la capa gratuïta. - Tipus d'instància:
t3.micro. - Parell de claus: selecciona
mercadofresco-tienda(el que has creat abans) o crea'l aquí i descarrega el.pem. - Configuració de xarxa: deixa la VPC per defecte i crea un grup de seguretat anomenat
sg-mercadofresco-tiendaamb dues regles d'entrada: HTTP (80) des de 0.0.0.0/0 i SSH (22) des de La meva IP. Mai SSH obert al món. El detall d'això és la lliçó 03-02. - Emmagatzematge: 8 GiB
gp3, el valor per defecte. Els discs són la lliçó 02-02. - Detalls avançats → desplega fins al final i enganxa el contingut de
user-data-tienda.shal camp Dades d'usuari. Al mateix bloc, verifica que Versió d'IMDS estigui en V2 obligatori. - Revisa el tauler de resum de la dreta i prem Llançar instància.
En 30-60 segons l'estat passarà a running i les comprovacions d'estat (2/2) es posaran en
verd. Copia la IP pública i obre-la al navegador: veuràs la pàgina de MercadoFresco amb l'ID
de la instància i la seva zona de disponibilitat.
Avís de cost. Un
t3.microestà dins de la capa gratuïta durant els 12 primers mesos (750 h/mes). Si ja l'has exhaurida, costa de l'ordre de 0,01 USD/hora aeu-west-1. L'apartat final explica com esborrar-ho tot.
Crear la instància per CLI amb l'esquema d'etiquetatge
El mateix resultat, en una sola comanda reproduïble. Primer el grup de seguretat mínim (es detalla a 03-02; aquí és només instrumental):
# Crear el grup de seguretat a la VPC per defecte
SG_ID=$(aws ec2 create-security-group \
--group-name sg-mercadofresco-tienda \
--description "Acces web i SSH per a la botiga de MercadoFresco" \
--query 'GroupId' --output text \
--profile mercadofresco-dev --region eu-west-1)
# Obrir HTTP a tothom (és una botiga pública)
aws ec2 authorize-security-group-ingress \
--group-id "$SG_ID" --protocol tcp --port 80 --cidr 0.0.0.0/0 \
--profile mercadofresco-dev --region eu-west-1
# Obrir SSH NOMÉS a la teva IP actual
LA_MEVA_IP=$(curl -s https://checkip.amazonaws.com)
aws ec2 authorize-security-group-ingress \
--group-id "$SG_ID" --protocol tcp --port 22 --cidr "${LA_MEVA_IP}/32" \
--profile mercadofresco-dev --region eu-west-1I ara la instància:
aws ec2 run-instances \
--image-id "$AMI_ID" \
--instance-type t3.micro \
--key-name mercadofresco-tienda \
--security-group-ids "$SG_ID" \
--user-data file://user-data-tienda.sh \
--metadata-options "HttpTokens=required,HttpPutResponseHopLimit=1" \
--credit-specification "CpuCredits=standard" \
--tag-specifications \
'ResourceType=instance,Tags=[
{Key=Name,Value=mercadofresco-tienda-01},
{Key=Proyecto,Value=mercadofresco},
{Key=Entorno,Value=desarrollo},
{Key=Componente,Value=tienda},
{Key=Propietario,Value=luis},
{Key=CentroCoste,Value=operaciones}]' \
'ResourceType=volume,Tags=[
{Key=Proyecto,Value=mercadofresco},
{Key=Entorno,Value=desarrollo},
{Key=Componente,Value=tienda},
{Key=Propietario,Value=luis},
{Key=CentroCoste,Value=operaciones}]' \
--profile mercadofresco-dev --region eu-west-1Paràmetre a paràmetre, perquè cadascun té el seu perquè:
--user-data file://…: el prefixfile://és obligatori; sense ell, la CLI enviaria la cadena literaluser-data-tienda.shcom a script. La CLI v2 codifica el fitxer en base64 per tu.--metadata-options HttpTokens=required: força IMDSv2.HttpPutResponseHopLimit=1impedeix que un contenidor dins de la instància arribi a les metadades de l'amfitrió.--credit-specification CpuCredits=standard: en proves preferim que la instància s'estranguli abans que generar càrrecs inesperats perunlimited.--tag-specifications: es passa dues vegades, una per a la instància i una altra per al volum. Aquest és l'error d'etiquetatge més freqüent: s'etiqueta la instància, s'oblida el disc, i al mòdul 11 apareix una despesa d'EBS que no se sap a qui imputar.
Comprovar el resultat amb una consulta llegible:
aws ec2 describe-instances \
--filters "Name=tag:Proyecto,Values=mercadofresco" \
"Name=instance-state-name,Values=running" \
--query 'Reservations[].Instances[].{
ID:InstanceId,
Tipus:InstanceType,
Estat:State.Name,
IP:PublicIpAddress,
AZ:Placement.AvailabilityZone,
Nom:Tags[?Key==`Name`]|[0].Value}' \
--output table \
--profile mercadofresco-dev --region eu-west-1Plantilles de llançament i Auto Scaling: la solució al pic dels divendres
Ja tenim un servidor. Però un servidor no resol el problema 1: els divendres de 17:00 a 21:00 arriben 900 comandes/hora i una instància en suporta 600. I comprar una màquina més gran "per al divendres" significa pagar-la les 168 hores de la setmana per fer-la servir 4.
La resposta d'AWS són dues peces que treballen juntes.
Plantilla de llançament (launch template)
És la recepta versionada de com ha de ser una instància de la botiga: AMI, tipus, parell de claus, grup
de seguretat, user data, etiquetes. Deixa d'haver-hi "la instància que va muntar el Luis a mà"; hi ha una
definició que qualsevol pot reproduir idèntica.
# El user data ha d'anar en base64 dins del JSON de la plantilla
USER_DATA_B64=$(base64 -w0 user-data-tienda.sh)
aws ec2 create-launch-template \
--launch-template-name lt-mercadofresco-tienda \
--version-description "v1 nginx + php-fpm" \
--launch-template-data "{
\"ImageId\": \"$AMI_ID\",
\"InstanceType\": \"t3.micro\",
\"KeyName\": \"mercadofresco-tienda\",
\"SecurityGroupIds\": [\"$SG_ID\"],
\"UserData\": \"$USER_DATA_B64\",
\"MetadataOptions\": {\"HttpTokens\": \"required\"},
\"TagSpecifications\": [{
\"ResourceType\": \"instance\",
\"Tags\": [
{\"Key\": \"Name\", \"Value\": \"mercadofresco-tienda-asg\"},
{\"Key\": \"Proyecto\", \"Value\": \"mercadofresco\"},
{\"Key\": \"Entorno\", \"Value\": \"desarrollo\"},
{\"Key\": \"Componente\", \"Value\": \"tienda\"},
{\"Key\": \"Propietario\", \"Value\": \"luis\"},
{\"Key\": \"CentroCoste\", \"Value\": \"operaciones\"}
]}]
}" \
--profile mercadofresco-dev --region eu-west-1Les plantilles són versionades: en canviar el user data crees la versió 2 i pots tornar a
la 1 si alguna cosa surt malament. Aquesta capacitat de revertir és el primer pas cap al problema 4
(desplegaments arriscats), que es resoldrà del tot al mòdul 8.
Grup d'Auto Scaling (ASG)
Un ASG manté un nombre d'instàncies sanes repartides entre diverses zones de disponibilitat, i l'ajusta segons la demanda. Té tres números:
| Paràmetre | Significat | Valor a MercadoFresco |
|---|---|---|
| Mínim | Mai no baixarà d'aquí | 2 (una per AZ: tolerància a fallada) |
| Desitjat | Quantes en vol tenir ara | 2 en repòs |
| Màxim | Mai no pujarà d'aquí (sostre de despesa) | 4 |
El dimensionament surt de les xifres reals:
Pic dels divendres: 900 comandes/hora Capacitat per instància: 600 comandes/hora Instàncies necessàries: 900 / 600 = 1,5 → 2 com a mínim funcional Marge per a fallada d'una AZ: +1 Màxim amb marge de creixement: 4
aws autoscaling create-auto-scaling-group \
--auto-scaling-group-name asg-mercadofresco-tienda \
--launch-template "LaunchTemplateName=lt-mercadofresco-tienda,Version=\$Latest" \
--min-size 2 --max-size 4 --desired-capacity 2 \
--vpc-zone-identifier "subnet-aaa11111,subnet-bbb22222" \
--health-check-type EC2 --health-check-grace-period 120 \
--tags "Key=Proyecto,Value=mercadofresco,PropagateAtLaunch=true" \
"Key=Entorno,Value=desarrollo,PropagateAtLaunch=true" \
--profile mercadofresco-dev --region eu-west-1--vpc-zone-identifier: dues subxarxes en dues AZ diferents (eu-west-1aieu-west-1b), tal com vam decidir a 01-03. Substitueix els ID pels de la teva VPC per defecte.--health-check-grace-period 120: dona 2 minuts aluser dataabans de jutjar si la instància està sana. Sense aquesta espera, l'ASG mata instàncies que encara s'estaven instal·lant.PropagateAtLaunch=true: les etiquetes es copien a cada instància nova. Sense això, les màquines creades per l'ASG apareixerien sense etiquetar a la factura.
I la política que fa la feina automàticament:
# Escalat per seguiment d'objectiu: "mantén la CPU mitjana del grup al 60 %".
aws autoscaling put-scaling-policy \
--auto-scaling-group-name asg-mercadofresco-tienda \
--policy-name cpu-objetivo-60 \
--policy-type TargetTrackingScaling \
--target-tracking-configuration '{
"TargetValue": 60.0,
"PredefinedMetricSpecification": {"PredefinedMetricType": "ASGAverageCPUUtilization"}
}' \
--profile mercadofresco-dev --region eu-west-1El target tracking és la política recomanada: declares l'objectiu i AWS calcula sol quan afegir i quan treure màquines. Alternatives: escalat per passos (llindars manuals) i escalat programat, que per a MercadoFresco té molt sentit perquè el pic és a una hora coneguda:
# Pujar a 4 instàncies tots els divendres a les 16:45 UTC, abans que arribi el pic.
aws autoscaling put-scheduled-update-group-action \
--auto-scaling-group-name asg-mercadofresco-tienda \
--scheduled-action-name pico-viernes-tarde \
--recurrence "45 16 * * 5" \
--desired-capacity 4 \
--profile mercadofresco-dev --region eu-west-1El flux complet:
flowchart TD
A["Divendres 17:00<br/>arriben 900 comandes/hora"] --> B["CloudWatch mesura<br/>CPU mitjana del grup"]
B --> C{"CPU mitjana<br/>> 60 %?"}
C -->|Si| D["ASG arrenca instancies<br/>des de lt-mercadofresco-tienda"]
D --> E["user data instal-la<br/>nginx + php-fpm"]
E --> F["Comprovacio de salut<br/>/salud respon 200"]
F --> G["Instancia en servei<br/>capacitat = 4 x 600 = 2.400 c/h"]
C -->|No, dissabte 03:00| H["ASG redueix fins al minim<br/>2 instancies"]
H --> I["Es deixa de pagar<br/>allo que no es fa servir"]
Falta una peça perquè això funcioni de veritat: alguna cosa que reparteixi el trànsit entre les instàncies. Això és l'Elastic Load Balancing, la lliçó 03-03. Aquí hem muntat el motor; al mòdul 3 li connectarem la direcció.
Apagar i esborrar-ho tot per no gastar
Regla d'or del curs: allò que crees en una lliçó, ho esborres en acabar-la.
# 1. Buidar i eliminar el grup d'Auto Scaling (--force-delete termina les seves instàncies)
aws autoscaling delete-auto-scaling-group \
--auto-scaling-group-name asg-mercadofresco-tienda --force-delete \
--profile mercadofresco-dev --region eu-west-1
# 2. Eliminar la plantilla de llançament
aws ec2 delete-launch-template \
--launch-template-name lt-mercadofresco-tienda \
--profile mercadofresco-dev --region eu-west-1
# 3. Terminar la instància creada a mà
aws ec2 terminate-instances --instance-ids i-0123456789abcdef0 \
--profile mercadofresco-dev --region eu-west-1
# 4. Verificar que no queda RES en execució amb l'etiqueta del projecte
aws ec2 describe-instances \
--filters "Name=tag:Proyecto,Values=mercadofresco" \
"Name=instance-state-name,Values=running,pending,stopped" \
--query 'Reservations[].Instances[].[InstanceId,State.Name]' --output table \
--profile mercadofresco-dev --region eu-west-1Si vols conservar la instància per a la lliçó següent sense pagar còmput, atura-la en comptes de terminar-la (continuaràs pagant només el volum de 8 GiB, uns 0,64 USD al mes):
aws ec2 stop-instances --instance-ids i-0123456789abcdef0 \
--profile mercadofresco-dev --region eu-west-1I recorda revisar el pressupost presupuesto-mensual-mercadofresco que vas configurar a 01-02: és
la teva xarxa de seguretat si alguna cosa es queda encesa.
Errors Habituals i Consells
- Terminar creient que s'atura. L'error irreversible per excel·lència. Activa sempre
--disable-api-terminationen qualsevol instància amb dades. - Perdre el fitxer
.pem. AWS no en té còpia. Si el perds, l'única sortida és desconnectar el volum i muntar-lo en una altra instància. Desa'l al gestor de contrasenyes i tingues habilitat Session Manager com a pla B. - Obrir el port 22 a
0.0.0.0/0. Rebràs intents d'accés automatitzats en qüestió de minuts. Sempre<la-teva-ip>/32, o millor, cap port SSH i Session Manager. - Sorprendre't perquè la CPU es queda plana al 10 %. Són els crèdits burstable exhaurits. Mira
la mètrica
CPUCreditBalanceabans de culpar l'aplicació. - Oblidar
file://a--user-data. La instància arrenca "bé" però no instal·la res. Si el servidor web no respon, entra-hi i llegeix/var/log/cloud-init-output.log. - Etiquetar la instància i no el volum. Passa
--tag-specificationsper ainstancei per avolume, sempre. - Esperar que el
user datas'executi a cada arrencada. Només corre la primera vegada. Per a tasques de cada arrencada, fes servir una unitat de systemd creada pel mateixuser data. - Confondre la IP pública amb alguna cosa estable. Canvia en aturar i arrencar. Fes servir DNS (03-05).
- Deixar l'ASG amb un
min-sizealt "per si de cas". És la manera més silenciosa de multiplicar la factura: cada instància del mínim es paga 24×7. - Consell d'or: comença petit i mesura. És infinitament més barat pujar de mida una instància infradimensionada que descobrir al mòdul 11 que fa sis mesos que pagues el doble.
Exercicis
Exercici 1: dimensionar el grup per a un creixement a tres ciutats
MercadoFresco vol obrir en dues ciutats més (problema 3). La previsió és que el pic dels divendres passi de 900 a 2.100 comandes/hora. Cada instància continua suportant 600 comandes/hora i la política de la Marta exigeix que el servei continuï funcionant encara que caigui una zona de disponibilitat sencera.
Calcula el mínim, el desitjat i el màxim de l'ASG, justificant cada número, i escriu la comanda
aws autoscaling update-auto-scaling-group corresponent.
Exercici 2: diagnosticar un user data que no funciona
El Luis llança una instància amb l'script de la lliçó, la instància apareix running amb 2/2
comprovacions en verd, però en obrir la IP pública el navegador es queda esperant indefinidament
(no dona "connexió rebutjada", simplement no respon).
Enumera, en ordre de cost creixent d'investigació, els passos que faries i què comprovaries a cadascun. Indica quina és la causa més probable atesa la pista del "es queda esperant".
Exercici 3: triar tipus i model de compra
Per a cadascuna d'aquestes tres càrregues de MercadoFresco, tria família, mida aproximada i model de compra, i justifica-ho en una frase:
- A) Servidor de la botiga en producció, trànsit sostingut les 24 hores, 4 GiB de RAM suficients, CPU al 55 % de mitjana.
- B) Procés nocturn que recomprimeix les 40.000 fotos del catàleg; triga 3 hores, satura la CPU, i si s'interromp pot reprendre's des d'on anava.
- C) Entorn de desenvolupament del Luis, encès de 9:00 a 18:00 de dilluns a divendres, gairebé sempre inactiu amb ràfegues en compilar.
Solucions
Solució 1.
Capacitat necessària en el pic: 2.100 / 600 = 3,5 → 4 instàncies Tolerància a la caiguda d'una AZ: el grup ha de continuar donant 4 instàncies amb una AZ menys. Amb 2 AZ, la meitat de la capacitat és a cadascuna, així que cal poder arribar a 8 per sobreviure a perdre'n la meitat.
- Mínim = 2. En vall no en cal més, però mai menys de 2 per tenir una instància a cada AZ i no dependre d'una de sola.
- Desitjat = 2. És el punt de partida; la política de seguiment d'objectiu el pujarà sola. Es pot combinar amb una acció programada que el porti a 4 els divendres a les 16:45.
- Màxim = 8. Cobreix les 4 necessàries més el marge perquè, si cau una AZ, les 4 restants puguin llançar-se a la que continua dempeus. El màxim també actua com a sostre de despesa: si un atac o un error dispara la CPU, mai no es passarà de 8 instàncies.
aws autoscaling update-auto-scaling-group \
--auto-scaling-group-name asg-mercadofresco-tienda \
--min-size 2 --max-size 8 --desired-capacity 2 \
--profile mercadofresco-dev --region eu-west-1Solució 2.
El matís clau: "es queda esperant" ≠ "connexió rebutjada". Si nginx estigués caigut però la xarxa hi arribés, el sistema operatiu retornaria un rebuig immediat. Un temps d'espera exhaurit indica que els paquets no arriben a la instància, és a dir, un problema de xarxa, no de programari.
Passos per cost creixent:
- Grup de seguretat (30 segons, sense entrar a la màquina): comprovar que existeix una regla
d'entrada TCP 80 des de
0.0.0.0/0. Aquesta és la causa més probable.aws ec2 describe-security-groups --group-ids "$SG_ID" \\ --query 'SecurityGroups[].IpPermissions' \\ --profile mercadofresco-dev --region eu-west-1 - IP pública: verificar que la instància en té una (
PublicIpAddressno nul) i que estàs fent servir aquesta i no la privada172.31.x.x. - Subxarxa pública: la subxarxa ha de tenir ruta cap a una passarel·la d'internet (això s'entén del tot a 03-01).
- Entrar per Session Manager (no requereix el port 22, útil precisament quan la xarxa falla) i:
sudo systemctl status nginx sudo tail -50 /var/log/cloud-init-output.log curl -s localhost # si això respon, el servidor està bé i el problema és de xarxa
Solució 3.
| Càrrega | Família i mida | Model de compra | Justificació |
|---|---|---|---|
| A) Botiga en producció | m6i.large (2 vCPU, 8 GiB) o m7g.large si el programari és compatible amb ARM |
Sota demanda ara; Savings Plan d'1 any quan hi hagi 3 mesos de dades | Càrrega sostinguda 24×7: una T en unlimited acabaria costant més; la M dona rendiment previsible sense crèdits |
| B) Recompressió nocturna | c6i.xlarge o superior (CPU intensiva) |
Spot | És tolerant a interrupcions i represa: compleix exactament la condició de spot i estalvia fins al 90 % |
| C) Desenvolupament del Luis | t3.medium |
Sota demanda + aturada programada fora de l'horari | Perfil ociós amb ràfegues: cas de manual per a burstable. Apagar-lo a la nit i el cap de setmana redueix el cost ~75 % |
Conclusió
MercadoFresco ja té el seu primer servidor a AWS, i sobretot té el vocabulari i els mecanismes
per raonar-hi. Saps que una AMI és la plantilla i la instància la còpia viva, i que
l'ID d'una AMI canvia amb la regió, per la qual cosa es consulta i no es copia. Saps desxifrar
t3.micro i triar entre les famílies T, M, C i R en funció de si la càrrega és irregular,
equilibrada, intensiva en CPU o intensiva en memòria. Has vist per dins el mecanisme dels
crèdits de CPU i has calculat que un t3.micro no sobreviu a les quatre hores del pic dels
divendres: una dada concreta, no una intuïció.
Coneixes els quatre models de compra i en quin cas encaixa cadascun, i domines el cicle de
vida amb la distinció que surt més cara: aturar conserva el disc, terminar el destrueix per
sempre. Saps accedir a la màquina amb un parell de claus i també sense, mitjançant EC2 Instance
Connect o Session Manager, que és l'opció que MercadoFresco farà servir en producció per no
requerir cap port obert. Has automatitzat la instal·lació completa de la botiga amb user data, saps on llegir-ne el registre quan falla, i has protegit les metadades exigint IMDSv2.
Has creat la instància per consola i per CLI aplicant l'esquema d'etiquetatge del projecte tant
a la instància com al seu volum.
I, sobretot, has posat la primera peça real contra el problema 1: una plantilla de llançament versionada i un grup d'Auto Scaling de 2 a 4 instàncies amb seguiment d'objectiu i escalat programat, dimensionat amb les xifres reals de MercadoFresco (900 comandes/h davant de 600 per instància). Falta el balancejador que reparteixi el trànsit entre elles, i això és la lliçó 03-03.
Abans d'això hi ha una pregunta que l'Auto Scaling deixa al descobert: si les instàncies neixen i
moren soles, on viuen les dades? Les fotos de producte que avui són a /var/www/fotos
no poden estar dins d'un disc que es destrueix amb la màquina. A la lliçó 02-02,
«Emmagatzematge de blocs i de fitxers: EBS i EFS», veurem els volums que sobreviuen a la
instància, com s'amplien en calent, com es comparteixen entre diverses màquines i com les
instantànies automatitzades amb Data Lifecycle Manager tanquen d'una vegada el problema 2 de
MercadoFresco: les còpies de seguretat que mai no van ser fiables.
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
