Solución Serverless para Lumen / Laravel en AWS con Bref
Es común encontrar documentación de soluciones serverless para hacer deploy de Laravel en AWS. Mucha de esta, se encuentra en distintos artículos, y si se están dando los primeros pasos en esto, resulta confuso de comprenderlo inicialmente. Por eso, he recopilado el fruto de toda esa investigación en este documento, y en español, pues ya esta bien documentado en inglés.
¿Para qué sirve Serverless?
Primero, existen razones para querer implementar serverless en tu proyecto. En mi caso, la primera, enfocarse en el código, y si, la idea es que serverless nos quite un considerablemente de encima el peso de configurar todo un ambiente para nuestros proyectos, o pensar si las instancias actuales y las configuraciones, soportaran las demandas de tráfico que podamos requerir.
Segundo, abaratar costos. Se puede consultar esto en el sitio de amazon: https://aws.amazon.com/es/lambda/pricing/
Tercero, escalabilidad. AWS Lambda se encargará de escalar el proyecto según demanda, no tenemos que preocuparnos por esto.
¿Cómo utilizarlo con Laravel Lumen?
En este artículo no entraré en detalles de las configuraciones a realizar en AWS, sino más bien en cómo configurar nuestro proyecto. Si usted desea más detalle, déjelo en los comentarios y estaré realizando un articulo con respecto a la tecnología de Amazon que desee.
1. Instalar serverless en nuestra máquina
npm install -g serverless
2. Crear un nuevo usuario en IAM de AWS, con esta política
https://github.com/medinazdago/lumen-serverless-demo/blob/main/IAM-Policy
Acá Bref también tiene documentados los pasos, pero sus instrucciones, brindarían un acceso de full administrador, no recomendado por temas de seguridad: https://bref.sh/docs/installation/aws-keys.html
3. Usar las keys obtenidas de esta manera
Usamos un PROFILE_NAME, porque en general puede que necesitemos manejar varias cuenta de AWS en nuestra terminal, de esta manera evitamos conflictos.
serverless config credentials --profile PROFILE_NAME --provider aws --key KEY --secret SECRET_KEY
3. Configuramos nuestro proyecto para hacer uso de Bref
composer require bref/bref bref/laravel-bridge --update-with-dependencies
4. Archivo serveless.yml demo
https://github.com/medinazdago/lumen-serverless-demo/blob/main/serverless.yml
Este archivo tiene valores de parámetros almacenados en Parameters Store de AWS System Manager, esto brinda una capa de seguridad para nuestros credenciales, y dinamismo si usamos varios perfiles de AWS.
5. Ejecutamos nuestra configuración
serverless deploy --aws-profile PROFILE_NAME
Hasta este punto, nuestro proyecto ya debería estar corriendo en AWS sin problema.
La URL es similar a esta: https://demo-serverless-url.execute-api.us-west-2.amazonaws.com/prod/
El archivo serverless.yml hace un include los archivos .key que requiere Laravel Passport, en caso de que su proyecto haga uso del mismo, debe considerar, que debe tener en su repositorio las llaves que requiere su proyecto en serverless.
include:
— storage/oauth-private.key
— storage/oauth-public.key
6. Configurar un dominio propio, aunque este en Cloudflare o cualquier otro register
Primero, deberemos seguir todo el proceso de solicitar un certificado firmado por Amazon desde esta region (us-east-1): https://console.aws.amazon.com/acm/home?region=us-east-1#/
Segundo, una vez confirmado el proceso con el método que escojamos (DNS o Email, procedemos a completar nuestra solicitud de certificado.
Tercero, seguimos esta guia: https://bref.sh/docs/environment/custom-domains.html, en la cual, lo único que es confuso, es la selección del Endpoint Type, el cual sera Edge:
Cuarto, tomamos el API Gateway domain name, que es de tipo abcxyz..cloudfront.net, y creamos un registro CNAME:
Y listo, tenemos nuestro corriendo en AWS Lambda con un dominio propio.
Importante:
Se asume que tiene una configuración abierta (pero con user y pass) a una base de datos tipo RDS de Amazon, no recomendado, pero que espero documentar el proceso más seguro a usar con serverless en el futuro.
Esta guía se puede usar siguiendo estos pasos también en caso de que desee aclarar algunas partes, o puede dejar su pregunta en los comentarios y con gusto brindare respuesta :)
https://bref.sh/docs/installation.html
https://bref.sh/docs/frameworks/laravel.html
https://dev.to/chandreshhere/deploy-serverless-laravel-application-using-bref-cp2