Administración de la simultaneidad para una función de Lambda - AWS Lambda

Administración de la simultaneidad para una función de Lambda

La simultaneidad es el número de solicitudes que la función atiende en un momento dado. Cuando se invoca la función, Lambda asigna una instancia para procesar el evento. Cuando el código de la función termina de ejecutarse, puede encargarse de otra solicitud. Si la función se invoca de nuevo mientras se sigue procesando una solicitud, se asigna otra instancia, lo que aumenta la simultaneidad de la función. La simultaneidad está sujeta a una cuota regional que comparten todas las funciones de una región.

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 concurrencia reservada y aprovisionada. Para obtener más información sobre cómo interactúa la concurrencia con el escalado, consulte Escalado de funciones de Lambda.

Para asegurarse de que una función pueda alcanzar siempre cierto nivel de simultaneidad, configure la función con simultaneidad reservada. Cuando una función ha reservado simultaneidad, ninguna otra función puede usarla. La simultaneidad reservada también limita la simultaneidad máxima para la función y se aplica a la función como un todo, incluyendo versiones y alias.

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. A medida que la función aumenta, esto provoca que la parte de las solicitudes que atienden nuevas instancias tenga una latencia mayor que el resto.

Para que su función pueda escalar sin fluctuaciones en la latencia, utilice la simultaneidad aprovisionada. 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 muy baja. Puede configurar la simultaneidad aprovisionada en una versión de una función o en un alias.

Lambda también se integra con Auto Scaling de aplicaciones. Puede configurar Auto Scaling de aplicaciones para administrar la simultaneidad aprovisionada según una programación o basándose en la utilización. Utilice el escalado programado para aumentar la simultaneidad aprovisionada para prever picos de tráfico. Para aumentar automáticamente la concurrencia aprovisionada según se requiera, utilice la API de Auto Scaling de aplicaciones para registrar un objetivo y crear una política de escalado.

La simultaneidad aprovisionada cuenta en las cuotas regionales y de simultaneidad reservadas 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.

nota

No puede asignar más concurrencia aprovisionada que la concurrencia reservada para una función.

Configuración de la simultaneidad reservada

Para administrar la configuración de la simultaneidad reservada para una función, utilice la consola de Lambda.

Para reservar la simultaneidad para una función

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

  2. Elija una función.

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

  4. En Simultaneidad, elija Editar.

  5. Seleccione Simultaneidad de reserva. Escriba la cantidad de simultaneidad que reservar para la función.

  6. Seleccione Save.

Puede reservar hasta el valor de Unreserved account concurrency (Simultaneidad de cuenta no reservada) mostrado, menor a 100 para funciones que no tienen simultaneidad reservada. Para aplicar la limitación controlada a una función, establezca la concurrencia reservada en cero. Esto impide que los eventos se procesen hasta que elimine el límite.

El ejemplo siguiente muestra dos funciones con grupos de simultaneidad reservada, y el grupo de simultaneidad no reservada usado por otras funciones. Los errores de restricción ocurren cuando toda la simultaneidad de un grupo está en uso.


        Simultaneidad reservada asignada a dos funciones.

Legend

  • Simultaneidad de la función

  • Simultaneidad reservada

  • Simultaneidad no reservada

  • Limitación.

La reserva de simultaneidad tiene los siguientes efectos.

  • Otras funciones no pueden evitar que la función se escale: todas las funciones de su cuenta en la misma región sin simultaneidad reservada comparten el grupo de simultaneidad no reservada. Sin simultaneidad reservada, otras funciones pueden utilizar toda la simultaneidad disponible. Esto impide que la función se amplíe cuando sea necesario.

  • Su función no se puede escalar fuera de control: la simultaneidad reservada también limita que la función utilice la simultaneidad de un grupo no reservado, lo que limita su simultaneidad máxima. Puede reservar simultaneidad para evitar que la función utilice toda la simultaneidad disponible en la región o que sobrecargue los recursos empleados posteriormente.

La configuración de la simultaneidad por función puede afectar al grupo de simultaneidad que está disponible para otras funciones. Para evitar problemas, limite el número de usuarios que pueden utilizar las operaciones de la API PutFunctionConcurrency y DeleteFunctionConcurrency.

Configuración de simultaneidad aprovisionada

Para administrar la configuración de simultaneidad aprovisionada para una versión o alias, utilice la consola de Lambda.

Para aprovisionar la simultaneidad de un alias

  1. Abra la página de 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.

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.

En el ejemplo siguiente, las funciones my-function-DEV y my-function-PROD se configuran tanto con simultaneidad reservada como con simultaneidad aprovisionada. En my-function-DEV, el grupo completo de simultaneidad reservada también es simultaneidad aprovisionada. En este caso, todas las invocaciones o bien se ejecutan en simultaneidad aprovisionada o bien están limitadas. En my-function-PROD, una parte del grupo de simultaneidad reservada es simultaneidad estándar. Cuando se utiliza toda la simultaneidad aprovisionada, la función se ajusta a la simultaneidad estándar para atender cualquier solicitud adicional.


        Función con simultaneidad reservada y simultaneidad aprovisionada.

Legend

  • Simultaneidad de la función

  • Simultaneidad reservada

  • Simultaneidad aprovisionada

  • Simultaneidad no reservada

  • Limitación.

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.

Legend

  • 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.

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. Tampoco puede asignar simultaneidad aprovisionada en un alias que apunte a la versión no publicada ($LATEST).

Cuando cambia la versión a la que apunta un alias, la simultaneidad aprovisionada se desasigna de la versión antigua y, a continuación, se asigna a la nueva. Puede añadir una configuración de direccionamiento a un alias que tenga simultaneidad aprovisionada. Sin embargo, no puede administrar la configuración de simultaneidad aprovisionada en el alias mientras la configuración de direccionamiento está aplicada.

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

Métricas de simultaneidad aprovisionada

  • ProvisionedConcurrentExecutions

  • ProvisionedConcurrencyInvocations

  • ProvisionedConcurrencySpilloverInvocations

  • ProvisionedConcurrencyUtilization

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

Configuración de simultaneidad con la API de Lambda

Para administrar la configuración de simultaneidad y autoescalado con la AWS CLI o el SDK de AWS, utilice las siguientes operaciones de la API.

Para configurar la simultaneidad reservada con la AWS CLI, use el comando put-function-concurrency. El comando siguiente reserva una simultaneidad de 100 para una función llamada my-function:

aws lambda put-function-concurrency --function-name my-function --reserved-concurrent-executions 100

Debería ver los siguientes datos de salida:

{ "ReservedConcurrentExecutions": 100 }

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 configurar Auto Scaling de aplicaciones para administrar la simultaneidad aprovisionada, utilice Application Auto Scaling para configurar el escalado de seguimiento de destino. Primero, registre el alias de una función como destino de escala. 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

A continuación, aplique una política de escalado al destino. 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.

Legend

  • Instancias de función

  • Solicitudes abiertas

  • Simultaneidad aprovisionada

  • Simultanidad estándar

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 } }