# Tema 2 · 5 · Almacenamiento de archivos (EFS): una carpeta compartida por dos máquinas Presentación del Tema 2: «Laboratorio almacenamiento de archivos» (1 y 2) y «Laboratorio de archivos · paso a paso». Duración: unos 45 minutos. Coste: céntimos si borras todo el mismo día (el EFS y las instancias siguen facturando mientras existan). > **Etiquetas de lo que creas.** Todo recurso que crees a mano (máquina, volumen, bucket, base de datos, tabla, función...) ponle estas etiquetas, al crearlo (apartado *Tags* / *Etiquetas*) o después desde su pestaña de etiquetas: `curso` = `G214`, `universidad` = `CUNEF` y `actividad` = `02.05-EFSCarpetaCompartida`. Si algún día hay que borrar recursos a mano, se localizan todos de golpe con `aws resourcegroupstaggingapi get-resources --region eu-north-1 --tag-filters Key=actividad,Values=02.05-EFSCarpetaCompartida`. Más detalle (cómo etiquetar con la CLI, cómo buscar y qué hacer en una emergencia): [README principal](../README.md), sección «Etiquetas». ## Qué vas a hacer Crear un sistema de archivos compartido (EFS), montarlo en **dos máquinas a la vez** y comprobar lo que con EBS era imposible: lo que escribe una máquina lo ve la otra al instante. Después pruebas permisos, mides el rendimiento frente al disco raíz y ves qué pasa cuando el cortafuegos corta el acceso. ``` VM 1 (t3.small) VM 2 (t3.small) ~/efs ◄──────── EFS (efs-compartido) ────────► ~/efs puerto 2049 (NFS), Security Group propio ``` Esta carpeta **no tiene ficheros**. Guía con capturas: `Anexo - Tema 2 - Guías de creación de recursos.docx` (apartado *Almacenamiento de archivos*). ## Qué se crea en AWS | Recurso | Detalle | |---|---| | 2 instancias EC2 | `vm-efs` (renómbralas `1` y `2`), Amazon Linux 2023, `t3.small` | | Security Group | SSH (22) **solo desde tu IP** y NFS (2049) con origen **el propio grupo** | | Sistema de archivos EFS | `efs-compartido`, con los *mount targets* en ese mismo Security Group | ## Antes de empezar - [ ] Cuenta de AWS y región **eu-north-1**. - [ ] Sabes entrar en una máquina Linux (botón *Connect* o `ssh`): [`01.01-CrearYConectarVM.md`](../tema1/01.01-CrearYConectarVM.md). Con el SSH solo desde *My IP* el botón *Connect* **no conecta**: añade una segunda regla SSH con origen la lista de prefijos `com.amazonaws.eu-north-1.ec2-instance-connect` (o usa `ssh` con la llave). - [ ] Qué es un Security Group (Anexo Tema 2, apartado *Security Groups*). ## Paso a paso ### Paso 1 · Crea las dos instancias EC2 → **Launch instance**: nombre `vm-efs`, AMI **Amazon Linux 2023**, tipo `t3.small`, par de claves existente o nuevo, VPC y subred por defecto. En *Network settings* crea un Security Group nuevo con **SSH desde My IP** (no *Anywhere*) y anota su nombre (la consola lo llama `launch-wizard-N`). En el resumen, sube el **número de instancias a 2** y *Launch*. Renombra las dos máquinas como `1` y `2` para distinguirlas (lápiz junto al nombre). ### Paso 2 · Abre el puerto NFS en el Security Group EC2 → **Network & Security → Security Groups** → el grupo de tus máquinas → *Inbound rules* → **Edit inbound rules** → **Add rule**: tipo **NFS** (TCP 2049) y, en *Source*, **Custom** y selecciona **el propio grupo** (`sg-…`). Guarda. | Tipo | Protocolo | Origen | |---|---|---| | NFS | TCP 2049 | Custom: el propio grupo (`sg-…`) | | SSH | TCP 22 | My IP (tu IP, /32) | **Nunca `0.0.0.0/0` («Anywhere»)**: abriría el puerto a todo Internet. **Qué verás:** en *Inbound rules* dos reglas, ninguna con `0.0.0.0/0`. ### Paso 3 · Crea el EFS Amazon EFS → **Create file system** → nombre `efs-compartido`, VPC por defecto (la misma que las instancias) → *Create*. Espera unos minutos hasta que los mount targets estén *Available*. Aunque aparezca disponible, **el nombre DNS puede tardar hasta 5-7 minutos** en resolverse: si al montar sale `Failed to resolve`, espera y repite. ### Paso 4 · Cambia el Security Group de los mount targets EFS → `efs-compartido` → pestaña **Network** → **Manage**: en cada mount target quita el grupo `default` y pon **el mismo Security Group de las dos instancias** → *Save*. Sin esto el tráfico NFS no llega al EFS. **Qué verás:** en *Network*, todos los mount targets con tu Security Group. ### Paso 5 · Instala el cliente y monta (en las DOS máquinas) Conéctate a cada máquina y, **desde tu carpeta personal**: ```bash cd ~ mkdir -p efs sudo dnf install -y amazon-efs-utils ``` Después, en la consola: EFS → `efs-compartido` → **Attach** → copia el comando *Using the EFS mount helper* (*Mount via DNS*) y pégalo. Es de esta forma, con **tu** ID de EFS: ```bash sudo mount -t efs -o tls fs-0123456789abcdef0:/ efs df -h | grep efs ``` El comando termina en `efs`, una ruta relativa: ejecútalo desde `~` para que monte la carpeta que acabas de crear. Monta con el tipo `efs`, no con `nfs` a mano: el cliente resuelve el DNS y negocia el cifrado en tránsito. **Qué verás:** `df -h | grep efs` muestra `127.0.0.1:/ 8.0E 0 8.0E 0% /home/ec2-user/efs` (EFS no tiene tamaño fijo; `8,0E` es normal). **No sigas hasta ver esa línea.** Si falla **al instante** con `Failed to resolve "fs-...efs..."`: el ID está mal copiado o el EFS es reciente (espera hasta 5-7 minutos y repite). Si **se queda colgado** (`Mount attempt 1/3 failed due to timeout`): es el puerto 2049 del Security Group o los mount targets con otro grupo; `Ctrl+C` no siempre lo corta: corrige el grupo desde otra pestaña y se libera solo. ### Paso 6 · Escribe en una máquina y lee en la otra ```bash # VM 1 echo "prueba" | sudo tee ~/efs/fichero.txt # VM 2 ls -l ~/efs cat ~/efs/fichero.txt ``` **Qué verás:** en la VM 2 aparece `fichero.txt` con `prueba`. Esta es la prueba que cierra el tema: **con EBS esto era imposible** (un disco solo lo ve una máquina). ### Paso 7 · Permisos ```bash sudo chown ec2-user:ec2-user ~/efs # la raíz del EFS es de root; esto lo cambia (basta en una VM: es compartido) mkdir ~/efs/carpeta && chmod 750 ~/efs/carpeta ls -ld ~/efs/carpeta # desde las DOS máquinas ``` **Qué verás:** los mismos permisos y propietario en las dos. EFS guarda el uid/gid **numérico** (`ec2-user` es el 1000 en las dos máquinas). ### Paso 8 · Mide el rendimiento Mide en `~`, **no en `/tmp`** (en Amazon Linux 2023 `/tmp` está en memoria): ```bash sudo dd if=/dev/zero of=~/efs/test bs=1M count=512 oflag=direct sudo dd if=/dev/zero of=~/test bs=1M count=512 oflag=direct ``` **Qué verás:** el EFS ronda los **35-40 MB/s** y el disco raíz unos **170 MB/s** (cifras de las pruebas; las tuyas variarán). El EFS es más lento pero compartido. ### Paso 9 · Corta el acceso y mira qué pasa 1. En el Security Group, **quita la regla NFS (2049)**. 2. Ejecuta: ```bash timeout 20 ls ~/efs; echo $? ``` **Qué verás:** `124`: la orden se cuelga (no da error, espera). **No desmontes con la regla quitada** (`umount` se bloquearía). 3. **Restaura la regla** y repite: responde al instante. ## Errores frecuentes | Qué ves | Causa | Solución | |---|---|---| | `Failed to resolve "fs-...efs..."` al montar | ID mal copiado, o EFS recién creado (DNS tarda hasta 5-7 minutos) | Comprueba el ID en EFS → File systems; espera y repite el *Attach* | | `mount` se queda colgado / `timeout after 15 sec` | Puerto 2049 cerrado o mount targets con el grupo `default` | Regla NFS con origen el propio grupo y mount targets con ese grupo (paso 4) | | `Permission denied` al escribir sin `sudo` | La raíz del EFS es de root | `sudo chown ec2-user:ec2-user ~/efs` | | `df` muestra 0 usado aunque hayas escrito | EFS no refleja lo escrito en `df` | Para el consumo real, mira *Monitoring* en la consola de EFS | | Botón *Connect* no conecta | SSH solo desde *My IP* | Regla SSH con la lista de prefijos `com.amazonaws.eu-north-1.ec2-instance-connect`, o usa `ssh` con la llave | ## Limpieza (en este orden) 1. En las dos máquinas: `sudo rm ~/test ~/efs/test` (512 MiB) y `sudo umount ~/efs`. Hazlo **antes** de tocar el Security Group o borrar el EFS: con el EFS montado y sin acceso, `umount` se bloquea. 2. Termina las dos instancias. 3. EFS → File systems → `efs-compartido` → **Delete** y escribe su ID (se borran también los mount targets). 4. Borra el Security Group (si da error de dependencia, espera un par de minutos a que desaparezcan los mount targets y reintenta) y el par de claves. ## Cómo sabes que has terminado - [ ] `df -h` muestra `127.0.0.1:/ 8.0E` en las dos máquinas. - [ ] Un fichero creado en la VM 1 se ve en la VM 2. - [ ] Viste `124` con la regla 2049 quitada y respuesta inmediata al restaurarla. - [ ] Sabes explicar por qué el EFS es más lento que el disco raíz y qué ventaja tiene (es compartido). - [ ] Todo borrado: instancias, EFS, Security Group. Anterior: [`02.04-EBSSnapshotDetachAmpliar.md`](02.04-EBSSnapshotDetachAmpliar.md) · Siguiente: [`02.06-laboratoriocafeteria`](02.06-laboratoriocafeteria/README.md)