Cómo optimizar las funciones de AWS Lambda con simultaneidad aprovisionada y escalado automático
Las funciones de AWS Lambda son una solución sin servidor para ejecutar código en la nube sin configurar sus propios servidores.
Las funciones de AWS Lambda son una solución sin servidor para ejecutar código en la nube sin configurar sus propios servidores. La principal desventaja es que los tiempos de inicialización pueden ser elevados, lo que genera una mayor latencia. Con la simultaneidad aprovisionada, puedes resolver este problema.
¿Qué es la simultaneidad aprovisionada?
Las funciones Lambda se ejecutan en sus propios "entornos de ejecución", que normalmente se inician automáticamente cuando se realiza una solicitud. Después de una invocación de función, el entorno se mantendrá "caliente" durante aproximadamente 5 a 15 minutos y el código de inicialización no tendrá que ejecutarse nuevamente.
Sin embargo, después de ese período, o si es necesario atender varias solicitudes simultáneamente, es necesario crear un nuevo entorno de ejecución, lo que lleva a mayores tiempos de inicio, lo que se denomina "arranque en frío". Esto puede ser especialmente pronunciado con lenguajes que necesitan realizar grandes cantidades de compilación JIT al inicio, como Java y .NET.
Para resolver esto, AWS tiene una función llamada Concurrencia aprovisionada, donde básicamente puede reservar una cierta cantidad de entornos de ejecución para que estén permanentemente activos durante todo el día. Esto significa que todo el código de inicialización se ejecuta por adelantado y no es necesario experimentar arranques en frío.
Si confía en Lambda para atender las solicitudes de los usuarios, es posible que desee considerar la simultaneidad aprovisionada incluso si termina costando un poco más. Aunque los arranques en frío generalmente solo representan el 1% de las solicitudes, ese 1% pueden ser segundos más esperando a que se cargue una aplicación, aunque esto dependerá del tiempo de ejecución y el tamaño de su código.
¿Cuánto cuesta la simultaneidad aprovisionada?
A diferencia de las instancias EC2 reservadas, la concurrencia aprovisionada sigue siendo principalmente un precio de "pago por lo que usa", como el resto de Lambda. Paga una pequeña tarifa por cada hora que aprovisiona cada entorno y luego paga las solicitudes de Lambda como de costumbre.
Sin embargo, debido a que el tráfico es más predecible por parte de AWS y es más barato no tener que ejecutar el código de inicialización todo el tiempo, el costo de cómputo por función para las solicitudes realizadas con simultaneidad aprovisionada es en realidad menor. Tampoco hay inconvenientes por superar el límite: solo se le cobrará el precio estándar de concurrencia.
En general, la simultaneidad aprovisionada puede ser un poco más económica (entre un 5 y un 10 %) si se tiene un tráfico muy predecible y se reserva exactamente esa cantidad de capacidad. Sin embargo, en algunos casos también puede resultar un poco más caro. Querrá verificar sus análisis y conectarlos a la Calculadora de precios Lambda de AWS para obtener más información.
Habilitación de la simultaneidad aprovisionada
Activar la simultaneidad aprovisionada es bastante simple, pero tiene una desventaja: no puede apuntar a la versión predeterminada $LATEST. Esta etiqueta es un alias que puede cambiar y no apunta a una versión específica, y la simultaneidad aprovisionada debe reservar una versión específica. Por lo tanto, deberá publicar una nueva versión de Lambda, si aún no tiene una:
Luego, configure un alias para que apunte a esa versión. Este alias se puede actualizar, lo que desencadenará una actualización para los entornos aprovisionados.
Una vez que su alias esté configurado, puede agregar una nueva configuración de simultaneidad desde la configuración de Lambda, en Configuración > Simultaneidad. También puede configurar esto directamente desde la configuración del alias.
La configuración para la simultaneidad aprovisionada es simple: seleccione un alias e ingrese una cantidad a aprovisionar.
También puede configurar y actualizar este valor mediante la API o CLI de AWS, que se puede utilizar para automatizarlo a lo largo del día:
aws lambda put-provisioned-concurrency-config --function-name MyFunction \
--qualifier LatestProvisioned --provisioned-concurrent-executions 10
Escalado automático con simultaneidad aprovisionada
Dado que la simultaneidad aprovisionada se puede ajustar a lo largo del día, también se puede conectar al Auto Scaling de aplicaciones de AWS para ajustarla según el uso. Conectar esto es sencillo y solo requiere unos pocos comandos de la CLI o API de AWS, ya que todavía no existe una consola de administración para esto.
Primero, deberá registrar la función Lambda como objetivo de escalado. Aquí, deberá editar el nombre de la función (MyFunction) y el alias (LatestProvisioned), y también ajustar los rangos de capacidad mínima y máxima.
aws application-autoscaling register-scalable-target --service-namespace lambda \
--resource-id function:MyFunction:LatestProvisioned --min-capacity 2 --max-capacity 10 \
--scalable-dimension lambda:function:ProvisionedConcurrency
Luego, puede habilitar una política de escalado automático, utilizando el nombre de la función y el alias como ID del recurso y configurándolo con una política de escalado JSON. En este ejemplo, se configura para que aumente y disminuya cuando LambdaProvisionedConcurrencyUtilization
supere o baje del 70 %.
aws application-autoscaling put-scaling-policy --service-namespace lambda \
--scalable-dimension lambda:function:ProvisionedConcurrency --resource-id function:MyFunction:LatestProvisioned \
--policy-name my-policy --policy-type TargetTrackingScaling \
--target-tracking-scaling-policy-configuration '{ "TargetValue": 0.7, "PredefinedMetricSpecification": { "PredefinedMetricType": "LambdaProvisionedConcurrencyUtilization" }}'
Esto no cubre todos los casos, como ráfagas rápidas de uso que no duran mucho, pero funciona bien para un tráfico constante y le permitirá ahorrar dinero por la noche, cuando el tráfico es bajo.