Configuración de simultaneidad aprovisionada para una función - AWS Lambda

Configuración de simultaneidad aprovisionada para una función

En Lambda, la simultaneidad es la cantidad de solicitudes en tránsito que la función administra en la actualidad. Hay dos tipos de controles de concurrencia disponibles:

  • Simultaneidad reservada: representa la cantidad máxima de instancias simultáneas asignadas a la función. Cuando una función ha reservado simultaneidad, ninguna otra función puede usarla. La simultaneidad reservada es útil para garantizar que las funciones más importantes siempre tengan suficiente simultaneidad para manejar las solicitudes entrantes. No hay ningún cargo adicional por configurar la concurrencia reservada para una función.

  • Simultaneidad aprovisionada: es la cantidad de entornos de ejecución preinicializados asignados a la función. Estos entornos de ejecución están listos para responder de forma inmediata a las solicitudes de funciones entrantes. La simultaneidad aprovisionada es útil para reducir las latencias de arranque en frío de las funciones. La configuración de la simultaneidad aprovisionada genera cargos adicionales para su Cuenta de AWS.

En este tema se detalla cómo administrar y configurar la simultaneidad aprovisionada. Para obtener una descripción general conceptual de estos dos tipos de controles de simultaneidad, consulte Simultaneidad reservada y simultaneidad aprovisionada. Para obtener más información sobre los límites de simultaneidad reservada, consulte Configurar la simultaneidad reservada para una función.

nota

Las funciones de Lambda enlazadas a una asignación de orígenes de eventos de Amazon MQ tienen una simultaneidad máxima predeterminada. Para Apache Active MQ, el número máximo de instancias simultáneas es 5. Para Rabbit MQ, el número máximo de instancias simultáneas es 1. Establecer una simultaneidad reservada o aprovisionada para su función no cambia estos límites. Para solicitar un aumento de la simultaneidad máxima predeterminada al utilizar Amazon MQ, póngase en contacto con AWS Support.

Configuración de simultaneidad aprovisionada

Puede configurar los ajustes de la simultaneidad aprovisionada para una función mediante la consola o la API de Lambda.

Para asignar la simultaneidad aprovisionada para una función (consola)
  1. Abra la página de Funciones en la consola de Lambda.

  2. Elija la función para la que desee asignar la simultaneidad aprovisionada.

  3. Elija Configuración y, a continuación, elija Simultánea.

  4. En Configuraciones de concurrencia aprovisionadas, seleccione Agregar configuración.

  5. Elija el tipo de calificador y el alias o la versión.

    nota

    No puede utilizar la simultaneidad aprovisionada con la versión $LATEST de ninguna función.

    Si su función tiene un origen de eventos, asegúrese de que este apunte al alias o la versión correctos de la función. De lo contrario, la función no utilizará los entornos de simultaneidad aprovisionada.

  6. Ingrese un número en Simultaneidad aprovisionada. Lambda proporciona una estimación de los costos mensuales.

  7. Seleccione Guardar.

Puede configurar hasta el valor de Simultaneidad de cuenta sin reserva de su cuenta, menos 100. Las 100 unidades restantes son para funciones que no utilizan la simultaneidad reservada. Por ejemplo, si su cuenta tiene un límite de simultaneidad de 1000 y no ha asignado ninguna simultaneidad reservada o aprovisionada a ninguna de sus otras funciones, puede configurar un máximo de 900 unidades de simultaneidad aprovisionadas para una sola función.

Se produce un error si intenta asignar demasiada simultaneidad aprovisionada.

La configuración de la simultaneidad aprovisionada de una función tiene un impacto en el grupo de simultaneidad que está disponible para otras funciones. Por ejemplo, si configura 100 unidades de simultaneidad aprovisionadas para function-a, otras funciones de su cuenta deberán compartir las 900 unidades de simultaneidad restantes. Esto es válido incluso si function-a no utiliza las 100 unidades.

Es posible asignar simultaneidad reservada y simultaneidad aprovisionada para la misma función. En esos casos, la simultaneidad aprovisionada no puede superar la reservada.

Esta limitación se extiende a las versiones de funciones. La simultaneidad aprovisionada máxima que puede asignar a una versión de función específica es igual a la simultaneidad reservada de la función menos la simultaneidad aprovisionada en otras versiones de la función.

Para configurar la simultaneidad aprovisionada con la API de Lambda, use las siguientes operaciones de la API.

Por ejemplo, para configurar la simultaneidad aprovisionada con la AWS Command Line Interface (CLI), utilice el comando put-provisioned-concurrency-config. El siguiente comando asigna 100 unidades de simultaneidad aprovisionadas para el alias BLUE de una función llamada my-function:

aws lambda put-provisioned-concurrency-config --function-name my-function \ --qualifier BLUE \ --provisioned-concurrent-executions 100

Debería ver una salida con un aspecto similar al siguiente:

{ "Requested ProvisionedConcurrentExecutions": 100, "Allocated ProvisionedConcurrentExecutions": 0, "Status": "IN_PROGRESS", "LastModified": "2023-01-21T11:30:00+0000" }

Estimar con precisión la simultaneidad aprovisionada requerida para una función

Puede ver las métricas de simultaneidad de cualquier función activa mediante las métricas de CloudWatch. En concreto, la métrica ConcurrentExecutions muestra la cantidad de invocaciones simultáneas para las funciones de la cuenta.

Gráfico que muestra la simultaneidad de una función a lo largo del tiempo.

Según el gráfico anterior, esta función atiende un promedio de 5 a 10 solicitudes simultáneas en cualquier momento y alcanza un máximo de 20 solicitudes. Supongamos que hay muchas otras funciones en la cuenta. Si esta función es esencial para la aplicación y necesita una respuesta de baja latencia en cada invocación, configure, al menos, 20 unidades de simultaneidad aprovisionada.

Recuerde que también puede calcular la simultaneidad mediante la siguiente fórmula:

Concurrency = (average requests per second) * (average request duration in seconds)

Para calcular cuánta simultaneidad necesita, multiplique el promedio de solicitudes por segundo por la duración promedio de las solicitudes en segundos. Puede estimar el promedio de solicitudes por segundo mediante la métrica de Invocation y la duración promedio de las solicitudes en segundos mediante la métrica de Duration.

Al configurar la simultaneidad aprovisionada, Lambda sugiere agregar un búfer del 10 % además de la cantidad de simultaneidad que normalmente necesita la función. Por ejemplo, si la función suele alcanzar un máximo de 200 solicitudes simultáneas, establezca la simultaneidad aprovisionada en 220 (200 solicitudes simultáneas + un 10 % = 220 de simultaneidad aprovisionada).

Optimizar el código de la función cuando se utiliza la simultaneidad aprovisionada

Si utilizas la simultaneidad aprovisionada, considera la posibilidad de reestructurar el código de función para optimizarlo y lograr una latencia baja. Para las funciones que se ejecutan con simultaneidad aprovisionada, Lambda ejecuta cualquier código de inicialización (por ejemplo, cargar bibliotecas y crear instancias de clientes) en el momento de la asignación. Por lo tanto, se recomienda mover la mayor cantidad de inicialización fuera del controlador de funciones principal para evitar que afecte a la latencia durante las invocaciones reales de la función. Por el contrario, inicializar bibliotecas o crear instancias de clientes dentro del código de su controlador principal significa que la función debe ejecutarlo cada vez que la invoque, independientemente de si utiliza o no la simultaneidad aprovisionada.

Para las invocaciones bajo demanda, es posible que Lambda tenga que volver a ejecutar el código de inicialización cada vez que la función se inicie en frío. Para estas funciones, puede optar por aplazar la inicialización de una capacidad específica hasta que su función lo necesite. Por ejemplo, considere el siguiente flujo de control para un controlador de Lambda:

def handler(event, context): ... if ( some_condition ): // Initialize CLIENT_A to perform a task else: // Do nothing

En el ejemplo anterior, en lugar de inicializar CLIENT_A fuera del controlador principal, el desarrollador lo inicializó dentro de la instrucción if. De este modo, Lambda ejecuta este código solo si se cumple some_condition. Si inicializa CLIENT_A fuera del controlador principal, Lambda ejecuta ese código cada vez que se inicia en frío. Esto puede aumentar la latencia general.

Usar variables de entorno para ver y controlar el comportamiento de simultaneidad aprovisionado

Es posible que la función utilice toda la simultaneidad aprovisionada. Lambda usa instancias bajo demanda para gestionar cualquier exceso de tráfico. Para determinar el tipo de inicialización que Lambda usó para un entorno determinado, compruebe el valor de la variable de entorno AWS_LAMBDA_INITIALIZATION_TYPE. Esta variable tiene dos valores posibles: provisioned-concurrency u on-demand. El valor de AWS_LAMBDA_INITIALIZATION_TYPE es inmutable y constante durante toda la vida útil del entorno. Para comprobar el valor de una variable de entorno en el código de su función, consulte Recuperar variables de entorno Lambda.

Si está utilizando los tiempos de ejecución de .NET 6 o .NET 7, puede configurar la variable de entorno AWS_LAMBDA_DOTNET_PREJIT para mejorar la latencia de las funciones, incluso si no utilizan la simultaneidad aprovisionada. El tiempo de ejecución .NET utiliza compilación e inicialización perezosa para cada biblioteca a la que llama el código por primera vez. Como resultado, la primera invocación de una función de Lambda puede tardar más que las posteriores. Para mitigar este problema, puede elegir uno de los tres valores para AWS_LAMBDA_DOTNET_PREJIT:

  • ProvisionedConcurrency: Lambda realiza una compilación JIT anticipada para todos los entornos mediante la simultaneidad aprovisionada. Este es el valor predeterminado.

  • Always: Lambda realiza una compilación JIT anticipada para cada entorno, incluso si la función no usa la simultaneidad aprovisionada.

  • Never: Lambda deshabilita la compilación JIT anticipada para todos los entornos.

Comprenda el comportamiento de registro y facturación con la simultaneidad aprovisionada

Para los entornos de simultaneidad aprovisionada, el código de inicialización de su función se ejecuta durante la asignación y de manera periódica, a medida que las instancias de la función se reciclan. Puede ver el tiempo de inicialización en registros y seguimientos después de que una instancia de entorno procese una solicitud. Es importante tener en cuenta que Lambda factura la inicialización incluso si la instancia de entorno nunca procesa una solicitud. La simultaneidad aprovisionada se ejecuta continuamente y se factura por separado de los costos de inicialización e invocación. Para obtener más información, consulte Precios de AWS Lambda.

Además, al configurar una función de Lambda con una simultaneidad aprovisionada, Lambda preinicializa ese entorno de ejecución para que esté disponible antes de las solicitudes de invocación de funciones. Sin embargo, la función publica los registros de invocación en CloudWatch solo cuando la función se invoca de verdad. Por lo tanto, el campo Duración de la inicialización aparece en la línea de registro REPORT de la primera invocación de la función, aunque la inicialización se haya realizado antes de tiempo. Esto no significa que la función haya tenido un inicio en frío.

Uso de Application Auto Scaling para automatizar la administración de simultaneidad aprovisionada

El Auto Scaling de aplicaciones le permite administrar la simultaneidad aprovisionada según una programación o en función de la utilización. Si la función recibe patrones de tráfico predecibles, use el escalado programado. Si quiere que la función mantenga un porcentaje de utilización especifico, utilice una política de escalado de seguimiento de destino.

Escalado programado

Con el Auto Scaling de aplicaciones, puede definir su propia programación de escalado según los cambios predecibles en las cargas. Para obtener más información y ejemplos, consulte Escalado programado para el Auto Scaling de aplicaciones en la Guía del usuario de Auto Scaling de aplicaciones y Programación de la simultaneidad aprovisionada de AWS Lambda para picos de uso recurrentes en el blog de AWS Compute.

Seguimiento de destino

Con el seguimiento de destino, el Auto Scaling de aplicaciones crea y administra un conjunto de alarmas de CloudWatch según la forma en que usted define la política de escalado. Cuando se activan estas alarmas, el Auto Scaling de aplicaciones ajusta automáticamente la cantidad de entornos asignados mediante la simultaneidad aprovisionada. Utilice el seguimiento de destino para aplicaciones que no tienen patrones de tráfico predecibles.

Para escalar la simultaneidad aprovisionada mediante el seguimiento de destino, use las operaciones RegisterScalableTarget y PutScalingPolicy de la API de Auto Scaling de aplicaciones. Por ejemplo, si usa la AWS Command Line Interface (CLI), siga los siguientes pasos:

  1. Registre el alias de una función como destino del escalado. En el ejemplo siguiente se registra el alias BLUE de una función denominada my-function:

    aws application-autoscaling register-scalable-target --service-namespace lambda \ --resource-id function:my-function:BLUE --min-capacity 1 --max-capacity 100 \ --scalable-dimension lambda:function:ProvisionedConcurrency
  2. Aplique una política de escalado al destino. En el ejemplo siguiente, se configura el escalado automático de aplicaciones para ajustar la configuración de simultaneidad aprovisionada para que un alias mantenga la utilización cerca del 70 %, pero puede aplicar cualquier valor entre 10 % y 90 %.

    aws application-autoscaling put-scaling-policy \ --service-namespace lambda \ --scalable-dimension lambda:function:ProvisionedConcurrency \ --resource-id function:my-function:BLUE \ --policy-name my-policy \ --policy-type TargetTrackingScaling \ --target-tracking-scaling-policy-configuration '{ "TargetValue": 0.7, "PredefinedMetricSpecification": { "PredefinedMetricType": "LambdaProvisionedConcurrencyUtilization" }}'

Debería ver un resultado con un aspecto similar al siguiente:

{ "PolicyARN": "arn:aws:autoscaling:us-east-2:123456789012:scalingPolicy:12266dbb-1524-xmpl-a64e-9a0a34b996fa:resource/lambda/function:my-function:BLUE:policyName/my-policy", "Alarms": [ { "AlarmName": "TargetTracking-function:my-function:BLUE-AlarmHigh-aed0e274-xmpl-40fe-8cba-2e78f000c0a7", "AlarmARN": "arn:aws:cloudwatch:us-east-2:123456789012:alarm:TargetTracking-function:my-function:BLUE-AlarmHigh-aed0e274-xmpl-40fe-8cba-2e78f000c0a7" }, { "AlarmName": "TargetTracking-function:my-function:BLUE-AlarmLow-7e1a928e-xmpl-4d2b-8c01-782321bc6f66", "AlarmARN": "arn:aws:cloudwatch:us-east-2:123456789012:alarm:TargetTracking-function:my-function:BLUE-AlarmLow-7e1a928e-xmpl-4d2b-8c01-782321bc6f66" } ] }

Auto Scaling de aplicaciones crea dos alarmas en CloudWatch. La primera alarma se desencadena cuando la utilización de la simultaneidad aprovisionada supera sistemáticamente el 70 %. Cuando esto sucede, Auto Scaling de aplicaciones asigna más simultaneidad aprovisionada para reducir esta utilización. La segunda alarma se desencadena cuando la utilización nunca supera el 63 % (un 90 % del objetivo del 70 %). Cuando esto sucede, Auto Scaling de aplicaciones reduce la concurrencia aprovisionada del alias.

En el ejemplo siguiente, una función escala entre una cantidad mínima y máxima de concurrencia aprovisionada basada en la utilización.

Simultaneidad aprovisionada de escalado automático con seguimiento de destino de Auto Scaling de aplicaciones.
Leyenda
  • Instancias de función

  • Solicitudes abiertas

  • Simultaneidad aprovisionada

  • Simultanidad estándar

Cuando aumenta el número de solicitudes abiertas, el Auto Scaling de aplicaciones aumenta la simultaneidad aprovisionada en grandes pasos hasta que alcanza el máximo configurado. Luego, la función podrá seguir escalando según la simultaneidad estándar no reservada si la cuenta no alcanzó su límite de simultaneidad. Cuando la utilización disminuye y permanece baja, el escalado automático de aplicaciones disminuye la simultaneidad aprovisionada en pasos periódicos más pequeños.

Las dos alarmas del escalado automático de aplicaciones utilizan la estadística promedio de forma predeterminada. Es posible que las funciones que experimentan ráfagas no desencadenen estas alarmas. Por ejemplo, supongamos que la función de Lambda se ejecuta rápidamente (es decir, de 20 a 100 ms) y que el tráfico se produce en ráfagas rápidas. En este caso, el número de solicitudes supera la simultaneidad aprovisionada asignada durante la ráfaga. Sin embargo, el escalado automático de aplicaciones requiere que la carga de ráfaga se mantenga durante al menos 3 minutos para aprovisionar entornos adicionales. Además, ambas alarmas de CloudWatch requieren 3 puntos de datos que alcancen el promedio de destino para activar la política de escalado automático. Si su función experimenta ráfagas rápidas de tráfico, usar la estadística Máximo en lugar de la estadística Promedio puede resultar más eficaz a la hora de escalar la simultaneidad aprovisionada y minimizar los arranques en frío.

Para obtener más información acerca de las políticas de escalado de seguimiento de destino, consulte Políticas de escalado de seguimiento de destino para el Auto Scaling de aplicaciones.