Cloud IO Enabler Podcast
|
En este post Explorando Límites de AWS Lambda, les traemos un proyecto Playbook OpenSource base que puede ayudarlos a crear y preparar su infraestructura para probar los límites de Lambda para sus casos de uso.
Explorando Límites de AWS Lambda – Porque
Es muy común implementar una solución Serverless en AWS utilizando los servicios API Gateway, AWS Lambda y DynamoDB, y, probar esta arquitectura para nuestro caso de uso es crucial al diseñar una solución.
Así, cuando trabajamos la charla ¿Como manejar 100K conexiones simultáneas en AWS? en Serverless o probamos los nuevos límites de AWS Lambda de acuerdo al anuncio Las funciones de AWS Lambda ahora escalan 12 veces más rápido cuando manejan solicitudes de gran volumen, nos vimos en la necesidad de crear recursos y ambientes, una y otra vez hasta crear el escenario perfecto.
Por eso decidimos crear un proyecto base como infraestructura como código que pueda apoyarlos para sus propias pruebas. El repositorio es público y de código abierto, y lo pueden encontrar aquí serverless-limits-playbook-test.
Arquitectura
La idea principal en esta versión es crear una arquitectura de un API RESTful con API Gateway integrado a un función AWS Lambda para llamadas sincrónicas, y crear una instancia EC2 con una instalación de JMeter para lanzar pruebas de carga.
Aunque en el código podrán observar también:
- Habilitación de CORS
- Bloque de código para llamadas asincrónicas (comentado)
- Configuración para reserve concurrency en AWS Lambda.
- El script
setup.sh
para adicionar configuraciones a su instancia EC2. - El script
index.mjs
para definir la implementación real de su función AWs Lambda. - Un identificador único para peticiones desde a lambda (opcional podrían eliminarlo).
Prerequisitos
Dependiendo de su caso de uso necesitarán configuraciones generales en su cuenta, pero aquí presentamos las básicas.
- Tener una Default VPC en la region que vayan a probar.
- Crear un Role en IAM que permita escribir desde API Gateway a CloudWatch.
- Asignar dicho rol a las configuraciones del servicio API Gateway en la región donde se va ha hacer pruebas.
- Tener los Server Limits adecuados a su prueba, especialmente los de AWS Lambda “Burst Concurrency” y “Concurrent Executions“.
Despliegue de recursos
Al ser un proyecto IaaC construido con AWS CDK, pues evidentemente usamos los comando apropiados. A continuación la lista de pasos:
- Cambiar las variables
const targetRegion
yconst targetAccount
en el archivo de los fuentes/bin/infra.ts
apropiadamente. - Instala AWS CLI la última versión.
- Instala Node.js 20 o superior.
- Instala el último AWS CDK.
- En la carpeta del proyecto corre cdk boostrap para preparar la región para IaaC.
- Ejecuta cdk synth para verificar que tus fuentes estén correctos.
- Ejecuta cdk deploy para crear los recursos descritos en la arquitectura.
Usamos AWS CDK para este proyecto, pero podrías reemplazar o hacer tus versiones con Terraform u OpenTofu respectivamente. Hacerlo con AWS Cloud Formation es otra opción aunque no lo recomiendo.
Lanzamiento de carga masiva
Para ejecutar las pruebas masivas con JMeter es necesario ingresar a la instancia EC2 creada a través de la Consola Web y con EC2 Instance Connect, dado que no se asoció un server key al momento de su creación.
Una vez en el shell los comandos son los siguientes:
- Cambia a root el usuario:
sudo -i
. - Edita el archivo LambdaConcurrencyLimits.jmx con
vi /tmp/LambdaConcurrencyLimits.jmx
con el url de tu API RESTful (esa url la obtienes como salida del comando cdk deploy al final del log).
Ejecuta los test JMeter de carga con
rm -Rf /var/www/html/stats/* && rm -f /tmp/stats.jtl && /opt/apache-jmeter-5.6.2/bin/jmeter -n -t /tmp/LambdaConcurrencyLimits.jmx -l /tmp/stats.jtl -e -o /var/www/html/stats.
Pruebas en JMeter
Mientras se puede escribir un blog entero de pruebas en JMeter, el archivo creado esta compuesto de las siguintes características:
- Cinco grupos de usuarios (hilos)
- Primer grupo lanza 1001 usuarios en 10 segundos.
- Segundo grupo lanza 2001 usuarios en 20 segundos.
- Tercer grupo lanza 3001 usuarios en 30 segundos.
- Cuarto y quinto grupo lanza 0 usuarios, y están en el archivo jmx para que los usen como lo prefieran para su caso de prueba.
- Se prueba una URL con un HTTP Request de tipo GET al API RESTful creado.
- El URL del API Gateway RESTful esta externalizado en el argumento
url-api-gateway
.
Evidentemente estas pruebas no se ajustan a tu caso de uso y deberás cambiarlas apropiadamente, sin embargo el mecanismo de lanzamiento y la instancia EC2 configurada va a reducir el tiempo para esta operación.
Métricas
Una vez desplegada la infraestructura, y ejecutados las pruebas podremos monitorear los recursos y tomar las acciones correspondientes.
A continuación algunos gráficos que vamos a poder obtener:
API Gateway
AWS Lambda
Además siempre vamos a tener Grupos de Logs en Amazon CloudWatch apropiados para el caso de uso y por servicio para analizar los resultados:
IMPORTANTE: siempre al finalizar las pruebas no olviden ejecutar cdk destroy
para decomisar los recursos usados y evitar facturación innecesaria.
Conclusiones y Pensamientos Finales
En este Playbook Explorando Límites de AWS Lambda, hemos podido plasmar un proyecto de código abierto para que puedan acelerar sus pruebas de implementaciones. Sin embargo hay mucho que mejorar en el mismo, como la inclusión de secrets con Secrets Manager para gestionar números de cuenta y otros parámetros sensibles y que NO deben estar en su repositorio de fuentes.
También este proyecto nos ayuda en la inmersión en el mundo apasionante que significa AWS CDK, y con el cual pueden gestionar su infraestructura de forma completamente automatizada.
Vale mencionar que en un proyecto de AWS CDK jamás deben subir el directorio cdk.out, dado que aquí como resultado de la compilación de los archivos Typescript a archivos propios de AWS Cloud Formation ((JSON por ejemplo), puede y va a quedar información sensible como números de cuenta y/o claves.
Para hacer uso de este enfoque de despliegue es necesario estar familiarizado con AWS CLI ya que con este generarán perfiles que contengan accesos de los usuarios de su cuenta, y con tales accesos se crearán los recursos. Entonces es importante que los usuarios asociados tengan los permisos correspondientes.
Los límites que tengan para su cuenta y por región van a incidir directamente en sus pruebas en caso de altas cargas de procesamiento, por lo que se debe tener en cuenta los mismos al momento de planificar la implementación.
Les animamos a dejar su feedback para mejorar el proyecto, sea aquí o en el repositorio de GitHub, y esperamos que sea de utilidad este proyecto “Explorando Límites de AWs Lambda”.