En los últimos años se ha generalizado el almacenamiento en línea, que ofrece arquitecturas altamente escalables, mayor seguridad y amplia accesibilidad a los datos. Uno de los servicios de almacenamiento más populares es Amazons's Simple Storage Service, conocido popularmente como S3.
Amazon S3 es un servicio extremadamente potente en el núcleo de Amazon Web Services. Sin embargo, fuera del entorno de producción, puede resultar complicado trabajar con S3. Implica pasar claves de acceso, aprovisionar cuentas de usuario y mantener una conexión de red fiable, por no mencionar que cuesta dinero. FakeS3 es un servidor ligero que simula el comportamiento del S3 real. Responde a las mismas llamadas a las que responde Amazon S3 y almacena los archivos subidos en tu sistema de archivos local - sin hacer peticiones al servicio de Amazon. Aunque gem no soporta el conjunto completo de comandos de S3, la API implementada es suficiente para la mayoría de los casos de uso de las aplicaciones.
En este artículo voy a presentar el enfoque de la integración de AWS y FakeS3 con Paperclip - popular biblioteca de archivos adjuntos para Active Record. Paperclip y S3 mezclados proporcionan un sistema de almacenamiento de archivos efectivo que combina las útiles características principales de Paperclip (como la gestión de validaciones y transformaciones de imágenes) con las ventajas del almacenamiento online. Aunque la configuración de estas herramientas no es obvia y requiere profundizar en la documentación detallada así como resolver muchos problemas específicos de las gemas, merece la pena dedicar algo de tiempo a hacer que el desarrollo sea más rápido y eficiente.
¿Cuál es nuestro objetivo?
La integración de las herramientas descritas requiere tres pasos:
Lanzamiento de S3 fakeserver proporcionado por la gema FakeS3 en segundo plano.
Configuración del cliente AWS S3 para delegar todas las solicitudes a fakeserver lanzado.
Configurar Paperclip para usar un endpoint S3 falso en las URLs de los recursos construidos.
Asegúrate de instalar la versión 1.6 de aws-sdk. Paperclip, que utiliza SKD para gestionar el almacenamiento en el servicio de Amazon, no funciona bien con versiones superiores de esta gema. Esto se debe a cambios significativos en la API del SDK traídos con la versión 2.0.
Recuerda también que el objetivo principal de FakeS3 es minimizar las dependencias en tiempo de ejecución. Es más una herramienta de desarrollo para probar las llamadas S3 en su código en lugar de un servidor de producción que busca duplicar la funcionalidad de S3. Por lo tanto, debe incluir la gema solo en el grupo de desarrollo y pruebas.
Configuración de AWS
AWS SDK proporciona un método de ayuda dedicado responsable de cargar la configuración. Por defecto, cargará la configuración desde config/aws.ymlextrae sus parámetros para el entorno actual y los pasa al cliente AWS. En primer lugar, llame al siguiente método en un inicializador:
access_key_id, secret_access_key - Credenciales de cliente de AWS necesarias para acceder a su cuenta de Amazon. Son ignoradas por el falso servidor S3, de ahí los valores personalizados en entornos sandbox.
s3_endpoint, s3_port- Especificación del endpoint S3. Usamos estos parámetros para reemplazar el endpoint S3 real con el endpoint falso lanzado por la gema FakeS3 - todas las peticiones al servicio de Amazon serán ahora delegadas al fakeserver local.
s3_force_path_style - S3 acepta dos estilos para incluir el nombre del bucket en la URL. Puede elegir que el nombre del bucket se coloque al estilo del dominio (bucket.s3.amazonaws.com) o al estilo de la ruta (s3.amazonaws.com/bucket). Con el fin de mantener las cosas simples y evitar la configuración adicional asociada con la asignación de subdominio del cubo a la dirección loopback prefiero el estilo de ruta sobre el estilo de dominio en el entorno de desarrollo.
use_ssl - obliga a AWS SDK a utilizar HTTPS en lugar de HTTP. Necesitamos deshabilitar esta opción, porque la gema FakeS3 no soporta peticiones HTTPS que el cliente AWS realiza por defecto.
La configuración para el entorno de producción es bastante sencilla:
Esta vez, sin embargo, estamos tratando con el servicio real de S3, por lo tanto usted necesita proporcionar credenciales auténticas de AWS.
Debido a los riesgos potenciales de seguridad, es una buena práctica mantener los valores secretos como las claves de acceso fuera de su sistema de control de versiones, por ejemplo, mediante el uso de variables de entorno. Usaremos ERB para inyectar sus valores en el fichero de configuración.
Configuración Paperclip
Ahora es el momento de enfrentarse a Paperclip y forzarlo para que funcione correctamente con el cliente S3 ya configurado. El objetivo principal de la configuración de Paperclip es obtener la ruta de almacenamiento que localizará los recursos alojados en fakeserver:
almacenamiento - especifica el soporte de almacenamiento (por defecto sistema de archivos local). Como estamos usando AWS S3 necesitamos cambiarlo a :s3.
cubo - nombre del bucket S3 que almacenará sus archivos. Si el bucket no existe, Paperclip intentará crearlo.
url - ajustado a :s3_alias_url hará que Paperclip asigne un alias al nombre de host del bucket S3 con el valor especificado por :s3_host_alias parámetro.
s3_host_alias - alias para el host del bucket S3 por defecto. Tenga en cuenta que la colocación del host, el puerto y el nombre del bucket corresponden a la configuración del cliente de AWS.
ruta - para las claves con las que se almacenarán los archivos en el bucket. Las claves deben ser únicas dentro del bucket, como los nombres de archivo. Debido al hecho de que S3 no soporta directorios, puede utilizar una clave / para simular estructuras de directorios.
Al igual que las credenciales de AWS, el nombre del bucket también se considera un valor secreto que debe almacenarse fuera de tu código base. Recomiendo almacenar su nombre en una variable de entorno.
Por último, fusionar la configuración en las opciones por defecto de Paperclip en un inicializador:
Tanto la configuración de AWS como la de Paperclip contienen una referencia al fakeserver local de S3 que se espera que se ejecute bajo localhost:10001. Antes de trabajar en el desarrollo debe lanzar el servidor con el siguiente comando (proporcionado por la gema FakeS3):
fakes3 -r public/system -p 10001
Los parámetros pasados son:
root -r - directorio raíz bajo el cual se almacenarán los archivos subidos. Considere excluirlo de VCS si no desea que los archivos subidos se almacenen en su repositorio.
puerto -p - número de puerto en el que se ejecutará el servidor local.
Si está utilizando Foreman para la gestión de procesos en su aplicación, puede ser conveniente añadir la siguiente entrada en Procfile:
Esto te ahorrará tiempo perdido en lanzar fakeserver cada vez que necesites desarrollar alguna funcionalidad relacionada con S3.
Conclusión
Hemos configurado el cliente de AWS para que delegue todas las solicitudes al servidor falso local, hemos configurado Paperclip para que utilice el punto de enlace de S3 falso en las URL de los recursos creados y hemos lanzado el servidor falso proporcionado por la gema de S3 falso almacenando todos los archivos en el sistema de archivos local.
Como resultado, nos independizamos de la conexión a Internet y ahorramos dinero haciendo nuestro desarrollo más rápido y fiable.