AWS EFS en EC2

Veamos como crear una sistema de almacenamiento multimedia escalable en AWS.
¿Para que nos sirve?
Básicamente tendremos almacenamiento centralizado para múltiples instancias EC2 que pudieran estar en diferentes AZ y lograr compartir diferentes tipos de archivos multimedia e de manera eficiente entre diferentes equipos.
Debemos asegurar que la infraestructura tenga alta disponibilidad, escalabilidad y transmisión segura de datos entre los servidores.
Para lograr esto podemos usar AWS EFS que nos ofrece todo esto que hemos mencionado.
Un vistazo a la arquitectura:

Creamos la VPC con 2 o 3 subredes.
He creado esta para la demostración:

Creamos un grupo de Seguridad

Debemos crear un grupo de seguridad permitiendo la entrada por el puerto 22 desde cualquier dirección (solo para fines educativos) o crearlo cuando estemos implementando las instancias EC2. Aseguremos que el SG se cree en la VPC que indiquemos.
El puerto 2049 del protocolo NFS también deberá tener entrada ya que será utilizado por AWS EFS para comunicarse. Sin esto no hay conexión al almacenamiento.

Instancias EC2

Lanzamos las 2 o 3 instancias EC2 asegurándonos de que queden en diferentes AZs. Por ejemplo: una en us-east-1a, otra en us-east-1b. Yo ocuparé solo 2 instancias EC2.
Todo esto lo podemos implementar desde Terraform o desde CloudFormation.

Especificamos:

  • La VPC que creamos.
  • La Zona de disponibilidad
  • La subred, diferente para cada instancia.
  • El Grupo de Seguridad que creamos.
  • Launch.

A continuación crearemos el sistema de archivos con AWS EFS.
Vamos a la consola, buscamos EFS

En la ventana emergente seleccionamos customize

Le damos un nombre, y nos aseguramos de tener seleccionado File system type: Regional.
Esto nos ofrece mayor disponibilidad y durabilidad al momento de almacenar los datos entre múltiples AZs.

Esto es clave. Con esta opcion, AWS se encarga de replicar tus datos en multiples AZs dentro de la Region.

Elegimos si queremos backup automáticos o no.
En la parte de encriptación la dejamos marcada

El resto de opciones las dejamos por defecto.
NEXT ->

En la siguiente ventana nos preguntará en cual VPC queremos conectar las instancias EC2. Aca vamos a configurar los Mount targets o puntos de conexión, se crean en las subredes de las AZs donde tenemos las instancias EC2 y muy importante debemos asociarles el mismo grupo de seguridad que implementamos en las instancias EC2.
Debemos asegurarnos de seleccionar la VPC correspondiente, la AZ, la subnet y el Grupo de seguridad de cada uno, señalando el id de la subnet correspondiente, en este caso en la subnet pública 1a y 1b, además de seleccionar el grupo de seguridad con el que estamos trabajando.

Next ->
Políticas de Sistema de Archivos lo dejamos tal cual -> Next ->
Revisamos -> Create.
Esperamos unos segundos a que se termine de crear.

Veremos esto:

Vamos a conectarnos a cada instancia EC2 que creamos por SSH.

Instalamos el cliente NFS

Para Ubuntu o Debian debemos descargar cliente de Amazon EFS (efs-utils)

cd ~
wget https://github.com/aws/efs-utils/archive/refs/tags/v1.35.2.tar.gz
tar -xvzf v1.35.2.tar.gz
cd efs-utils-1.35.2

Instalamos las dependencias necesarias

sudo apt update
sudo apt install -y stunnel4 nfs-common binutils

Creamos el paquete .deb

./build-deb.sh

Instalamos

sudo dpkg -i ./build/amazon-efs-utils-1.35.2-1_all.deb

Es la herramienta básica de NFS en Ubuntu

Creamos un directorio para el punto de Montaje
sudo mkdir -p /mnt/efs

Montamos el sistema de Archivos EFS
Fijate cuidadosamente donde debes reemplazar fs-12345678 por el id de el EFS y la Región, es decir, el nombre DNS único que AWS le da cuando se crea.

Con el siguiente comando montamos el EFS con cifrado

sudo mount -t efs -o tls fs-00ff6076446c4726f.efs.us-east-1.amazonaws.com:/ /mnt/efs


Este mismo comando lo ejecutamos en todas las instancias que necesitan tener acceso a los archivos compartidos. Todas apuntando al mismo DNS de EFS.

Verificamos el montaje
df -h | grep efs
mount | grep efs

Deberías ver algo como esto:

(Opcional) Montaje automático al iniciar:
sudo nano /etc/fstab

Agregamos al final esta línea:

fs-00ff6076446c4726f:/ /mnt/efs efs _netdev,tls 0 0

Guardamos.

Probamos creando un archivo cualquiera
sudo touch /mnt/efs/testfile.txt
ls -la /mnt/efs/

Verificamos en ambos FS el contenido de la carpeta en cada Instancia EC2

Y voilá, Ya tendríamos una carpeta compartida con todos los requerimientos. Dinero Fácil.

En caso de fallos:
usa nslookup para probar conectividad
utiliza telnet fs-xxxxxxxxxxxxxxx.efs.us-east-1.amazonaws.com 2049

Verificar las ip privadas en EFS -> Network.

Las subredes, el File System y las Instancias EC2 deben estar en la misma VPC.

Alternativa Para Ubuntu sin cifrado

#Para Ubuntu sin cifrado
sudo apt update
sudo apt install -y nfs-common

Con el siguiente comando montamos el EFS sin cifrado

sudo mount -t nfs4 -o nfsvers=4.1,rsize=1048576,wsize=1048576,hard,timeo=600,retrans=2,noresvport fs-00ff6076446c4726f.efs.us-east-1.amazonaws.com:/ /mnt/efs

Desmontar EFS

sudo umount /mnt/efs

Agregar un comentario

Tu dirección de correo electrónico no será publicada. Los campos requeridos están marcados *