📝 Como listar la concurrencia reservada y aprovisionada de nuestras Lambdas ⚡.
La concurrencia en funciones lambdas se refiere al nmero de solicitudes que una funcin puede manejar simultneamente. Existen dos tipos principales de control de concurrencia:
Concurrencia reservada: Establece un lmite mximo de instancias simultneas para una funcin especfica, garantizando que otras funciones no utilicen esa capacidad. No tiene costos y no mejora el Cold start. El lmite por cuenta de la concurrencia reservada es de 1000, se puede aumentar a nivel de cuenta.
Concurrencia aprovisionada: Mantiene un nmero fijo de entornos de ejecucin pre inicializados para una funcin, asegurando que estn listos para manejar solicitudes sin demora. Tiene un costo 💵adicional y ayuda a mejorar el Cold Start . Son Lambdas que estn siempre encendidas .
Bien, con esto en mente supongamos un escenario donde tenemos una regin con ms de 70 lambdas desplegadas y por alguna razn, no tenemos control sobre como est distribuida la concurrencia entre estas lambdas.
Con este escenario podemos intentar ir a AWS cli, o crear un Script de Python (u otro lenguaje) para consultar a travs del SDK (Boto3), y en ese momento nos daremos cuenta de que posiblemente nos retorne cero cuando el panel de Amazon y el costo nos est indicando que tenemos concurrencia reservada:
💡 Bien, lo que sucede es que no podemos realizar la consulta si el rol o el usuario que estamos usando para consultar no tiene permisos(🔏)para acceder a esta informacin de las lambdas.
Solucin Alternativa y Reutilizable
Como no podra ser de otra manera para quien me ha ledo antes, la solucin propuesta es una Lambda 😀que haga este trabajo, desplegado con AWS Sam, y que podemos desplegar y destruir de manera rpida y en distintas regiones.
Cdigo Fuente
https://github.com/olcortesb/list-lambda-provisioned-reserved
Repositorio con todo el codigo que se presenta en este post
Los permisos:
El primer punto es definir la infraestructura y definir los permisos correspondientes.
# https://github.com/olcortesb/list-lambda-provisioned-reserved/blob/main/template.yaml AWSTemplateFormatVersion: '2010-09-09'Transform: AWS::Serverless-2016-10-31Description: List Lambda provisioned reservedResources: ListFunction: Type: AWS::Serverless::Function Properties: CodeUri: src/ Handler: lambda.lambda_handler Runtime: python3.10 Architectures: [arm64] Timeout: 900 Policies: - Version: '2012-10-17' Statement: - Effect: Allow Action: - lambda:GetFunctionConcurrency - lambda:ListFunctions - lambda:ListProvisionedConcurrencyConfigs Resource: "*"
Los permisos relacionados con Provicioned y concurrency son los que permiten acceder a los atributos.
El cdigo:
El cdigo est basado en Boto3 y lo que hacemos es consultar por todas las lambdas y revisar cules tienen configuraciones de concurrencia.
# https://github.com/olcortesb/list-lambda-provisioned-reserved/tree/main/src# Base on https://repost.aws/knowledge-center/lambda-provisioned-reserved-concurrencyimport osimport boto3def lambda_handler(event, context): ... try: response = lambda_client.get_function_concurrency( FunctionName=function_name ) if 'ReservedConcurrentExecutions' in response: count += 1 reserved_concurrency = response['ReservedConcurrentExecutions'] print(f"{count}. Function Name: {function_name}, Reserved Concurrency: {reserved_concurrency}") except lambda_client.exceptions.ResourceNotFoundException: pass except Exception as e: print(f"Error retrieving concurrency for {function_name}: {e}") try: response = lambda_client.list_provisioned_concurrency_configs( FunctionName=function_name ) if 'ProvisionedConcurrencyConfigs' in response and response['ProvisionedConcurrencyConfigs']: provisioned_concurrency = response['ProvisionedConcurrencyConfigs'][0]['RequestedProvisionedConcurrentExecutions'] count += 1 print(f"{count}. Function Name: {function_name}, Provisioned Concurrency: {provisioned_concurrency}") except lambda_client.exceptions.ResourceNotFoundException: pass except Exception as e: print(f"Error retrieving provisioned concurrency for {function_name}: {e}")
Resultados
Ale ejecutar la funcin recorrer todas las lambdas que tenemos en la regin donde la hemos desplegado y validara si tienen configurada concurrencia reservada o provisionada respectivamente, dndonos un listado de las funciones y la cantidad de concurrencia. Para este ejemplo lo sacamos en un log, pero se puede obtener va API o enviarlo a algn lugar que concentre los reportes de nuestra infraestructura
Function Logs:START RequestId: 253fe873-d35c-44e2-8593-f6a43b9cecc3 Version: $LATESTTotal functions 751. Function Name: fibonacci-x86-n4, Reserved Concurrency: 52. Function Name: fibonacci-x86-n4, Provisioned Concurrency: 1END RequestId: 253fe873-d35c-44e2-8593-f6a43b9cecc3REPORT RequestId: 253fe873-d35c-44e2-8593-f6a43b9cecc3 Duration: 8857.61 ms ...
Conclusin
Probamos como poder obtener los datos de nuestra concurrencia en una regin especfica.
Identificamos los permisos necesarios para que la lambda pueda consultar por estos permisos
Sacamos en un log los resultados como prueba bsica, pudiendo enviarlos a distintos destinos o devolviendo mediante una API de ser necesario
Referencias
https://github.com/olcortesb/list-lambda-provisioned-reserved
https://docs.aws.amazon.com/es_es/lambda/latest/dg/provisioned-concurrency.html
https://repost.aws/knowledge-center/lambda-provisioned-reserved-concurrency
Artículo original: 📝 Como listar la concurrencia reservada y aprovisionada de nuestras Lambdas ⚡.