En esta ocasión les hablare de una herramienta muy útil para utilizar el servicio Amazon S3 como sistema de archivos en instancias EC2 o servidores Linux, s3fs. Su principal uso es con aplicaciones que utilizan un sistema de archivos tradicional y que por su complejidad, son difíciles de adaptar para que utilicen el API de S3.
Introducción
Durante la fase de prueba de concepto de un proyecto que utiliza grandes cantidades de información (mas de 120 TB) y que además pretende ser escalable, se propuso utilizar Amazon Web Services y su servicio de almacenamiento S3 ya que los costos son relativamente bajos en comparación con la alternativa on-premises.
Todo iba bien hasta que me notificaron que la aplicación no podría ser modificada para integrar el API de S3, lo cual definitivamente es una limitante puesto que la aplicación depende de un sistema de archivos convencional para consultar archivos y, como muchos deben de saber, S3 NO ES UN SISTEMA DE ARCHIVOS.
Además de lo mencionado previamente, es importante destacar que el tiempo de lectura de un archivo que esta en el mismo disco duro del servidor o en un volumen EBS, es inferior al tiempo de lectura de un archivo almacenado en un servicio externo como S3.
Por todo lo anterior me di a la tarea de buscar una alternativa y me encontré con s3fs, que como dice en su pagina:
"Es un sistema de archivos basado en FUSE con almacenamiento en Amazon S3. Permite montar un bucket S3 como sistema de archivos local en modo lectura/escritura y operar sobre archivos y directorios de forma transparente."
Además de permitir el uso de archivos almacenados en S3 de forma transparente, tiene una función de cache bastante útil que sirve para almacenar localmente los archivos transferidos desde S3 y reducir así los tiempos de transferencia.
Instalación y Configuración
La instalación es muy simple, solo hay que instalar las dependencias, descargar el código fuente, compilar y utilizar. A continuación aparecen las instrucciones adecuadas, mismas que se encuentran en la dirección https://code.google.com/p/s3fs/wiki/InstallationNotes.
yum install gcc yum install libstdc++-devel yum install gcc-c++ yum install fuse yum install fuse-devel yum install curl-devel yum install libxml2-devel yum install openssl-devel yum install mailcap wget http://s3fs.googlecode.com/files/s3fs-1.74.tar.gz tar xzf s3fs-1.74.tar.gz && cd s3fs-1.74 ./configure --prefix=/usr make make install (como root)
Una vez instalado configuramos los datos de acceso al bucket en el archivo /etc/passwd-s3fs que tiene el formato:
bucket-name:access_key:secret_key
A continuación montamos el bucket y de inmediato podemos comenzar a utilizarlo como cualquier otro sistema de archivos:
s3fs bucket-name /mountpoint -o allow_other echo "hola mundo" > /mountpoint/test.txt ls -l /mountpoint cat /mountpoint/test.txt
Es importante destacar que utilizamos el parámetro "-o allow_other" para montar el bucket en modo lectura/escritura para todos lo usuarios, de lo contrario s3fs montará el sistema de archivos con permisos de escritura únicamente para root.
Para terminar y en caso de que deseemos montar automáticamente el bucket, se puede agregar la siguiente linea al /etc/fstab:
s3fs#bucket-name /mountpoint fuse allow_other,use_cache=/cachedir 0 0
Se puede observar que utilizamos el parámetro "use_cache=/cachedir", con el cual definimos el directorio que se utilizará como cache local para guardar los archivos transferidos desde S3 y acceder a ellos de forma mas rápida.
Es importante agregar un script al crontab que periodicamente borre los archivos del directorio "/cachedir" puesto que s3fs no implementa ningún sistema de expiración de cache.
Rendimiento
Para la prueba de rendimiento se generó un script en PHP que lee un archivo que contiene una lista de imágenes almacenadas en S3 y que son consultados usando la ruta correspondiente en el sistema de archivos, e inmediatamente se imprimía la media con los tiempos obtenidos.
En la prueba de concepto y haciendo uso de s3fs, solucionamos el problema de la dependencia del sistema de archivos por parte de la aplicación mientras que con la opción de cache se consiguieron reducir los tiempos de respuesta y consulta de archivos, en la tabla que aparece a continuación se pueden apreciar algunos de los resultados que obtuvimos con s3fs usando diferentes motores de cache al realizar pruebas de lectura.
La primera lectura implica la descarga de los archivos desde S3 y el almacenamiento en el directorio de cache local mientras que, la segunda lectura solo consulta los metadatos del objeto S3 y la obtención de los datos desde el cache local.
Como se puede apreciar, se consiguieron buenos tiempos de respuesta sobre todo en la segunda ejecución, cuando los archivos se encuentran almacenados localmente.
Adicional a s3fs existe un alternativa llamada YAS3FS, esta implementada en Python + boto y ofrece funcionalidad similar aunque por el momento, no lo he utilizado y no puedo darles mas información.
Conclusión
s3fs es una herramienta muy útil para utilizar S3 como un sistema de archivos en instancias EC2, ideal para aplicaciones que no se desea no que no se pueden modificar y que requieren acceso a archivos de forma tradicional, sin embargo, el desempeño aún es inferior comparado con lectura directa desde disco duro o mecanismos de cache simple vía PHP. Sobre este último en nuestras pruebas obtuvimos tiempos de respuesta de .00004, lo cual es sorprendente.