Administración de la simultaneidad aprovisionada de Lambda - AWS Lambda

Administración de la simultaneidad aprovisionada de Lambda

Hay dos tipos de controles de concurrencia disponibles:

  • Concurrencia reservada: la concurrencia reservada garantiza el número máximo de instancias simultáneas para la función. Cuando una función ha reservado simultaneidad, ninguna otra función puede usarla. No hay ningún cargo por configurar la concurrencia reservada para una función.

  • Concurrencia aprovisionada: la concurrencia aprovisionada inicializa un número solicitado de entornos de ejecución para que estén preparados para responder a las invocaciones de su función. Tenga en cuenta que la configuración de la concurrencia aprovisionada genera cargos en su cuenta de AWS.

En este tema se detalla cómo administrar y configurar la simultaneidad aprovisionada. Si desea configurar la simultaneidad reservada, consulte Administración de la simultaneidad reservada de Lambda.

Cuando Lambda asigna una instancia de su función, el tiempo de ejecución carga el código de su función y ejecuta el código de inicialización que ha definido fuera del controlador. Si el código y las dependencias son grandes, o si crea clientes SDK durante la inicialización, este proceso puede llevar algún tiempo. Cuando la función no se ha utilizado durante un tiempo, necesita escalar verticalmente, o cuando actualiza una función, Lambda crea entornos de ejecución nuevos. Esto provoca que la parte de las solicitudes que atienden instancias nuevas tenga una latencia mayor que el resto, lo que también se conoce como arranque en frío.

Mediante la asignación de la simultaneidad aprovisionada antes de un aumento en las invocaciones, puede asegurarse de que todas las solicitudes se atiendan mediante instancias inicializadas con una latencia baja. Las funciones de Lambda configuradas con simultaneidad aprovisionada se ejecutan con una latencia de inicio constante, lo que las hace ideales para crear backends móviles o web interactivos, microservicios sensibles a la latencia y API invocadas de forma sincrónica.

nota

La simultaneidad aprovisionada cuenta para las cuotas regionales y la simultaneidad reservada de una función. Si el volumen de simultaneidad aprovisionada en las versiones y alias de una función se suma a la simultaneidad reservada de la función, todas las invocaciones se ejecutan en la simultaneidad aprovisionada. Esta configuración también tiene el efecto de aplicar una limitación controlada a la versión sin publicar de la función ($LATEST), lo que impide que se ejecute. No puede asignar más concurrencia aprovisionada que la concurrencia reservada para una función.

Lambda también se integra con Auto Scaling de aplicaciones, lo que le permite administrar la simultaneidad aprovisionada según una programación o en función de la utilización.

Configuración de simultaneidad aprovisionada

Para administrar la configuración de simultaneidad aprovisionada para una versión o alias, utilice la consola de Lambda. Puede configurar la simultaneidad aprovisionada en una versión de una función o en un alias.

Cada versión de una función solo puede tener una configuración de simultaneidad aprovisionada. Puede ser directamente en la propia versión o en un alias que apunte a la versión. Dos alias no pueden asignar simultaneidad aprovisionada para la misma versión.

Cuando cambia la versión a la que apunta un alias, Lambda anula la asignación de la simultaneidad aprovisionada de la versión antigua y la asigna a la versión nueva. Puede añadir una configuración de direccionamiento a un alias que tenga simultaneidad aprovisionada. Para obtener más información, consulte Lambda function aliases (Alias de la función de Lambda). Tenga en cuenta que no puede administrar la configuración de simultaneidad aprovisionada en el alias mientras la configuración de enrutamiento está aplicada.

nota

La simultaneidad aprovisionada no es compatible con la versión no publicada de la función ($LATEST). Asegúrese de que la aplicación cliente no apunte a $LATEST antes de configurar la simultaneidad aprovisionada.

Asignación de simultaneidad aprovisionada a un alias o versión

  1. Abra la página de Functions (Funciones) en la consola de Lambda.

  2. Elija una función.

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

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

  5. Elija un alias o una versión.

  6. Escriba el volumen de simultaneidad aprovisionada que se asignará.

  7. Seleccione Save.

También puede configurar la simultaneidad aprovisionada mediante la API de Lambda con las siguientes operaciones:

Para asignar la simultaneidad aprovisionada para una función, utilice put-provisioned-concurrency-config. El comando siguiente asigna una simultaneidad de 100 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 los siguientes datos de salida:

{ "Requested ProvisionedConcurrentExecutions": 100, "Allocated ProvisionedConcurrentExecutions": 0, "Status": "IN_PROGRESS", "LastModified": "2019-11-21T19:32:12+0000" }

Para consultar las cuotas de simultaneidad de su cuenta en una región, utilice get-account-settings.

aws lambda get-account-settings

Debería ver los siguientes datos de salida:

{ "AccountLimit": { "TotalCodeSize": 80530636800, "CodeSizeUnzipped": 262144000, "CodeSizeZipped": 52428800, "ConcurrentExecutions": 1000, "UnreservedConcurrentExecutions": 900 }, "AccountUsage": { "TotalCodeSize": 174913095, "FunctionCount": 52 } }

Puede administrar la simultaneidad aprovisionada para todos los alias y versiones desde la página de configuración de funciones. La lista de configuraciones de simultaneidad aprovisionadas muestra el progreso de la asignación de cada configuración. Los ajustes de simultaneidad aprovisionada también están disponibles en la página de configuración para cada versión y alias.

Lambda emite las siguientes métricas para la simultaneidad aprovisionada:

Métricas de simultaneidad aprovisionada

  • ProvisionedConcurrentExecutions: el número de instancias de función que están procesando eventos en simultaneidad aprovisionada. Para cada invocación de un alias o versión con simultaneidad aprovisionada, Lambda emite el recuento actual.

  • ProvisionedConcurrencyInvocations: el número de veces que su código de función se ejecuta en simultaneidad aprovisionada.

  • ProvisionedConcurrencySpilloverInvocations: el número de veces que su código de función se ejecuta en concurrencia estándar cuando toda concurrencia aprovisionada está en uso.

  • ProvisionedConcurrencyUtilization: para una versión o alias, el valor de ProvisionedConcurrentExecutions dividido entre la cantidad total de concurrencia aprovisionada asignada. Por ejemplo, .5 indica que el 50 por ciento de la simultaneidad aprovisionada asignada está en uso.

Para obtener más información, consulte Uso de métricas de funciones de Lambda.

Optimización de la latencia con simultaneidad aprovisionada

La simultaneidad aprovisionada no se pone en línea inmediatamente después de configurarla. Lambda comienza a asignar simultaneidad aprovisionada después de uno o dos minutos de preparación. De manera similar a cómo las funciones se escalan bajo carga, se pueden inicializar hasta 3000 instancias de la función a la vez, dependiendo de la Región. Después de la ráfaga inicial, las instancias se asignan a una velocidad constante de 500 por minuto hasta que se cumple la solicitud. Cuando solicita simultaneidad aprovisionada para varias funciones o versiones de una función en la misma región, se aplican cuotas de escalado a todas las solicitudes.


      Escalado con simultaneidad aprovisionada.

Leyenda

  • Instancias de función

  • Solicitudes abiertas

  • Simultaneidad aprovisionada

  • Simultanidad estándar

Para optimizar la latencia, puede personalizar el comportamiento de inicialización para las funciones que utilizan la concurrencia aprovisionada. Puede ejecutar código de inicialización para instancias de concurrencia aprovisionadas sin afectar a la latencia, ya que el código de inicialización se ejecuta en el momento de la asignación. Sin embargo, el código de inicialización de una instancia bajo demanda afecta directamente a la latencia de la primera invocación. Para una instancia bajo demanda, puede optar por aplazar la inicialización de una capacidad específica hasta que la función necesite esa capacidad.

Para determinar el tipo de inicialización, compruebe el valor de AWS_LAMBDA_INITIALIZATION_TYPE. Lambda establece esta variable de entorno en provisioned-concurrency o on-demand. El valor de AWS_LAMBDA_INITIALIZATION_TYPE es inmutable y no cambia durante la vida útil del entorno de ejecución.

Si utiliza el tiempo de ejecución de .NET 3.1, puede configurar la variable de entorno AWS_LAMBDA_DOTNET_PREJIT para mejorar la latencia de las funciones que utilizan la concurrencia aprovisionada. El tiempo de ejecución .NET compila e inicializa perezosamente 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 invocaciones posteriores. Cuando se establece AWS_LAMBDA_DOTNET_PREJIT en ProvisionedConcurrency, Lambda realiza una compilación JIT antes del tiempo para las dependencias del sistema comunes. Lambda realiza esta optimización de inicialización solo para instancias de concurrencia aprovisionadas, lo que da como resultado un rendimiento más rápido para la primera invocación. Si establece la variable de entorno en Always, Lambda realiza una compilación JIT antes del tiempo para cada inicialización. Si establece la variable de entorno en Never, se deshabilita la compilación JIT antes del tiempo. El valor predeterminado de AWS_LAMBDA_DOTNET_PREJIT es ProvisionedConcurrency.

Para las instancias de concurrencia aprovisionadas, el código de inicialización de su función se ejecuta durante la asignación y cada pocas horas, a medida que las instancias en ejecución de la función se reciclan. Puede ver el tiempo de inicialización en registros y rastros después de que una instancia procese una solicitud. Sin embargo, la inicialización se factura incluso si la instancia nunca procesa una solicitud. La simultaneidad aprovisionada se ejecuta continuamente y se factura por separado de los costes de inicialización e invocación. Consulte Precios de AWS Lambda para obtener más información.

Para obtener más información sobre cómo optimizar las funciones mediante la simultaneidad aprovisionada, consulte la Guía del operador de Lambda.

Administración de la simultaneidad aprovisionada con Auto Scaling de aplicaciones

Auto Scaling de aplicaciones permite administrar la simultaneidad aprovisionada según una programación o basándose en la utilización. Utilice una política de escalado de seguimiento de destino si desea que la función mantenga un porcentaje de utilización especifico y un escalado programado para aumentar la simultaneidad aprovisionada para prever picos de tráfico.

Seguimiento de destino

Con el seguimiento de destino, Auto Scaling de aplicaciones crea y administra las alarmas de CloudWatch que activan la política de escalado y calcula el ajuste de escalado según la métrica y el valor de destino que usted define. Esto es ideal para aplicaciones que no tienen una hora programada de mayor tráfico, pero que tienen ciertos patrones de tráfico.

Para aumentar de forma automática la simultaneidad aprovisionada según sea necesario, utilice las operaciones de la API de Auto Scaling de aplicaciones RegisterScalableTarget y PutScalingPolicy para registrar un destino y crear una política de escalado:

  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 Auto Scaling de aplicaciones para ajustar la configuración de simultaneidad aprovisionada para que un alias mantenga la utilización cerca del 70 %.

    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 los siguientes datos de salida:

    { "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 activa cuando la utilización de la simultaneidad aprovisionada supera sistemáticamente el 70 por ciento. Cuando esto sucede, Auto Scaling de aplicaciones asigna más simultaneidad aprovisionada para reducir esta utilización. La segunda alarma se activa cuando la utilización es consistentemente inferior al 63 por ciento (90 % del objetivo del 70 por ciento). 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. Cuando aumenta el número de solicitudes abiertas, Auto Scaling de aplicaciones aumenta la simultaneidad aprovisionada en grandes pasos hasta que alcanza el máximo configurado. La función continúa escalando en la concurrencia estándar hasta que la utilización comience a disminuir. Cuando la utilización es constantemente baja, Auto Scaling de aplicaciones disminuye la concurrencia aprovisionada en pasos periódicos más pequeños.


      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

Ambas alarmas utilizan la estadística promedio de forma predeterminada. Es posible que las funciones que tienen patrones de tráfico de ráfagas rápidas no activen la simultaneidad aprovisionada para escalar verticalmente. Por ejemplo, si la función de Lambda se ejecuta rápidamente (de 20 a 100 ms) y el patrón de tráfico se presenta en ráfagas rápidas, esto puede provocar que las solicitudes entrantes superen la simultaneidad aprovisionada asignada durante la ráfaga, pero si la ráfaga no dura 3 minutos, el escalado automático no se activará. Además, si CloudWatch no obtiene tres puntos de datos que alcancen el promedio objetivo, la política de escalado automático no se activará.

Si la política de escalado no se activa y la simultaneidad aprovisionada no escala, verifique que se hayan activado las alarmas. Si no es así, implemente su función con un conjunto personalizado de alarmas CloudWatch para utilizar la estadística max.

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 Auto Scaling de aplicaciones.

Escalado programado

El escalado según una programación le permite definir su propio programa de escalado según los cambios en las cargas predecibles. Para obtener más información y ejemplos, consulte Programación de la simultaneidad aprovisionada de AWS Lambda durante el uso en horarios de actividad alta recurrente.