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
- Los tres modelos de almacenamiento: bloques, archivos y objetos
- Qué es un volumen EBS y qué garantiza
- Tipos de volumen EBS y cómo elegir
- Dimensionar gp3: IOPS y rendimiento independientes del tamaño
- Crear, adjuntar, formatear y montar un volumen
- Ampliar un volumen en caliente, sin parar la tienda
- Snapshots: qué son, cómo se cobran y cómo se restauran
- Data Lifecycle Manager: el fin del problema 2
- Cifrado de volúmenes
- Instance store: rápido, local y efímero
- Amazon EFS: un sistema de archivos para varias instancias
- Montar EFS en las instancias de la tienda
- 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 | Sí | 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-1ano se puede conectar a una instancia deeu-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:
- 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.
- 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.
- 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.
- 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-1Dimensionar 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-1Un 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"--encryptedactiva 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
Componenteescatalogo, 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-1Un 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/fotosPaso 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/fotosLa opción
nofailno 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 siempresudo mount -aantes de reiniciar para comprobar que la línea defstabes 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í: 50GRestricciones 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:
- 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.
- 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.
- 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-1Copiar 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-1Y 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-1Qué hace exactamente esta política, línea a línea:
TargetTags: se aplica a todos los volúmenes etiquetadosProyecto=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-1cifrado. 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 suCentroCoste.
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:
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 | Sí | No |
| Coste | Aparte, por GB-mes | Incluido en el precio de la instancia |
| Se puede desconectar | Sí | 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 | 1× | 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-1El 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-compartidasEse 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/fotosa 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) | Sí | No | Sí |
| 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-volumefallará. Consulta siemprePlacement.AvailabilityZonede la instancia antes de crear el disco. - Olvidar
/etc/fstaby descubrir tras un reinicio que la tienda sirve un directorio vacío. Y al revés: poner una línea mal enfstabsinnofaily dejar la instancia sin arrancar. Ejecutasudo mount -aantes de cada reinicio. - Ampliar el volumen en AWS y no extender el sistema de archivos.
df -hno cambia y parece que la ampliación no ha funcionado. Faltangrowparty/oxfs_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
availableque 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
mountse 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-defaulten 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.
- ¿Qué tipo de volumen elegirías y con qué configuración exacta?
- 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).
- ¿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/uploadsdonde 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.
-
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.microno; haría falta un tipo optimizado para EBS de tamaño adecuado). -
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 -
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/mesMá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:
TargetTagscon 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: truepropagaCentroCoste,ComponenteyPropietarioa 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
- ¿Qué es AWS?
- Configuración de tu cuenta de AWS
- Infraestructura global de AWS
- Consola de administración de AWS
- AWS CLI y SDKs
Módulo 2: Servicios principales de AWS
Módulo 3: Redes y entrega de contenido
- Amazon VPC
- Grupos de seguridad y listas de control de acceso
- Elastic Load Balancing
- Amazon CloudFront
- Route 53
Módulo 4: Seguridad e identidad
- AWS Identity and Access Management (IAM)
- AWS Key Management Service (KMS)
- Secrets Manager y Parameter Store
- AWS Shield
- AWS WAF
Módulo 5: Monitorización y gestión
- Amazon CloudWatch
- AWS X-Ray y trazabilidad distribuida
- AWS CloudTrail
- AWS Config
- AWS Trusted Advisor
Módulo 6: Bases de datos
- Cómo elegir la base de datos adecuada
- Amazon DynamoDB
- Amazon Aurora
- Amazon Redshift
- Amazon ElastiCache
Módulo 7: Integración de aplicaciones
- Amazon SQS
- Amazon SNS
- Amazon EventBridge
- AWS Step Functions
- Patrones de integración: idempotencia, reintentos y colas de mensajes fallidos
