La lección anterior terminó con una pregunta incómoda: si el grupo de Auto Scaling crea y destruye instancias de la tienda de MercadoFresco según el tráfico del viernes, ¿dónde viven los datos? Las fotos de producto que hoy están en /var/www/fotos del servidor de la oficina no pueden vivir dentro de un disco que desaparece cuando el ASG decide que sobra una máquina.

Esta lección responde a esa pregunta desde dos ángulos complementarios. Amazon EBS (Elastic Block Store) da a cada instancia discos que sobreviven a la máquina, se amplían en caliente y se copian solos. Amazon EFS (Elastic File System) da a varias instancias a la vez un sistema de archivos compartido, que es exactamente lo que el Auto Scaling necesita para que las cuatro máquinas del viernes vean las mismas fotos.

Y por el camino cerramos el problema 2 de MercadoFresco: las copias de seguridad no fiables. El disco duro externo que Marta conecta "cuando se acuerda" se sustituye por snapshots incrementales automatizados con Data Lifecycle Manager, con retención definida y copia a otra región.

Contenido

  1. Los tres modelos de almacenamiento: bloques, archivos y objetos
  2. Qué es un volumen EBS y qué garantiza
  3. Tipos de volumen EBS y cómo elegir
  4. Dimensionar gp3: IOPS y rendimiento independientes del tamaño
  5. Crear, adjuntar, formatear y montar un volumen
  6. Ampliar un volumen en caliente, sin parar la tienda
  7. Snapshots: qué son, cómo se cobran y cómo se restauran
  8. Data Lifecycle Manager: el fin del problema 2
  9. Cifrado de volúmenes
  10. Instance store: rápido, local y efímero
  11. Amazon EFS: un sistema de archivos para varias instancias
  12. Montar EFS en las instancias de la tienda
  13. Tabla final: EBS, EFS, instance store y S3

Los tres modelos de almacenamiento: bloques, archivos y objetos

Antes de tocar ningún servicio hay que tener clara una distinción que ordena todo el capítulo del almacenamiento en la nube. No son tres productos que compiten: son tres modelos distintos de guardar datos, y cada uno resuelve un problema diferente.

Bloques (EBS) Archivos (EFS) Objetos (S3)
Unidad Bloque de disco sin formato Fichero dentro de una jerarquía Objeto con clave y metadatos
Cómo se accede Como un disco duro: /dev/xvdf Protocolo de red NFS: mount API HTTPS: GET/PUT
Quién pone el sistema de archivos Tú (mkfs) El servicio No hay sistema de archivos
Modificar parte de un dato Sí, bloque a bloque No: se reemplaza el objeto entero
Concurrencia 1 instancia (o pocas, con multi-attach) Miles de instancias a la vez Ilimitada, por HTTPS
Capacidad Fija, la que provisionas Elástica automática Prácticamente ilimitada
Latencia típica Sub-milisegundo Bajos milisegundos Decenas de milisegundos
Coste relativo por GB Medio Alto (≈3× EBS) Bajo
Caso claro Disco de sistema, base de datos Directorio compartido entre servidores Fotos, copias, ficheros estáticos

La regla mental que conviene fijar:

  • Bloques: cuando el software espera un disco. Un sistema operativo, PostgreSQL, un motor de base de datos. Nada de esto sabe hablar HTTP.
  • Archivos: cuando varios servidores deben compartir los mismos ficheros y el software espera rutas del sistema de ficheros (/var/www/fotos). Es la vía de mínima modificación cuando migras una aplicación heredada.
  • Objetos: cuando el dato es un fichero completo que se escribe una vez y se lee muchas. Es el más barato, el más duradero y el más escalable, pero exige que la aplicación use su API.

Para MercadoFresco, las fotos de producto podrían ir a EFS (sin tocar el código) o a S3 (cambiando el código, más barato y mejor a largo plazo). Veremos EFS aquí y S3 en la lección 02-03, donde quedará claro por qué esa es la decisión definitiva.

Qué es un volumen EBS y qué garantiza

Un volumen EBS es un disco virtual que se conecta por red a una instancia EC2, pero que el sistema operativo ve exactamente como un disco local: aparece en lsblk, se formatea con mkfs y se monta con mount.

Sus propiedades esenciales:

  • Es independiente de la instancia. Si terminas la instancia, el volumen puede sobrevivir (depende del atributo DeleteOnTermination). Puedes desconectarlo y conectarlo a otra máquina.
  • Vive en una sola zona de disponibilidad. Un volumen de eu-west-1a no se puede conectar a una instancia de eu-west-1b. Para moverlo hay que hacer un snapshot y restaurarlo en la otra AZ.
  • Está replicado dentro de su AZ. AWS mantiene varias copias en distintos servidores: un fallo de disco físico no te afecta. Pero un fallo de la AZ completa, sí. Por eso los snapshots importan.
  • Se paga por GB provisionado, no por GB usado. Un volumen de 500 GiB con 3 GiB de datos cuesta como 500 GiB. Este es uno de los gastos ocultos más habituales.
  • Se puede ampliar en caliente, pero no reducir. Dimensiona con cabeza.
flowchart LR
    subgraph AZ1["Zona de disponibilidad eu-west-1a"]
        I1["Instancia<br/>mercadofresco-tienda-01"]
        V1["Volumen EBS raiz<br/>8 GiB gp3"]
        V2["Volumen EBS datos<br/>20 GiB gp3<br/>/var/www/fotos"]
        I1 --- V1
        I1 --- V2
    end
    subgraph AZ2["Zona de disponibilidad eu-west-1b"]
        I2["Instancia<br/>mercadofresco-tienda-02"]
        V3["Volumen EBS raiz<br/>8 GiB gp3"]
        I2 --- V3
    end
    V2 -.->|"snapshot"| S["Snapshots en S3<br/>(regionales, multi-AZ)"]
    S -.->|"restaurar"| V3

Fíjate en el detalle importante del diagrama: mercadofresco-tienda-02 no puede conectarse al volumen de fotos de la otra AZ. Ese límite es precisamente el que empuja hacia EFS o S3.

Tipos de volumen EBS y cómo elegir

Existen dos categorías: SSD, optimizados para operaciones por segundo (IOPS) y acceso aleatorio, y HDD, optimizados para rendimiento secuencial (MB/s) y coste por GB.

Tipo Tecnología IOPS máx. por volumen Rendimiento máx. Coste orientativo (USD/GB-mes, eu-west-1) Caso de uso
gp3 SSD 16.000 1.000 MB/s 0,088 (+ IOPS y MB/s extra aparte) Opción por defecto: sistema, aplicaciones, bases de datos medianas
gp2 SSD 16.000 (ligados al tamaño) 250 MB/s 0,11 Generación anterior; no elegir para nada nuevo
io2 / io2 Block Express SSD 64.000 / 256.000 4.000 MB/s 0,138 + 0,065 por IOPS Bases de datos críticas, IOPS garantizadas, 99,999 % de durabilidad
st1 HDD 500 500 MB/s 0,048 Logs, big data, lectura secuencial masiva
sc1 HDD 250 250 MB/s 0,018 Archivo frío al que se accede pocas veces

Los precios son orientativos y cambian; consúltalos siempre en la calculadora de AWS. Lo que no cambia es el orden de magnitud entre ellos.

Cuatro criterios de decisión:

  1. Empieza siempre por gp3. Es más barato que gp2 en un ~20 % y da 3.000 IOPS de base aunque el volumen sea de 1 GiB.
  2. Sube a io2 solo si has medido que necesitas más de 16.000 IOPS o si el negocio exige la durabilidad de cinco nueves. Es caro.
  3. HDD (st1/sc1) solo para acceso secuencial. Si la carga hace muchas lecturas pequeñas y aleatorias, un HDD dará un rendimiento pésimo aunque el precio por GB sea tentador.
  4. Los HDD no pueden ser volúmenes de arranque. El disco raíz siempre es SSD.

Migrar de gp2 a gp3 es gratis, en caliente y ahorra dinero. Si heredas una cuenta con volúmenes gp2, este es el ahorro más fácil que existe:

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

Dimensionar gp3: IOPS y rendimiento independientes del tamaño

Aquí está la mejora conceptual de gp3 frente a gp2, y merece detenerse porque explica muchas decisiones de arquitectura.

Con gp2, el rendimiento estaba atado al tamaño: 3 IOPS por GiB. Si querías 3.000 IOPS, tenías que provisionar 1.000 GiB, aunque solo usaras 40. Se compraba espacio para comprar velocidad.

Con gp3, los tres parámetros se contratan por separado:

Parámetro Incluido en el precio base Máximo Coste del extra
Tamaño El que provisiones 16 TiB 0,088 USD/GB-mes
IOPS 3.000 16.000 ~0,006 USD por IOPS-mes por encima de 3.000
Rendimiento 125 MB/s 1.000 MB/s ~0,048 USD por MB/s-mes por encima de 125

Comparación para el caso de MercadoFresco, que necesita 100 GiB y 3.000 IOPS:

Opción Configuración Coste mensual aproximado
gp2 1.000 GiB (para llegar a 3.000 IOPS) ~110 USD
gp3 100 GiB + 3.000 IOPS de base ~8,8 USD

Un factor 12 de diferencia por conocer el tipo correcto de volumen. Y si más adelante la base de datos necesitara 6.000 IOPS, se añaden sin tocar el tamaño:

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

Un límite práctico que hay que conocer: la instancia también tiene un techo. Un t3.micro no podrá aprovechar 16.000 IOPS por mucho que las contrates, porque su ancho de banda hacia EBS está limitado. Para cargas de disco intensivas se usan instancias "optimizadas para EBS" de tamaño suficiente. Sirve de poco un volumen rapidísimo colgado de una instancia diminuta.

Crear, adjuntar, formatear y montar un volumen

Vamos a darle a mercadofresco-tienda-01 un disco dedicado de 20 GiB para las fotos de producto, separado del disco de sistema. Separar datos de sistema es una buena práctica: puedes reinstalar la máquina sin tocar los datos, y hacer snapshots solo de lo que importa.

Paso 1: crear el volumen (en la misma AZ que la instancia)

# La AZ debe coincidir EXACTAMENTE con la de la instancia. Si no, no se 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 "Volumen creado: $VOL_ID"
  • --encrypted activa el cifrado en reposo con la clave gestionada por AWS. Cuesta lo mismo que sin cifrar y no se puede añadir después, así que se pone siempre desde el principio.
  • El Componente es catalogo, porque son las fotos de producto, no la tienda en sí. El esquema de etiquetado permite luego imputar el coste al equipo correcto.

Paso 2: adjuntarlo a la instancia

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

Un detalle que despista: pides /dev/sdf pero Amazon Linux con kernel moderno y NVMe lo mostrará como /dev/nvme1n1. El nombre que pides es una etiqueta; el que ves dentro depende del sistema. Por eso nunca se monta por nombre de dispositivo en /etc/fstab, sino por UUID.

Paso 3: formatear y montar (dentro de la instancia)

# Ver los discos disponibles. El nuevo aparece sin punto de montaje.
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 nuevo, vacío

# Comprobar si ya tiene sistema de archivos. Si responde "data", está vacío.
sudo file -s /dev/nvme1n1
# /dev/nvme1n1: data

# Formatear con XFS (el estándar en Amazon Linux; ext4 es igualmente válido).
# ATENCION: mkfs DESTRUYE todo lo que haya en el volumen. Solo en discos nuevos.
sudo mkfs -t xfs /dev/nvme1n1

# Crear el punto de montaje y montar
sudo mkdir -p /var/www/fotos
sudo mount /dev/nvme1n1 /var/www/fotos

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

Paso 4: hacerlo permanente en /etc/fstab

Sin este paso, el montaje se pierde en el siguiente reinicio y la tienda arranca con el directorio de fotos vacío.

# Obtener el UUID del sistema de archivos (estable, a diferencia de /dev/nvme1n1)
sudo blkid /dev/nvme1n1
# /dev/nvme1n1: UUID="a1b2c3d4-e5f6-7890-abcd-ef1234567890" TYPE="xfs"

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

# VERIFICAR SIEMPRE antes de reiniciar. Este comando releé fstab y monta lo que falte.
sudo umount /var/www/fotos
sudo mount -a
df -h /var/www/fotos

La opción nofail no es decorativa. Sin ella, si el volumen no está disponible al arrancar, la instancia se queda bloqueada en el arranque y no podrás entrar ni por SSH. Es una de las formas más frecuentes de "perder" una instancia en EC2. Ejecuta siempre sudo mount -a antes de reiniciar para comprobar que la línea de fstab es correcta.

Ampliar un volumen en caliente, sin parar la tienda

En noviembre, con la campaña de Navidad, las fotos del catálogo llenan los 20 GiB. Ampliar es una operación en dos mitades: primero el volumen en AWS, después el sistema de archivos dentro de la instancia. Si haces solo la primera, df -h seguirá mostrando 20 GiB y pensarás que no ha funcionado.

# Mitad 1: ampliar el volumen en AWS (la instancia sigue en marcha)
aws ec2 modify-volume --volume-id "$VOL_ID" --size 50 \
  --profile mercadofresco-dev --region eu-west-1

# Seguir el progreso de la optimización
aws ec2 describe-volumes-modifications --volume-id "$VOL_ID" \
  --query 'VolumesModifications[].{Estado:ModificationState,Progreso:Progress}' \
  --output table \
  --profile mercadofresco-dev --region eu-west-1
# Mitad 2: dentro de la instancia, extender la partición y el sistema de archivos
lsblk                                  # el disco ya muestra 50G, el sistema de archivos no

# Si el volumen tiene particiones, primero se amplía la partición:
sudo growpart /dev/nvme1n1 1           # (no aplica si formateaste el disco entero, como aquí)

# Extender el sistema de archivos EN CALIENTE, con el volumen montado:
sudo xfs_growfs -d /var/www/fotos      # para XFS
# sudo resize2fs /dev/nvme1n1          # para ext4

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

Restricciones importantes:

  • No se puede reducir un volumen. La única vía es crear uno más pequeño, copiar los datos y eliminar el grande.
  • Entre dos modificaciones del mismo volumen deben pasar al menos 6 horas.
  • La ampliación es transparente para la aplicación: no hace falta parar nginx ni desmontar.

Snapshots: qué son, cómo se cobran y cómo se restauran

Un snapshot es una copia puntual de un volumen guardada en Amazon S3 (en un espacio gestionado por AWS, no en un bucket tuyo). Es la base de las copias de seguridad en EC2 y la respuesta al problema 2 de MercadoFresco.

Tres propiedades que hay que entender bien, porque casi todo el mundo las malinterpreta:

  1. Son incrementales, pero cada uno es completo. El primer snapshot copia todos los bloques usados. El segundo copia solo los bloques que han cambiado desde el primero. Sin embargo, restaurar el segundo devuelve el volumen entero, no un diferencial. AWS gestiona las referencias internamente.
  2. Borrar un snapshot intermedio es seguro. Si borras el snapshot 2, AWS conserva los bloques que el snapshot 3 todavía necesita. Nunca se corrompe una cadena por borrar un eslabón.
  3. Se cobran por GB de datos únicos almacenados (≈0,05 USD/GB-mes), no por el tamaño del volumen. Un volumen de 50 GiB con 8 GiB de datos que apenas cambian genera snapshots muy baratos.
flowchart LR
    S1["Snapshot 1<br/>lunes<br/>8 GiB (completo)"] --> S2["Snapshot 2<br/>martes<br/>+0,3 GiB nuevos"]
    S2 --> S3["Snapshot 3<br/>miercoles<br/>+0,5 GiB nuevos"]
    S3 --> R["Restaurar el snapshot 3<br/>= volumen completo de 8,8 GiB"]
    S1 -.-> C["Coste total facturado:<br/>8 + 0,3 + 0,5 = 8,8 GiB"]

Crear un snapshot

SNAP_ID=$(aws ec2 create-snapshot \
  --volume-id "$VOL_ID" \
  --description "Fotos catalogo MercadoFresco - antes de la campana de Navidad" \
  --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 a que termine (puede tardar minutos la primera vez)
aws ec2 wait snapshot-completed --snapshot-ids "$SNAP_ID" \
  --profile mercadofresco-dev --region eu-west-1
echo "Snapshot $SNAP_ID completado"

Coherencia de los datos. Un snapshot captura lo que hay en el disco, no lo que la aplicación tiene en memoria. Para ficheros estáticos como las fotos es suficiente. Para una base de datos hay que congelar el sistema de archivos o, mucho mejor, usar las copias nativas del motor —que es exactamente lo que hace RDS y veremos en la lección 02-04.

Restaurar

Un snapshot no se restaura sobre el volumen original: crea un volumen nuevo. Este es el mecanismo que permite mover datos entre zonas de disponibilidad, algo que un volumen EBS no puede hacer por sí solo.

# Crear un volumen NUEVO en la OTRA AZ a partir del snapshot
NUEVO_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 otra región (recuperación ante desastres)

# Copiar el snapshot de Irlanda a Fráncfort. Nota: --source-region indica el ORIGEN
# y --region indica el DESTINO donde se ejecuta la copia.
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 snapshots entre regiones tiene coste de transferencia de datos y de almacenamiento en destino, pero es la protección real contra el fallo de una región entera.

Data Lifecycle Manager: el fin del problema 2

Hasta ahora las copias de MercadoFresco eran "Marta conecta el disco externo cuando se acuerda": sin calendario, sin verificación y sin copia fuera de la oficina. Eso es el problema 2. Un snapshot manual como el anterior no lo arregla, porque también depende de que alguien se acuerde.

Amazon Data Lifecycle Manager (DLM) ejecuta snapshots según una política: a qué recursos aplica (seleccionados por etiquetas), con qué frecuencia, cuántos conservar y adónde copiarlos. Aquí se ve por qué el esquema de etiquetado de MercadoFresco no era burocracia: es el mecanismo de selección de la política.

Primero, el rol que DLM necesita para actuar en tu nombre (IAM se detalla en 04-01):

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

Y la política, guardada en 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 "Copias automaticas de volumenes 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é hace exactamente esta política, línea a línea:

  • TargetTags: se aplica a todos los volúmenes etiquetados Proyecto=mercadofresco. Cualquier volumen nuevo que Luis cree con la etiqueta correcta entra automáticamente en el plan de copias, sin que nadie tenga que acordarse. Ese es el cambio cultural.
  • Programación diaria: cron(0 2 * * ? *) = todos los días a las 02:00 UTC. Conserva los últimos 7; al crear el octavo, borra el más antiguo, así que el coste se estabiliza.
  • Programación semanal: domingos a las 03:00 UTC, conserva 4 y copia cada uno a eu-central-1 cifrado. Un mes de historia fuera de la región principal.
  • CopyTags: true: los snapshots heredan las etiquetas del volumen, con lo que el coste de las copias también queda imputado a su CentroCoste.

Con esto, el problema 2 queda resuelto en su parte de disco:

Antes (servidor de la oficina) Ahora (AWS con DLM)
Quién la hace Marta, cuando se acuerda Automático, todos los días a las 02:00
Dónde se guarda Disco externo en el mismo edificio S3 gestionado + copia en otra región
Retención Se sobrescribe 7 diarias + 4 semanales, definido
Verificación Ninguna Estado visible; se prueba restaurando
Tiempo de restauración Horas o días Minutos
Coste El disco externo + el tiempo de Marta Céntimos al mes

Falta un matiz honesto: una copia no probada no es una copia. Marta apunta en el calendario una prueba de restauración trimestral: crear un volumen desde el último snapshot, montarlo en una instancia de pruebas y verificar que las fotos están. La parte de la base de datos de este problema se cerrará en la lección 02-04, con las copias automáticas y el PITR de RDS.

Cifrado de volúmenes

El cifrado de EBS es transparente: se cifran los datos en reposo, los datos en tránsito entre la instancia y el volumen, y todos los snapshots derivados. No hay que cambiar nada en la aplicación y el impacto en rendimiento es despreciable.

Puntos prácticos:

  • No se puede cifrar un volumen existente. El procedimiento es: snapshot → copia del snapshot con --encrypted → crear volumen nuevo desde esa copia → intercambiar.
  • Se puede activar el cifrado por defecto en la región, y es muy recomendable:
aws ec2 enable-ebs-encryption-by-default \
  --profile mercadofresco-dev --region eu-west-1

A partir de ahí, todo volumen nuevo en eu-west-1 nace cifrado aunque nadie lo pida.

  • Las claves las gestiona AWS KMS. Puedes usar la clave gestionada por AWS (aws/ebs, gratis) o una clave propia que te dé control de la rotación y de quién puede descifrar. KMS es la lección 04-02; por ahora basta con saber que el cifrado se activa con una casilla.

Instance store: rápido, local y efímero

Algunas familias de instancias (las que llevan d en el nombre, como m6id.large, y las familias i y d) incluyen discos NVMe físicamente conectados al servidor anfitrión. Es el instance store.

EBS Instance store
Ubicación Red, dentro de la AZ Físicamente en el host
Latencia Sub-milisegundo Aún menor, sin salto de red
Persistencia Sobrevive a parar y terminar Se pierde al parar o terminar
Se pierde también si... Falla el hardware del host
Snapshots No
Coste Aparte, por GB-mes Incluido en el precio de la instancia
Se puede desconectar No

Es efímero por diseño: al parar la instancia, AWS la moverá a otro host físico al arrancarla, y ese host tiene otros discos. Un reinicio (reboot) sí conserva los datos, porque no cambia de host; un stop/start, no.

Usos legítimos: cachés, ficheros temporales, datos intermedios de un proceso de cálculo, scratch de compilación. Para MercadoFresco no aplica hoy, pero conviene reconocerlo para no elegir por error una instancia d pensando que el disco incluido es un ahorro.

Amazon EFS: un sistema de archivos para varias instancias

Volvemos al problema que abrió la lección. El grupo de Auto Scaling levanta 4 instancias el viernes. Cada una tiene su volumen EBS. Si Luis sube una foto de producto nueva a la instancia 1, las otras tres no la ven. Y ninguna instancia de eu-west-1b puede ni siquiera conectarse al volumen de fotos que vive en eu-west-1a.

Amazon EFS resuelve exactamente esto: un sistema de archivos NFS v4.1 gestionado que se monta simultáneamente en miles de instancias, en varias AZ, y que crece y decrece solo.

Sus características diferenciales:

  • Elástico de verdad: no se provisiona tamaño. Pagas por los GB que realmente guardas (≈0,30 USD/GB-mes en Standard, unas 3,4 veces más caro que EBS gp3).
  • Regional: se accede desde cualquier AZ de la región mediante "objetivos de montaje" (mount targets), uno por subred.
  • Compartido: lectura y escritura concurrente desde todas las instancias montadas.
  • Semántica POSIX: permisos, propietarios, enlaces. Para la aplicación es un directorio normal.

Clases de almacenamiento

Clase Descripción Coste relativo Cuándo se usa
Standard Datos replicados en varias AZ Datos activos que deben sobrevivir a la caída de una AZ
Standard-IA Acceso infrecuente, multi-AZ ~0,15× + coste por acceso Ficheros de más de 30 días sin abrir
One Zone Una sola AZ ~0,53× Datos reproducibles, entornos de desarrollo
One Zone-IA Una AZ, acceso infrecuente ~0,08× + coste por acceso Archivo barato no crítico

La gestión del ciclo de vida es automática: se configura "mueve a IA lo que lleve 30 días sin tocarse" y EFS lo hace solo. Para el catálogo de MercadoFresco encaja perfectamente, porque las fotos de los productos de temporada dejan de consultarse fuera de su época.

Modos de rendimiento y de rendimiento de red

Modo de rendimiento Latencia IOPS Cuándo
General Purpose Menor Hasta 35.000 Por defecto: servidores web, CMS, directorios personales
Max I/O Mayor Prácticamente ilimitadas Cientos de instancias en paralelo, análisis masivo
Modo de rendimiento de red Cómo funciona Cuándo
Elastic (recomendado) Escala automáticamente según la demanda, se paga por uso Cargas variables: el caso de MercadoFresco
Bursting El rendimiento depende del tamaño almacenado, con créditos Sistemas grandes con carga proporcional
Provisioned Se contrata un rendimiento fijo independiente del tamaño Pocos datos pero mucho tráfico

En la práctica: General Purpose + Elastic salvo que midas que no te llega.

Montar EFS en las instancias de la tienda

# 1. Crear el sistema de archivos
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 creado: $EFS_ID"

# 2. Un objetivo de montaje POR SUBRED (una por AZ). Sin esto, las instancias
#    de esa AZ no pueden alcanzar el sistema de archivos.
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 grupo de seguridad sg-efs-mercadofresco debe permitir el puerto 2049 (NFS) desde el grupo de seguridad de las instancias de la tienda. Es el fallo número uno al montar EFS y se explica a fondo en la lección 03-02.

Dentro de la instancia:

# Instalar el cliente recomendado por AWS (gestiona el cifrado en tránsito y los reintentos)
sudo dnf install -y amazon-efs-utils

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

# Montar con cifrado en tránsito (-o tls)
sudo mount -t efs -o tls "$EFS_ID":/ /var/www/fotos-compartidas

# Permanente en /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

Ese tamaño de "8.0E" (8 exabytes) es la forma que tiene NFS de decir "ilimitado": no hay tamaño que provisionar.

La línea correspondiente iría en el user data de la plantilla de lanzamiento que creamos en 02-01, para que cada instancia nueva del ASG monte las fotos automáticamente al arrancar. Con eso, el diagrama del principio deja de tener 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, elastico"]
    I1 --> EFS
    I2 --> EFS
    I3 --> EFS
    I4 --> EFS

Aviso de coste y honestidad técnica. EFS resuelve el problema sin tocar el código de MercadoFresco, y por eso es la respuesta correcta cuando migras una aplicación heredada con prisa. Pero para servir fotos de producto a navegadores es caro (≈3,4× EBS, ≈13× S3 Standard), sigue consumiendo CPU y ancho de banda de las instancias, y no aprovecha ninguna red de distribución. En la lección 02-03 moveremos /var/www/fotos a S3, que es la decisión definitiva de MercadoFresco, y en 03-04 pondremos CloudFront delante.

Tabla final: EBS, EFS, instance store y S3

EBS EFS Instance store S3
Modelo Bloques Archivos (NFS) Bloques Objetos
Alcance Una AZ Regional (multi-AZ) Un host físico Regional, multi-AZ
Instancias simultáneas 1 (multi-attach en io2: hasta 16) Miles 1 N/A (acceso HTTPS)
Persiste al terminar Sí (configurable) No
Capacidad Provisionada, hasta 16 TiB Elástica, ilimitada Fija según el tipo Ilimitada
Se factura por GB provisionados GB almacenados Incluido en la instancia GB almacenados + peticiones + salida
Coste orientativo GB-mes 0,088 USD (gp3) 0,30 USD (Standard) 0 USD 0,023 USD (Standard)
Latencia < 1 ms Bajos ms La más baja Decenas de ms
Copias de seguridad Snapshots + DLM AWS Backup, replicación Ninguna Versionado + replicación
Caso en MercadoFresco Disco de sistema, datos de la base de datos Compartir ficheros entre instancias sin tocar el código No se usa Fotos de producto, copias, ficheros estáticos (02-03)

Errores Comunes y Consejos

  • Crear el volumen en una AZ distinta a la de la instancia. El attach-volume fallará. Consulta siempre Placement.AvailabilityZone de la instancia antes de crear el disco.
  • Olvidar /etc/fstab y descubrir tras un reinicio que la tienda sirve un directorio vacío. Y al revés: poner una línea mal en fstab sin nofail y dejar la instancia sin arrancar. Ejecuta sudo mount -a antes de cada reinicio.
  • Ampliar el volumen en AWS y no extender el sistema de archivos. df -h no cambia y parece que la ampliación no ha funcionado. Faltan growpart y/o xfs_growfs/resize2fs.
  • Creer que se puede reducir un volumen. No se puede. Provisiona con criterio y amplía cuando haga falta.
  • Volúmenes huérfanos. Al terminar instancias quedan volúmenes en estado available que se siguen pagando y que nadie mira. Revísalo cada mes:
    aws ec2 describe-volumes --filters Name=status,Values=available \\
      --query 'Volumes[].{ID:VolumeId,GB:Size,Creado:CreateTime}' --output table \\
      --profile mercadofresco-dev --region eu-west-1
    
  • Snapshots que se acumulan para siempre. Cientos de snapshots manuales sin política de retención son un goteo constante en la factura. Por eso todo debe pasar por DLM.
  • Confiar en una copia que nunca se ha restaurado. Prueba la restauración cada trimestre.
  • Seguir usando gp2. Migrar a gp3 es gratis, en caliente y más barato.
  • Montar EFS sin abrir el puerto 2049. El mount se queda colgado sin mensaje claro. Revisa el grupo de seguridad del EFS.
  • Usar EFS para todo por comodidad. Es la opción cara. Úsalo cuando necesites semántica POSIX compartida; para ficheros que se sirven por HTTP, S3.
  • No cifrar desde el principio. Cuesta lo mismo y no se puede añadir después sin recrear el volumen. Activa enable-ebs-encryption-by-default en la región y olvídate.

Ejercicios

Ejercicio 1: elegir el volumen y calcular el coste

La base de datos de pedidos de MercadoFresco necesita 200 GiB de espacio y, medido durante el pico de los viernes, 5.000 IOPS sostenidas con un rendimiento de 200 MB/s.

  1. ¿Qué tipo de volumen elegirías y con qué configuración exacta?
  2. Calcula el coste mensual aproximado con los precios de la tabla (0,088 USD/GB-mes, 0,006 USD por IOPS extra, 0,048 USD por MB/s extra).
  3. ¿Cuánto costaría lo mismo con gp2? ¿Y por qué gp2 obligaría además a otra decisión?

Ejercicio 2: diseñar la política de copias completa

Marta quiere una política de copias que cumpla estos requisitos de negocio:

  • Copia cada 12 horas de todos los volúmenes de producción, conservando 14 días.
  • Copia mensual conservada 12 meses y replicada a eu-central-1.
  • Los volúmenes de desarrollo solo necesitan copia diaria con 3 días de retención.
  • Las copias deben poder imputarse al centro de coste correcto en la factura.

Explica cómo estructurarías las políticas de DLM y qué etiquetas hacen posible cada selección.

Ejercicio 3: decidir el almacenamiento para cuatro casos

Para cada situación de MercadoFresco, elige entre EBS, EFS, instance store o S3, y justifica en dos frases:

  • A) El disco de arranque de las instancias de la tienda.
  • B) Un directorio /var/www/uploads donde los clientes suben fotos de incidencias con su pedido, y que las 4 instancias del ASG deben ver por igual, sin poder tocar el código PHP.
  • C) Los ficheros temporales del proceso nocturno que recomprime 40.000 fotos del catálogo.
  • D) Las 40.000 fotos del catálogo servidas a los navegadores de los clientes.

Soluciones

Solución 1.

  1. gp3, 200 GiB, con 5.000 IOPS y 200 MB/s provisionados. No hace falta io2: el límite de gp3 es 16.000 IOPS y 1.000 MB/s, muy por encima de lo pedido, y io2 es bastante más caro. Un detalle adicional: hay que comprobar que la instancia admite ese rendimiento hacia EBS (un t3.micro no; haría falta un tipo optimizado para EBS de tamaño adecuado).

  2. Coste gp3:

    Almacenamiento: 200 GB × 0,088          = 17,60 USD
    IOPS extra:     (5.000 − 3.000) × 0,006 = 12,00 USD
    Rendimiento extra: (200 − 125) × 0,048  =  3,60 USD
    ------------------------------------------------------
    Total                                    ≈ 33,20 USD/mes
    
  3. Con gp2, el rendimiento va ligado al tamaño a razón de 3 IOPS/GiB, así que para 5.000 IOPS harían falta 1.667 GiB:

    1.667 GB × 0,11 ≈ 183 USD/mes
    

    Más de 5 veces el coste, y con la decisión forzada de provisionar 1.667 GiB para usar 200: pagas 1.467 GiB de espacio vacío solo para comprar velocidad. Este es el argumento definitivo para no usar gp2 en nada nuevo.

Solución 2.

Se crean tres políticas de DLM, todas seleccionando por etiquetas, que es lo que hace que funcione sin mantenimiento:

Política TargetTags Programación Retención Copia entre regiones
produccion-12h Proyecto=mercadofresco + Entorno=produccion cron(0 */12 * * ? *) 28 snapshots (= 14 días a 2/día) No
produccion-mensual Proyecto=mercadofresco + Entorno=produccion cron(0 4 1 * ? *) (día 1 a las 04:00) 12 Sí, a eu-central-1, cifrada, 12 meses
desarrollo-diaria Proyecto=mercadofresco + Entorno=desarrollo cron(0 2 * * ? *) 3 No

Claves del diseño:

  • TargetTags con dos etiquetas actúa como un Y lógico: solo entran los volúmenes que llevan ambas. Por eso el esquema de etiquetado obligatorio del proyecto es lo que hace viable la automatización: un volumen nuevo bien etiquetado queda protegido sin que nadie intervenga.
  • CopyTags: true propaga CentroCoste, Componente y Propietario a cada snapshot, con lo que el coste de las copias aparece correctamente repartido en Cost Explorer (lección 11-03).
  • La retención se expresa en número de snapshots, no en días: hay que traducir la frecuencia. A 2 copias diarias, 14 días son 28 snapshots.
  • Se pueden agrupar las dos primeras en una sola política con dos Schedules (DLM admite hasta cuatro por política); separarlas es igual de válido y más legible.

Solución 3.

Caso Elección Justificación
A) Disco de arranque EBS gp3 El volumen raíz debe ser un dispositivo de bloques SSD y debe persistir mientras la instancia exista. Es el único candidato posible.
B) /var/www/uploads compartido EFS Varias instancias en varias AZ deben leer y escribir los mismos ficheros, y la restricción "sin tocar el código PHP" descarta S3: la aplicación seguirá usando rutas del sistema de archivos. EBS no sirve porque no se comparte entre AZ.
C) Temporales del proceso nocturno Instance store (o EBS si el tipo elegido no lo trae) Son datos reproducibles y de usar y tirar: la volatilidad no es un inconveniente, y el disco local da la máxima velocidad sin coste adicional ni snapshots que gestionar.
D) Fotos del catálogo servidas a clientes S3 Objetos escritos una vez y leídos muchas, servidos por HTTPS. Es unas 13 veces más barato que EFS, tiene durabilidad de 11 nueves, escala sin límite y se pone detrás de CloudFront. Lo veremos en 02-03 y 03-04.

Conclusión

Has aprendido a distinguir los tres modelos de almacenamiento —bloques, archivos y objetos— y a reconocer por la forma del problema cuál toca en cada caso: si el software espera un disco, bloques; si varios servidores comparten ficheros con rutas POSIX, archivos; si el dato es un fichero completo servido por HTTP, objetos.

En EBS sabes que un volumen vive en una sola AZ, que se paga por GB provisionado y no usado, y que se amplía pero nunca se reduce. Sabes elegir entre gp3, gp2, io2, st1 y sc1, y has calculado con números por qué gp3 es la opción por defecto: al desacoplar tamaño, IOPS y rendimiento, evita el absurdo de gp2 de comprar 1.667 GiB para conseguir 5.000 IOPS. Has recorrido el ciclo completo de un disco de datos: create-volume, attach-volume, lsblk, mkfs, mount, la línea de /etc/fstab por UUID y con nofail, y la ampliación en caliente en sus dos mitades, modify-volume en AWS y xfs_growfs dentro de la máquina.

Has entendido los snapshots de verdad: incrementales en el cobro pero completos en la restauración, seguros de borrar en cualquier punto de la cadena, capaces de mover datos entre AZ y entre regiones. Y con Data Lifecycle Manager has convertido esa capacidad en un plan de copias que se ejecuta solo, selecciona por etiquetas y retiene lo justo: siete diarias, cuatro semanales replicadas a eu-central-1. Con eso, la parte de disco del problema 2 de MercadoFresco —las copias que dependían de que alguien se acordara— está cerrada, con la advertencia de que una copia sin prueba de restauración no cuenta como copia.

Conoces además el cifrado transparente de EBS y por qué se activa por defecto en la región, y sabes qué es el instance store y por qué su velocidad no compensa su volatilidad salvo para datos desechables. Por último, EFS te ha dado la primera solución real al problema que dejó abierto el Auto Scaling: un sistema de archivos NFS regional, elástico y montado a la vez en las cuatro instancias del viernes, con sus clases de almacenamiento y sus modos de rendimiento.

Pero cerramos con una decisión pendiente y deliberada. EFS resuelve el problema de las fotos sin tocar el código, y por eso es la respuesta correcta con prisa. No es la respuesta correcta a largo plazo: es unas trece veces más caro que la alternativa, obliga a que el tráfico de imágenes pase por las instancias y no aprovecha la escala global de AWS. En la lección 02-03, «Amazon S3», migraremos de verdad /var/www/fotos con aws s3 sync, conoceremos los once nueves de durabilidad, las clases de almacenamiento con reglas de ciclo de vida que abaratan las fotos antiguas del catálogo, el versionado que protege de los borrados accidentales, las URLs prefirmadas con las que Sara descargará sus informes sin credenciales, y los eventos que más adelante dispararán una función Lambda para generar las miniaturas.

Curso de AWS

Módulo 1: Introducción a AWS

Módulo 2: Servicios principales de AWS

Módulo 3: Redes y entrega de contenido

Módulo 4: Seguridad e identidad

Módulo 5: Monitorización y gestión

Módulo 6: Bases de datos

Módulo 7: Integración de aplicaciones

Módulo 8: Herramientas para desarrolladores

Módulo 9: Infraestructura como código y gobierno de cuentas

Módulo 10: Contenedores en AWS

Módulo 11: Mejores prácticas y gestión de costos

© Copyright 2026. Todos los derechos reservados