Visto en el AWS re:Invent 2018 🙂

Si tenemos una arquitectura de backend serverless basada en funciones AWS Lambda, y dichas funciones son invocadas desde API Gateway (o desde dispositivos Alexa), lo habitual es ver que se use como base de datos una NoSQL (DynamoDB en el caso de Amazon Web Services).

Pero muchas veces necesitamos que nuestro backend guarde y recupere los datos desde una base de datos relacional (RDS en AWS). Y aquí aparece el problema más gordo de las arquitecturas serverless con base de datos: vamos a alcanzar el número máximo permitido de conexiones abiertas de la base de datos (max_connections).

Este problema sucede porque utilizando funciones Lambda no estamos reutilizando las conexiones a la base de datos ni tenemos el control de cuándo una instancia de una función Lambda termina o muere. Por suerte, las ventajas de las funciones as a Service son muchísimas y hay que tenerlas en cuenta en casi todo nuevo proyecto de backend para web o app móvil (el resto de pros y contras dará para otro post).

Como solución encontré la web de Jeremi Daly quien ha liberado un módulo muy interesante que maneja eficientemente las conexiones mysql en entornos serverless (funciones Lambda con node). Muchas gracias Jeremi 🙂

Pero el pasado 30/11/2018, AWS hizo una presentación en re:Invent explicando el problema de las conexiones entre Lambda y RDS, dio listado de buenas prácticas y liberó un código para manejar estas conexiones. Es muy interesante que lo reviséis si tenéis problema con max_connections, ya que es la solución más completa, más reciente y oficial del equipo de Amazon Web Services (Mayank Thakkar y Emma Zhao):

En el futuro cercano creo que AWS seguirá evolucionando su versión de base de datos relacional Aurora Serverless y este problema de max_connections quedará resuelto de forma transparente para el programador siempre que se conecte una función Lambda con un RDS de tipo Aurora Serverless 🙂