DEV Community

Cover image for 📝 Como listar la concurrencia reservada y aprovisionada de nuestras Lambdas ⚡.
olcortesb for AWS Español

Posted on

📝 Como listar la concurrencia reservada y aprovisionada de nuestras Lambdas ⚡.

Source: https://olcortesb.hashnode.dev/como-listar-la-concurrencia-reservada-y-aprovisionada-de-nuestras-lambdas

La concurrencia en funciones lambdas se refiere al número de solicitudes que una función puede manejar simultáneamente. Existen dos tipos principales de control de concurrencia:

  • Concurrencia reservada: Establece un límite máximo de instancias simultáneas para una función específica, garantizando que otras funciones no utilicen esa capacidad. No tiene costos y no mejora el Cold start. El límite por cuenta de la concurrencia reservada es de 1000, se puede aumentar a nivel de cuenta.

  • Concurrencia aprovisionada: Mantiene un número fijo de entornos de ejecución pre inicializados para una función, asegurando que estén listos para manejar solicitudes sin demora. Tiene un costo 💵adicional y ayuda a mejorar el Cold Start ❄️. Son Lambdas que están siempre encendidas ⚠️.

Bien, con esto en mente supongamos un escenario donde tenemos una región con más de 70 lambdas desplegadas y por alguna razón, 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 través 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:

Image description

💡 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 información de las lambdas.

Solución Alternativa y Reutilizable

Como no podría ser de otra manera para quien me ha leído antes, la solución propuesta es una Lambda 😀que haga este trabajo, desplegado con AWS Sam, y que podemos desplegar y destruir de manera rápida y en distintas regiones.

Código 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-31 Description: List Lambda provisioned reserved Resources: 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: "*" 
Enter fullscreen mode Exit fullscreen mode

Los permisos relacionados con Provicioned y concurrency son los que permiten acceder a los atributos.

El código:

El código está basado en Boto3 y lo que hacemos es consultar por todas las lambdas y revisar cuáles 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-concurrency import os import boto3 def 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}") 
Enter fullscreen mode Exit fullscreen mode

Resultados

Ale ejecutar la función recorrerá todas las lambdas que tenemos en la región donde la hemos desplegado y validara si tienen configurada concurrencia reservada o provisionada respectivamente, dándonos un listado de las funciones y la cantidad de concurrencia. Para este ejemplo lo sacamos en un log, pero se puede obtener vía API o enviarlo a algún lugar que concentre los reportes de nuestra infraestructura

Function Logs: START RequestId: 253fe873-d35c-44e2-8593-f6a43b9cecc3 Version: $LATEST Total functions 75 1. Function Name: fibonacci-x86-n4, Reserved Concurrency: 5 2. Function Name: fibonacci-x86-n4, Provisioned Concurrency: 1 END RequestId: 253fe873-d35c-44e2-8593-f6a43b9cecc3 REPORT RequestId: 253fe873-d35c-44e2-8593-f6a43b9cecc3 Duration: 8857.61 ms ... 
Enter fullscreen mode Exit fullscreen mode

Conclusión

  • Probamos como poder obtener los datos de nuestra concurrencia en una región específica.

  • Identificamos los permisos necesarios para que la lambda pueda consultar por estos permisos

  • Sacamos en un log los resultados como prueba básica, pudiendo enviarlos a distintos destinos o devolviendo mediante una API de ser necesario

Referencias

Top comments (0)