La lliçó anterior va acabar amb una pregunta incòmoda: si el grup d'Auto Scaling crea i destrueix instàncies de la botiga de MercadoFresco segons el trànsit del divendres, on viuen les dades? Les fotos de producte que avui són a /var/www/fotos del servidor de l'oficina no poden viure dins d'un disc que desapareix quan l'ASG decideix que sobra una màquina.

Aquesta lliçó respon a aquesta pregunta des de dos angles complementaris. Amazon EBS (Elastic Block Store) dona a cada instància discs que sobreviuen a la màquina, s'amplien en calent i es copien sols. Amazon EFS (Elastic File System) dona a diverses instàncies alhora un sistema de fitxers compartit, que és exactament el que l'Auto Scaling necessita perquè les quatre màquines del divendres vegin les mateixes fotos.

I pel camí tanquem el problema 2 de MercadoFresco: les còpies de seguretat no fiables. El disc dur extern que la Marta connecta "quan se'n recorda" se substitueix per instantànies incrementals automatitzades amb Data Lifecycle Manager, amb retenció definida i còpia a una altra regió.

Contingut

  1. Els tres models d'emmagatzematge: blocs, fitxers i objectes
  2. Què és un volum EBS i què garanteix
  3. Tipus de volum EBS i com triar
  4. Dimensionar gp3: IOPS i rendiment independents de la mida
  5. Crear, adjuntar, formatar i muntar un volum
  6. Ampliar un volum en calent, sense aturar la botiga
  7. Instantànies: què són, com es cobren i com es restauren
  8. Data Lifecycle Manager: la fi del problema 2
  9. Xifratge de volums
  10. Instance store: ràpid, local i efímer
  11. Amazon EFS: un sistema de fitxers per a diverses instàncies
  12. Muntar EFS a les instàncies de la botiga
  13. Taula final: EBS, EFS, instance store i S3

Els tres models d'emmagatzematge: blocs, fitxers i objectes

Abans de tocar cap servei cal tenir clara una distinció que ordena tot el capítol de l'emmagatzematge al núvol. No són tres productes que competeixen: són tres models diferents de desar dades, i cadascun resol un problema diferent.

Blocs (EBS) Fitxers (EFS) Objectes (S3)
Unitat Bloc de disc sense format Fitxer dins d'una jerarquia Objecte amb clau i metadades
Com s'hi accedeix Com un disc dur: /dev/xvdf Protocol de xarxa NFS: mount API HTTPS: GET/PUT
Qui hi posa el sistema de fitxers Tu (mkfs) El servei No hi ha sistema de fitxers
Modificar part d'una dada Sí, bloc a bloc No: es reemplaça l'objecte sencer
Concurrència 1 instància (o poques, amb multi-attach) Milers d'instàncies alhora Il·limitada, per HTTPS
Capacitat Fixa, la que provisiones Elàstica automàtica Pràcticament il·limitada
Latència típica Sub-mil·lisegon Pocs mil·lisegons Desenes de mil·lisegons
Cost relatiu per GB Mitjà Alt (≈3× EBS) Baix
Cas clar Disc de sistema, base de dades Directori compartit entre servidors Fotos, còpies, fitxers estàtics

La regla mental que convé fixar:

  • Blocs: quan el programari espera un disc. Un sistema operatiu, PostgreSQL, un motor de base de dades. Res d'això sap parlar HTTP.
  • Fitxers: quan diversos servidors han de compartir els mateixos fitxers i el programari espera rutes del sistema de fitxers (/var/www/fotos). És la via de mínima modificació quan migres una aplicació heretada.
  • Objectes: quan la dada és un fitxer complet que s'escriu una vegada i es llegeix moltes. És el més barat, el més durador i el més escalable, però exigeix que l'aplicació faci servir la seva API.

Per a MercadoFresco, les fotos de producte podrien anar a EFS (sense tocar el codi) o a S3 (canviant el codi, més barat i millor a llarg termini). Veurem EFS aquí i S3 a la lliçó 02-03, on quedarà clar per què aquesta és la decisió definitiva.

Què és un volum EBS i què garanteix

Un volum EBS és un disc virtual que es connecta per xarxa a una instància EC2, però que el sistema operatiu veu exactament com un disc local: apareix a lsblk, es formata amb mkfs i es munta amb mount.

Les seves propietats essencials:

  • És independent de la instància. Si termines la instància, el volum pot sobreviure (depèn de l'atribut DeleteOnTermination). El pots desconnectar i connectar a una altra màquina.
  • Viu en una sola zona de disponibilitat. Un volum d'eu-west-1a no es pot connectar a una instància d'eu-west-1b. Per moure'l cal fer una instantània i restaurar-la a l'altra AZ.
  • Està replicat dins de la seva AZ. AWS en manté diverses còpies en servidors diferents: una fallada de disc físic no t'afecta. Però una fallada de l'AZ sencera, sí. Per això les instantànies importen.
  • Es paga per GB provisionat, no per GB fet servir. Un volum de 500 GiB amb 3 GiB de dades costa com 500 GiB. Aquesta és una de les despeses ocultes més habituals.
  • Es pot ampliar en calent, però no reduir. Dimensiona amb cap.
flowchart LR
    subgraph AZ1["Zona de disponibilitat eu-west-1a"]
        I1["Instancia<br/>mercadofresco-tienda-01"]
        V1["Volum EBS arrel<br/>8 GiB gp3"]
        V2["Volum EBS dades<br/>20 GiB gp3<br/>/var/www/fotos"]
        I1 --- V1
        I1 --- V2
    end
    subgraph AZ2["Zona de disponibilitat eu-west-1b"]
        I2["Instancia<br/>mercadofresco-tienda-02"]
        V3["Volum EBS arrel<br/>8 GiB gp3"]
        I2 --- V3
    end
    V2 -.->|"instantania"| S["Instantanies a S3<br/>(regionals, multi-AZ)"]
    S -.->|"restaurar"| V3

Fixa't en el detall important del diagrama: mercadofresco-tienda-02 no pot connectar-se al volum de fotos de l'altra AZ. Aquest límit és precisament el que empeny cap a EFS o S3.

Tipus de volum EBS i com triar

N'hi ha dues categories: SSD, optimitzats per a operacions per segon (IOPS) i accés aleatori, i HDD, optimitzats per a rendiment seqüencial (MB/s) i cost per GB.

Tipus Tecnologia IOPS màx. per volum Rendiment màx. Cost orientatiu (USD/GB-mes, eu-west-1) Cas d'ús
gp3 SSD 16.000 1.000 MB/s 0,088 (+ IOPS i MB/s extra a part) Opció per defecte: sistema, aplicacions, bases de dades mitjanes
gp2 SSD 16.000 (lligats a la mida) 250 MB/s 0,11 Generació anterior; no triar-la per a res nou
io2 / io2 Block Express SSD 64.000 / 256.000 4.000 MB/s 0,138 + 0,065 per IOPS Bases de dades crítiques, IOPS garantides, 99,999 % de durabilitat
st1 HDD 500 500 MB/s 0,048 Registres, big data, lectura seqüencial massiva
sc1 HDD 250 250 MB/s 0,018 Arxiu fred al qual s'accedeix poques vegades

Els preus són orientatius i canvien; consulta'ls sempre a la calculadora d'AWS. El que no canvia és l'ordre de magnitud entre ells.

Quatre criteris de decisió:

  1. Comença sempre per gp3. És més barat que gp2 en un ~20 % i dona 3.000 IOPS de base encara que el volum sigui d'1 GiB.
  2. Puja a io2 només si has mesurat que necessites més de 16.000 IOPS o si el negoci exigeix la durabilitat de cinc nous. És car.
  3. HDD (st1/sc1) només per a accés seqüencial. Si la càrrega fa moltes lectures petites i aleatòries, un HDD donarà un rendiment pèssim encara que el preu per GB sigui temptador.
  4. Els HDD no poden ser volums d'arrencada. El disc arrel sempre és SSD.

Migrar de gp2 a gp3 és gratis, en calent i estalvia diners. Si heretes un compte amb volums gp2, aquest és l'estalvi més fàcil que existeix:

aws ec2 modify-volume --volume-id vol-0123456789abcdef0 --volume-type gp3 \
  --profile mercadofresco-dev --region eu-west-1

Dimensionar gp3: IOPS i rendiment independents de la mida

Aquí hi ha la millora conceptual de gp3 respecte a gp2, i val la pena aturar-s'hi perquè explica moltes decisions d'arquitectura.

Amb gp2, el rendiment estava lligat a la mida: 3 IOPS per GiB. Si volies 3.000 IOPS, havies de provisionar 1.000 GiB, encara que només en fessis servir 40. Es comprava espai per comprar velocitat.

Amb gp3, els tres paràmetres es contracten per separat:

Paràmetre Inclòs al preu base Màxim Cost de l'extra
Mida La que provisionis 16 TiB 0,088 USD/GB-mes
IOPS 3.000 16.000 ~0,006 USD per IOPS-mes per sobre de 3.000
Rendiment 125 MB/s 1.000 MB/s ~0,048 USD per MB/s-mes per sobre de 125

Comparació per al cas de MercadoFresco, que necessita 100 GiB i 3.000 IOPS:

Opció Configuració Cost mensual aproximat
gp2 1.000 GiB (per arribar a 3.000 IOPS) ~110 USD
gp3 100 GiB + 3.000 IOPS de base ~8,8 USD

Un factor 12 de diferència per conèixer el tipus correcte de volum. I si més endavant la base de dades necessités 6.000 IOPS, s'afegeixen sense tocar la mida:

aws ec2 modify-volume \
  --volume-id vol-0123456789abcdef0 \
  --iops 6000 --throughput 250 \
  --profile mercadofresco-dev --region eu-west-1

Un límit pràctic que cal conèixer: la instància també té un sostre. Un t3.micro no podrà aprofitar 16.000 IOPS per molt que les contractis, perquè la seva amplada de banda cap a EBS està limitada. Per a càrregues de disc intensives es fan servir instàncies "optimitzades per a EBS" de mida suficient. Serveix de poc un volum rapidíssim penjat d'una instància diminuta.

Crear, adjuntar, formatar i muntar un volum

Donarem a mercadofresco-tienda-01 un disc dedicat de 20 GiB per a les fotos de producte, separat del disc de sistema. Separar dades de sistema és una bona pràctica: pots reinstal·lar la màquina sense tocar les dades, i fer instantànies només del que importa.

Pas 1: crear el volum (a la mateixa AZ que la instància)

# L'AZ ha de coincidir EXACTAMENT amb la de la instància. Si no, no es podrà adjuntar.
VOL_ID=$(aws ec2 create-volume \
  --availability-zone eu-west-1a \
  --size 20 \
  --volume-type gp3 \
  --encrypted \
  --tag-specifications 'ResourceType=volume,Tags=[
      {Key=Name,Value=mercadofresco-fotos-01},
      {Key=Proyecto,Value=mercadofresco},
      {Key=Entorno,Value=desarrollo},
      {Key=Componente,Value=catalogo},
      {Key=Propietario,Value=luis},
      {Key=CentroCoste,Value=operaciones}]' \
  --query 'VolumeId' --output text \
  --profile mercadofresco-dev --region eu-west-1)

echo "Volum creat: $VOL_ID"
  • --encrypted activa el xifratge en repòs amb la clau gestionada per AWS. Costa el mateix que sense xifrar i no es pot afegir després, així que es posa sempre des del principi.
  • El Componente és catalogo, perquè són les fotos de producte, no la botiga en si. L'esquema d'etiquetatge permet després imputar el cost a l'equip correcte.

Pas 2: adjuntar-lo a la instància

aws ec2 attach-volume \
  --volume-id "$VOL_ID" \
  --instance-id i-0123456789abcdef0 \
  --device /dev/sdf \
  --profile mercadofresco-dev --region eu-west-1

Un detall que despista: demanes /dev/sdf però Amazon Linux amb nucli modern i NVMe el mostrarà com a /dev/nvme1n1. El nom que demanes és una etiqueta; el que veus a dins depèn del sistema. Per això mai no es munta per nom de dispositiu a /etc/fstab, sinó per UUID.

Pas 3: formatar i muntar (dins de la instància)

# Veure els discs disponibles. El nou apareix sense punt de muntatge.
lsblk
# NAME          MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
# nvme0n1       259:0    0   8G  0 disk
# └─nvme0n1p1   259:1    0   8G  0 part /
# nvme1n1       259:2    0  20G  0 disk          <-- el nou, buit

# Comprovar si ja té sistema de fitxers. Si respon "data", és buit.
sudo file -s /dev/nvme1n1
# /dev/nvme1n1: data

# Formatar amb XFS (l'estàndard a Amazon Linux; ext4 és igualment vàlid).
# ATENCIÓ: mkfs DESTRUEIX tot el que hi hagi al volum. Només en discs nous.
sudo mkfs -t xfs /dev/nvme1n1

# Crear el punt de muntatge i muntar
sudo mkdir -p /var/www/fotos
sudo mount /dev/nvme1n1 /var/www/fotos

# Comprovar
df -h /var/www/fotos
# Filesystem      Size  Used Avail Use% Mounted on
# /dev/nvme1n1     20G  175M   20G   1% /var/www/fotos

Pas 4: fer-ho permanent a /etc/fstab

Sense aquest pas, el muntatge es perd al següent reinici i la botiga arrenca amb el directori de fotos buit.

# Obtenir l'UUID del sistema de fitxers (estable, a diferència de /dev/nvme1n1)
sudo blkid /dev/nvme1n1
# /dev/nvme1n1: UUID="a1b2c3d4-e5f6-7890-abcd-ef1234567890" TYPE="xfs"

# Afegir la línia a /etc/fstab
echo 'UUID=a1b2c3d4-e5f6-7890-abcd-ef1234567890  /var/www/fotos  xfs  defaults,nofail  0  2' \
  | sudo tee -a /etc/fstab

# VERIFICAR SEMPRE abans de reiniciar. Aquesta comanda rellegeix fstab i munta el que falti.
sudo umount /var/www/fotos
sudo mount -a
df -h /var/www/fotos

L'opció nofail no és decorativa. Sense ella, si el volum no està disponible en arrencar, la instància es queda bloquejada a l'arrencada i no hi podràs entrar ni per SSH. És una de les formes més freqüents de "perdre" una instància a EC2. Executa sempre sudo mount -a abans de reiniciar per comprovar que la línia de fstab és correcta.

Ampliar un volum en calent, sense aturar la botiga

Al novembre, amb la campanya de Nadal, les fotos del catàleg omplen els 20 GiB. Ampliar és una operació en dues meitats: primer el volum a AWS, després el sistema de fitxers dins de la instància. Si només fas la primera, df -h continuarà mostrant 20 GiB i pensaràs que no ha funcionat.

# Meitat 1: ampliar el volum a AWS (la instància continua en marxa)
aws ec2 modify-volume --volume-id "$VOL_ID" --size 50 \
  --profile mercadofresco-dev --region eu-west-1

# Seguir el progrés de l'optimització
aws ec2 describe-volumes-modifications --volume-id "$VOL_ID" \
  --query 'VolumesModifications[].{Estat:ModificationState,Progres:Progress}' \
  --output table \
  --profile mercadofresco-dev --region eu-west-1
# Meitat 2: dins de la instància, estendre la partició i el sistema de fitxers
lsblk                                  # el disc ja mostra 50G, el sistema de fitxers no

# Si el volum té particions, primer s'amplia la partició:
sudo growpart /dev/nvme1n1 1           # (no aplica si has formatat el disc sencer, com aquí)

# Estendre el sistema de fitxers EN CALENT, amb el volum muntat:
sudo xfs_growfs -d /var/www/fotos      # per a XFS
# sudo resize2fs /dev/nvme1n1          # per a ext4

df -h /var/www/fotos                   # ara sí: 50G

Restriccions importants:

  • No es pot reduir un volum. L'única via és crear-ne un de més petit, copiar-hi les dades i eliminar el gran.
  • Entre dues modificacions del mateix volum han de passar almenys 6 hores.
  • L'ampliació és transparent per a l'aplicació: no cal aturar nginx ni desmuntar.

Instantànies: què són, com es cobren i com es restauren

Una instantània (snapshot) és una còpia puntual d'un volum desada a Amazon S3 (en un espai gestionat per AWS, no en un bucket teu). És la base de les còpies de seguretat a EC2 i la resposta al problema 2 de MercadoFresco.

Tres propietats que cal entendre bé, perquè gairebé tothom les malinterpreta:

  1. Són incrementals, però cadascuna és completa. La primera instantània copia tots els blocs fets servir. La segona copia només els blocs que han canviat des de la primera. Tanmateix, restaurar la segona retorna el volum sencer, no un diferencial. AWS gestiona les referències internament.
  2. Esborrar una instantània intermèdia és segur. Si esborres la instantània 2, AWS conserva els blocs que la instantània 3 encara necessita. Mai no es corromp una cadena per esborrar-ne una baula.
  3. Es cobren per GB de dades úniques emmagatzemades (≈0,05 USD/GB-mes), no per la mida del volum. Un volum de 50 GiB amb 8 GiB de dades que gairebé no canvien genera instantànies molt barates.
flowchart LR
    S1["Instantania 1<br/>dilluns<br/>8 GiB (completa)"] --> S2["Instantania 2<br/>dimarts<br/>+0,3 GiB nous"]
    S2 --> S3["Instantania 3<br/>dimecres<br/>+0,5 GiB nous"]
    S3 --> R["Restaurar la instantania 3<br/>= volum complet de 8,8 GiB"]
    S1 -.-> C["Cost total facturat:<br/>8 + 0,3 + 0,5 = 8,8 GiB"]

Crear una instantània

SNAP_ID=$(aws ec2 create-snapshot \
  --volume-id "$VOL_ID" \
  --description "Fotos cataleg MercadoFresco - abans de la campanya de Nadal" \
  --tag-specifications 'ResourceType=snapshot,Tags=[
      {Key=Name,Value=snap-mercadofresco-fotos},
      {Key=Proyecto,Value=mercadofresco},
      {Key=Entorno,Value=desarrollo},
      {Key=Componente,Value=catalogo},
      {Key=Propietario,Value=luis},
      {Key=CentroCoste,Value=operaciones}]' \
  --query 'SnapshotId' --output text \
  --profile mercadofresco-dev --region eu-west-1)

# Esperar que acabi (la primera vegada pot trigar minuts)
aws ec2 wait snapshot-completed --snapshot-ids "$SNAP_ID" \
  --profile mercadofresco-dev --region eu-west-1
echo "Instantania $SNAP_ID completada"

Coherència de les dades. Una instantània captura el que hi ha al disc, no el que l'aplicació té a la memòria. Per a fitxers estàtics com les fotos n'hi ha prou. Per a una base de dades cal congelar el sistema de fitxers o, molt millor, fer servir les còpies natives del motor —que és exactament el que fa RDS i veurem a la lliçó 02-04.

Restaurar

Una instantània no es restaura sobre el volum original: crea un volum nou. Aquest és el mecanisme que permet moure dades entre zones de disponibilitat, cosa que un volum EBS no pot fer per si sol.

# Crear un volum NOU a l'ALTRA AZ a partir de la instantània
NOU_VOL=$(aws ec2 create-volume \
  --snapshot-id "$SNAP_ID" \
  --availability-zone eu-west-1b \
  --volume-type gp3 \
  --tag-specifications 'ResourceType=volume,Tags=[
      {Key=Name,Value=mercadofresco-fotos-restaurado},
      {Key=Proyecto,Value=mercadofresco},
      {Key=Entorno,Value=pruebas},
      {Key=Componente,Value=catalogo},
      {Key=Propietario,Value=luis},
      {Key=CentroCoste,Value=operaciones}]' \
  --query 'VolumeId' --output text \
  --profile mercadofresco-dev --region eu-west-1)

Copiar a una altra regió (recuperació davant de desastres)

# Copiar la instantània d'Irlanda a Frankfurt. Nota: --source-region indica l'ORIGEN
# i --region indica la DESTINACIÓ on s'executa la còpia.
aws ec2 copy-snapshot \
  --source-region eu-west-1 \
  --source-snapshot-id "$SNAP_ID" \
  --description "Copia DR de fotos MercadoFresco" \
  --encrypted \
  --profile mercadofresco-dev --region eu-central-1

Copiar instantànies entre regions té cost de transferència de dades i d'emmagatzematge a destinació, però és la protecció real contra la fallada d'una regió sencera.

Data Lifecycle Manager: la fi del problema 2

Fins ara les còpies de MercadoFresco eren "la Marta connecta el disc extern quan se'n recorda": sense calendari, sense verificació i sense còpia fora de l'oficina. Això és el problema 2. Una instantània manual com l'anterior no ho arregla, perquè també depèn que algú se'n recordi.

Amazon Data Lifecycle Manager (DLM) executa instantànies segons una política: a quins recursos s'aplica (seleccionats per etiquetes), amb quina freqüència, quantes se'n conserven i on es copien. Aquí es veu per què l'esquema d'etiquetatge de MercadoFresco no era burocràcia: és el mecanisme de selecció de la política.

Primer, el rol que DLM necessita per actuar en nom teu (IAM es detalla a 04-01):

aws dlm create-default-role --resource-type snapshot \
  --profile mercadofresco-dev --region eu-west-1

I la política, desada a politica-dlm.json:

{
  "ResourceTypes": ["VOLUME"],
  "TargetTags": [
    {"Key": "Proyecto", "Value": "mercadofresco"}
  ],
  "Schedules": [
    {
      "Name": "Diario-7-dias",
      "CreateRule": {
        "CronExpression": "cron(0 2 * * ? *)"
      },
      "RetainRule": {"Count": 7},
      "CopyTags": true,
      "TagsToAdd": [
        {"Key": "TipoCopia", "Value": "diaria-automatica"}
      ]
    },
    {
      "Name": "Semanal-4-semanas-con-copia-DR",
      "CreateRule": {
        "CronExpression": "cron(0 3 ? * SUN *)"
      },
      "RetainRule": {"Count": 4},
      "CopyTags": true,
      "CrossRegionCopyRules": [
        {
          "TargetRegion": "eu-central-1",
          "Encrypted": true,
          "RetainRule": {"Interval": 4, "IntervalUnit": "WEEKS"}
        }
      ]
    }
  ]
}
aws dlm create-lifecycle-policy \
  --description "Copies automatiques de volums MercadoFresco" \
  --state ENABLED \
  --execution-role-arn arn:aws:iam::111122223333:role/AWSDataLifecycleManagerDefaultRole \
  --policy-details file://politica-dlm.json \
  --profile mercadofresco-dev --region eu-west-1

Què fa exactament aquesta política, línia a línia:

  • TargetTags: s'aplica a tots els volums etiquetats Proyecto=mercadofresco. Qualsevol volum nou que el Luis creï amb l'etiqueta correcta entra automàticament al pla de còpies, sense que ningú se n'hagi de recordar. Aquest és el canvi cultural.
  • Programació diària: cron(0 2 * * ? *) = tots els dies a les 02:00 UTC. Conserva les últimes 7; en crear la vuitena, esborra la més antiga, així que el cost s'estabilitza.
  • Programació setmanal: diumenges a les 03:00 UTC, en conserva 4 i copia cadascuna a eu-central-1 xifrada. Un mes d'història fora de la regió principal.
  • CopyTags: true: les instantànies hereten les etiquetes del volum, amb la qual cosa el cost de les còpies també queda imputat al seu CentroCoste.

Amb això, el problema 2 queda resolt en la seva part de disc:

Abans (servidor de l'oficina) Ara (AWS amb DLM)
Qui la fa La Marta, quan se'n recorda Automàtic, tots els dies a les 02:00
On es desa Disc extern al mateix edifici S3 gestionat + còpia a una altra regió
Retenció Se sobreescriu 7 diàries + 4 setmanals, definit
Verificació Cap Estat visible; es prova restaurant
Temps de restauració Hores o dies Minuts
Cost El disc extern + el temps de la Marta Cèntims al mes

Falta un matís honest: una còpia no provada no és una còpia. La Marta apunta al calendari una prova de restauració trimestral: crear un volum des de l'última instantània, muntar-lo en una instància de proves i verificar que les fotos hi són. La part de la base de dades d'aquest problema es tancarà a la lliçó 02-04, amb les còpies automàtiques i el PITR d'RDS.

Xifratge de volums

El xifratge d'EBS és transparent: es xifren les dades en repòs, les dades en trànsit entre la instància i el volum, i totes les instantànies derivades. No cal canviar res a l'aplicació i l'impacte en rendiment és menyspreable.

Punts pràctics:

  • No es pot xifrar un volum existent. El procediment és: instantània → còpia de la instantània amb --encrypted → crear un volum nou des d'aquesta còpia → intercanviar.
  • Es pot activar el xifratge per defecte a la regió, i és molt recomanable:
aws ec2 enable-ebs-encryption-by-default \
  --profile mercadofresco-dev --region eu-west-1

A partir d'aquí, tot volum nou a eu-west-1 neix xifrat encara que ningú no ho demani.

  • Les claus les gestiona AWS KMS. Pots fer servir la clau gestionada per AWS (aws/ebs, gratis) o una clau pròpia que et doni control de la rotació i de qui pot desxifrar. KMS és la lliçó 04-02; de moment n'hi ha prou de saber que el xifratge s'activa amb una casella.

Instance store: ràpid, local i efímer

Algunes famílies d'instàncies (les que porten d al nom, com m6id.large, i les famílies i i d) inclouen discs NVMe físicament connectats al servidor amfitrió. És l'instance store.

EBS Instance store
Ubicació Xarxa, dins de l'AZ Físicament al host
Latència Sub-mil·lisegon Encara menor, sense salt de xarxa
Persistència Sobreviu a aturar i terminar Es perd en aturar o terminar
Es perd també si... Falla el maquinari del host
Instantànies No
Cost A part, per GB-mes Inclòs al preu de la instància
Es pot desconnectar No

És efímer per disseny: en aturar la instància, AWS la mourà a un altre host físic en arrencar-la, i aquest host té altres discs. Un reinici (reboot) sí que conserva les dades, perquè no canvia de host; un stop/start, no.

Usos legítims: memòries cau, fitxers temporals, dades intermèdies d'un procés de càlcul, scratch de compilació. Per a MercadoFresco avui no aplica, però convé reconèixer-lo per no triar per error una instància d pensant que el disc inclòs és un estalvi.

Amazon EFS: un sistema de fitxers per a diverses instàncies

Tornem al problema que va obrir la lliçó. El grup d'Auto Scaling aixeca 4 instàncies el divendres. Cadascuna té el seu volum EBS. Si el Luis puja una foto de producte nova a la instància 1, les altres tres no la veuen. I cap instància d'eu-west-1b no pot ni tan sols connectar-se al volum de fotos que viu a eu-west-1a.

Amazon EFS resol exactament això: un sistema de fitxers NFS v4.1 gestionat que es munta simultàniament en milers d'instàncies, en diverses AZ, i que creix i decreix sol.

Les seves característiques diferencials:

  • Elàstic de veritat: no es provisiona mida. Pagues pels GB que realment deses (≈0,30 USD/GB-mes a Standard, unes 3,4 vegades més car que EBS gp3).
  • Regional: s'hi accedeix des de qualsevol AZ de la regió mitjançant "objectius de muntatge" (mount targets), un per subxarxa.
  • Compartit: lectura i escriptura concurrent des de totes les instàncies muntades.
  • Semàntica POSIX: permisos, propietaris, enllaços. Per a l'aplicació és un directori normal.

Classes d'emmagatzematge

Classe Descripció Cost relatiu Quan es fa servir
Standard Dades replicades en diverses AZ Dades actives que han de sobreviure a la caiguda d'una AZ
Standard-IA Accés infreqüent, multi-AZ ~0,15× + cost per accés Fitxers de més de 30 dies sense obrir
One Zone Una sola AZ ~0,53× Dades reproduïbles, entorns de desenvolupament
One Zone-IA Una AZ, accés infreqüent ~0,08× + cost per accés Arxiu barat no crític

La gestió del cicle de vida és automàtica: es configura "mou a IA el que porti 30 dies sense tocar-se" i EFS ho fa sol. Per al catàleg de MercadoFresco encaixa perfectament, perquè les fotos dels productes de temporada deixen de consultar-se fora de la seva època.

Modes de rendiment i de rendiment de xarxa

Mode de rendiment Latència IOPS Quan
General Purpose Menor Fins a 35.000 Per defecte: servidors web, CMS, directoris personals
Max I/O Major Pràcticament il·limitades Centenars d'instàncies en paral·lel, anàlisi massiva
Mode de rendiment de xarxa Com funciona Quan
Elastic (recomanat) Escala automàticament segons la demanda, es paga per ús Càrregues variables: el cas de MercadoFresco
Bursting El rendiment depèn de la mida emmagatzemada, amb crèdits Sistemes grans amb càrrega proporcional
Provisioned Es contracta un rendiment fix independent de la mida Poques dades però molt trànsit

A la pràctica: General Purpose + Elastic llevat que mesuris que no t'arriba.

Muntar EFS a les instàncies de la botiga

# 1. Crear el sistema de fitxers
EFS_ID=$(aws efs create-file-system \
  --performance-mode generalPurpose \
  --throughput-mode elastic \
  --encrypted \
  --tags Key=Name,Value=efs-mercadofresco-fotos \
         Key=Proyecto,Value=mercadofresco \
         Key=Entorno,Value=desarrollo \
         Key=Componente,Value=catalogo \
         Key=Propietario,Value=luis \
         Key=CentroCoste,Value=operaciones \
  --query 'FileSystemId' --output text \
  --profile mercadofresco-dev --region eu-west-1)

echo "EFS creat: $EFS_ID"

# 2. Un objectiu de muntatge PER SUBXARXA (un per AZ). Sense això, les instàncies
#    d'aquella AZ no poden arribar al sistema de fitxers.
aws efs create-mount-target --file-system-id "$EFS_ID" \
  --subnet-id subnet-aaa11111 --security-groups sg-efs-mercadofresco \
  --profile mercadofresco-dev --region eu-west-1

aws efs create-mount-target --file-system-id "$EFS_ID" \
  --subnet-id subnet-bbb22222 --security-groups sg-efs-mercadofresco \
  --profile mercadofresco-dev --region eu-west-1

El grup de seguretat sg-efs-mercadofresco ha de permetre el port 2049 (NFS) des del grup de seguretat de les instàncies de la botiga. És la fallada número u en muntar EFS i s'explica a fons a la lliçó 03-02.

Dins de la instància:

# Instal·lar el client recomanat per AWS (gestiona el xifratge en trànsit i els reintents)
sudo dnf install -y amazon-efs-utils

sudo mkdir -p /var/www/fotos-compartidas

# Muntar amb xifratge en trànsit (-o tls)
sudo mount -t efs -o tls "$EFS_ID":/ /var/www/fotos-compartidas

# Permanent a /etc/fstab
echo "$EFS_ID:/ /var/www/fotos-compartidas efs _netdev,tls,noresvport 0 0" \
  | sudo tee -a /etc/fstab

sudo mount -a
df -h /var/www/fotos-compartidas
# Filesystem      Size  Used Avail Use% Mounted on
# 127.0.0.1:/     8.0E  0    8.0E   0% /var/www/fotos-compartidas

Aquesta mida de "8.0E" (8 exabytes) és la manera que té NFS de dir "il·limitat": no hi ha mida que provisionar.

La línia corresponent aniria al user data de la plantilla de llançament que vam crear a 02-01, perquè cada instància nova de l'ASG munti les fotos automàticament en arrencar. Amb això, el diagrama del principi deixa de tenir el problema:

flowchart TD
    subgraph AZ1["eu-west-1a"]
        I1["tienda-01"]
        I2["tienda-02"]
    end
    subgraph AZ2["eu-west-1b"]
        I3["tienda-03"]
        I4["tienda-04"]
    end
    EFS["EFS efs-mercadofresco-fotos<br/>/var/www/fotos-compartidas<br/>regional, elastic"]
    I1 --> EFS
    I2 --> EFS
    I3 --> EFS
    I4 --> EFS

Avís de cost i honestedat tècnica. EFS resol el problema sense tocar el codi de MercadoFresco, i per això és la resposta correcta quan migres una aplicació heretada amb pressa. Però per servir fotos de producte a navegadors és car (≈3,4× EBS, ≈13× S3 Standard), continua consumint CPU i amplada de banda de les instàncies, i no aprofita cap xarxa de distribució. A la lliçó 02-03 mourem /var/www/fotos a S3, que és la decisió definitiva de MercadoFresco, i a 03-04 hi posarem CloudFront al davant.

Taula final: EBS, EFS, instance store i S3

EBS EFS Instance store S3
Model Blocs Fitxers (NFS) Blocs Objectes
Abast Una AZ Regional (multi-AZ) Un host físic Regional, multi-AZ
Instàncies simultànies 1 (multi-attach a io2: fins a 16) Milers 1 N/A (accés HTTPS)
Persisteix en terminar Sí (configurable) No
Capacitat Provisionada, fins a 16 TiB Elàstica, il·limitada Fixa segons el tipus Il·limitada
Es factura per GB provisionats GB emmagatzemats Inclòs a la instància GB emmagatzemats + peticions + sortida
Cost orientatiu GB-mes 0,088 USD (gp3) 0,30 USD (Standard) 0 USD 0,023 USD (Standard)
Latència < 1 ms Pocs ms La més baixa Desenes de ms
Còpies de seguretat Instantànies + DLM AWS Backup, replicació Cap Versionat + replicació
Cas a MercadoFresco Disc de sistema, dades de la base de dades Compartir fitxers entre instàncies sense tocar el codi No es fa servir Fotos de producte, còpies, fitxers estàtics (02-03)

Errors Habituals i Consells

  • Crear el volum en una AZ diferent de la de la instància. L'attach-volume fallarà. Consulta sempre Placement.AvailabilityZone de la instància abans de crear el disc.
  • Oblidar /etc/fstab i descobrir després d'un reinici que la botiga serveix un directori buit. I a l'inrevés: posar una línia malament a fstab sense nofail i deixar la instància sense arrencar. Executa sudo mount -a abans de cada reinici.
  • Ampliar el volum a AWS i no estendre el sistema de fitxers. df -h no canvia i sembla que l'ampliació no ha funcionat. Falten growpart i/o xfs_growfs/resize2fs.
  • Creure que es pot reduir un volum. No es pot. Provisiona amb criteri i amplia quan calgui.
  • Volums orfes. En terminar instàncies queden volums en estat available que es continuen pagant i que ningú no mira. Revisa-ho cada mes:
    aws ec2 describe-volumes --filters Name=status,Values=available \\
      --query 'Volumes[].{ID:VolumeId,GB:Size,Creat:CreateTime}' --output table \\
      --profile mercadofresco-dev --region eu-west-1
    
  • Instantànies que s'acumulen per sempre. Centenars d'instantànies manuals sense política de retenció són un degoteig constant a la factura. Per això tot ha de passar per DLM.
  • Confiar en una còpia que no s'ha restaurat mai. Prova la restauració cada trimestre.
  • Continuar fent servir gp2. Migrar a gp3 és gratis, en calent i més barat.
  • Muntar EFS sense obrir el port 2049. El mount es queda penjat sense missatge clar. Revisa el grup de seguretat de l'EFS.
  • Fer servir EFS per a tot per comoditat. És l'opció cara. Fes-lo servir quan necessitis semàntica POSIX compartida; per a fitxers que se serveixen per HTTP, S3.
  • No xifrar des del principi. Costa el mateix i no es pot afegir després sense recrear el volum. Activa enable-ebs-encryption-by-default a la regió i oblida-te'n.

Exercicis

Exercici 1: triar el volum i calcular el cost

La base de dades de comandes de MercadoFresco necessita 200 GiB d'espai i, mesurat durant el pic dels divendres, 5.000 IOPS sostingudes amb un rendiment de 200 MB/s.

  1. Quin tipus de volum triaries i amb quina configuració exacta?
  2. Calcula el cost mensual aproximat amb els preus de la taula (0,088 USD/GB-mes, 0,006 USD per IOPS extra, 0,048 USD per MB/s extra).
  3. Quant costaria el mateix amb gp2? I per què gp2 obligaria a més a una altra decisió?

Exercici 2: dissenyar la política de còpies completa

La Marta vol una política de còpies que compleixi aquests requisits de negoci:

  • Còpia cada 12 hores de tots els volums de producció, conservant 14 dies.
  • Còpia mensual conservada 12 mesos i replicada a eu-central-1.
  • Els volums de desenvolupament només necessiten còpia diària amb 3 dies de retenció.
  • Les còpies han de poder imputar-se al centre de cost correcte a la factura.

Explica com estructuraries les polítiques de DLM i quines etiquetes fan possible cada selecció.

Exercici 3: decidir l'emmagatzematge per a quatre casos

Per a cada situació de MercadoFresco, tria entre EBS, EFS, instance store o S3, i justifica-ho en dues frases:

  • A) El disc d'arrencada de les instàncies de la botiga.
  • B) Un directori /var/www/uploads on els clients pugen fotos d'incidències amb la seva comanda, i que les 4 instàncies de l'ASG han de veure per igual, sense poder tocar el codi PHP.
  • C) Els fitxers temporals del procés nocturn que recomprimeix 40.000 fotos del catàleg.
  • D) Les 40.000 fotos del catàleg servides als navegadors dels clients.

Solucions

Solució 1.

  1. gp3, 200 GiB, amb 5.000 IOPS i 200 MB/s provisionats. No cal io2: el límit de gp3 és 16.000 IOPS i 1.000 MB/s, molt per sobre del que es demana, i io2 és força més car. Un detall addicional: cal comprovar que la instància admet aquest rendiment cap a EBS (un t3.micro no; caldria un tipus optimitzat per a EBS de mida adequada).

  2. Cost gp3:

    Emmagatzematge: 200 GB × 0,088          = 17,60 USD
    IOPS extra:     (5.000 − 3.000) × 0,006 = 12,00 USD
    Rendiment extra: (200 − 125) × 0,048    =  3,60 USD
    ------------------------------------------------------
    Total                                    ≈ 33,20 USD/mes
    
  3. Amb gp2, el rendiment va lligat a la mida a raó de 3 IOPS/GiB, així que per a 5.000 IOPS caldrien 1.667 GiB:

    1.667 GB × 0,11 ≈ 183 USD/mes
    

    Més de 5 vegades el cost, i amb la decisió forçada de provisionar 1.667 GiB per fer-ne servir 200: pagues 1.467 GiB d'espai buit només per comprar velocitat. Aquest és l'argument definitiu per no fer servir gp2 en res nou.

Solució 2.

Es creen tres polítiques de DLM, totes seleccionant per etiquetes, que és el que fa que funcioni sense manteniment:

Política TargetTags Programació Retenció Còpia entre regions
produccion-12h Proyecto=mercadofresco + Entorno=produccion cron(0 */12 * * ? *) 28 instantànies (= 14 dies a 2/dia) No
produccion-mensual Proyecto=mercadofresco + Entorno=produccion cron(0 4 1 * ? *) (dia 1 a les 04:00) 12 Sí, a eu-central-1, xifrada, 12 mesos
desarrollo-diaria Proyecto=mercadofresco + Entorno=desarrollo cron(0 2 * * ? *) 3 No

Claus del disseny:

  • TargetTags amb dues etiquetes actua com un I lògic: només hi entren els volums que porten totes dues. Per això l'esquema d'etiquetatge obligatori del projecte és el que fa viable l'automatització: un volum nou ben etiquetat queda protegit sense que ningú hi intervingui.
  • CopyTags: true propaga CentroCoste, Componente i Propietario a cada instantània, amb la qual cosa el cost de les còpies apareix correctament repartit a Cost Explorer (lliçó 11-03).
  • La retenció s'expressa en nombre d'instantànies, no en dies: cal traduir la freqüència. A 2 còpies diàries, 14 dies són 28 instantànies.
  • Es poden agrupar les dues primeres en una sola política amb dos Schedules (DLM n'admet fins a quatre per política); separar-les és igual de vàlid i més llegible.

Solució 3.

Cas Elecció Justificació
A) Disc d'arrencada EBS gp3 El volum arrel ha de ser un dispositiu de blocs SSD i ha de persistir mentre la instància existeixi. És l'únic candidat possible.
B) /var/www/uploads compartit EFS Diverses instàncies en diverses AZ han de llegir i escriure els mateixos fitxers, i la restricció "sense tocar el codi PHP" descarta S3: l'aplicació continuarà fent servir rutes del sistema de fitxers. EBS no serveix perquè no es comparteix entre AZ.
C) Temporals del procés nocturn Instance store (o EBS si el tipus triat no el porta) Són dades reproduïbles i d'usar i llençar: la volatilitat no és un inconvenient, i el disc local dona la màxima velocitat sense cost addicional ni instantànies per gestionar.
D) Fotos del catàleg servides a clients S3 Objectes escrits una vegada i llegits moltes, servits per HTTPS. És unes 13 vegades més barat que EFS, té durabilitat d'onze nous, escala sense límit i es posa darrere de CloudFront. Ho veurem a 02-03 i 03-04.

Conclusió

Has après a distingir els tres models d'emmagatzematge —blocs, fitxers i objectes— i a reconèixer per la forma del problema quin toca en cada cas: si el programari espera un disc, blocs; si diversos servidors comparteixen fitxers amb rutes POSIX, fitxers; si la dada és un fitxer complet servit per HTTP, objectes.

D'EBS saps que un volum viu en una sola AZ, que es paga per GB provisionat i no fet servir, i que s'amplia però mai no es redueix. Saps triar entre gp3, gp2, io2, st1 i sc1, i has calculat amb números per què gp3 és l'opció per defecte: en desacoblar mida, IOPS i rendiment, evita l'absurd de gp2 de comprar 1.667 GiB per aconseguir 5.000 IOPS. Has recorregut el cicle complet d'un disc de dades: create-volume, attach-volume, lsblk, mkfs, mount, la línia d'/etc/fstab per UUID i amb nofail, i l'ampliació en calent en les seves dues meitats, modify-volume a AWS i xfs_growfs dins de la màquina.

Has entès les instantànies de veritat: incrementals en el cobrament però completes en la restauració, segures d'esborrar en qualsevol punt de la cadena, capaces de moure dades entre AZ i entre regions. I amb Data Lifecycle Manager has convertit aquesta capacitat en un pla de còpies que s'executa sol, selecciona per etiquetes i reté el just: set diàries, quatre setmanals replicades a eu-central-1. Amb això, la part de disc del problema 2 de MercadoFresco —les còpies que depenien que algú se'n recordés— està tancada, amb l'advertiment que una còpia sense prova de restauració no compta com a còpia.

Coneixes a més el xifratge transparent d'EBS i per què s'activa per defecte a la regió, i saps què és l'instance store i per què la seva velocitat no compensa la seva volatilitat llevat que sigui per a dades prescindibles. Finalment, EFS t'ha donat la primera solució real al problema que va deixar obert l'Auto Scaling: un sistema de fitxers NFS regional, elàstic i muntat alhora a les quatre instàncies del divendres, amb les seves classes d'emmagatzematge i els seus modes de rendiment.

Però tanquem amb una decisió pendent i deliberada. EFS resol el problema de les fotos sense tocar el codi, i per això és la resposta correcta amb pressa. No és la resposta correcta a llarg termini: és unes tretze vegades més car que l'alternativa, obliga que el trànsit d'imatges passi per les instàncies i no aprofita l'escala global d'AWS. A la lliçó 02-03, «Amazon S3», migrarem de veritat /var/www/fotos amb aws s3 sync, coneixerem els onze nous de durabilitat, les classes d'emmagatzematge amb regles de cicle de vida que abarateixen les fotos antigues del catàleg, el versionat que protegeix dels esborrats accidentals, les URL signades prèviament amb què la Sara descarregarà els seus informes sense credencials, i els esdeveniments que més endavant dispararan una funció Lambda per generar les miniatures.

Curs d'AWS

Mòdul 1: Introducció a AWS

Mòdul 2: Serveis principals d'AWS

Mòdul 3: Xarxes i lliurament de contingut

Mòdul 4: Seguretat i identitat

Mòdul 5: Monitoratge i gestió

Mòdul 6: Bases de dades

Mòdul 7: Integració d'aplicacions

Mòdul 8: Eines per a desenvolupadors

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

Mòdul 10: Contenidors a AWS

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

© Copyright 2026. Tots els drets reservats