Tunea tus funciones Lambda
Tags: aws, lambda
Published: 2023-03-09 23:30:50



Las funciones Lambda tienen un tiempo limitado a 15 minutos para procesar cada solicitud. Por este motivo debemos seleccionar de manera optima la cantidad de memoria que asignamos a nuestra función.

Con el objetivo de encontrar el rendimiento optimo para nuestra función se creo un proyecto en [Git - aws-lambda-power-tuning
Public](https://github.com/alexcasalboni/aws-lambda-power-tuning) que nos va ayudar a encontrar la cantidad de memoria que requiere nuestra función para su optimo funcionamiento.

Este proyecto crea un Step Function que de acuerdo a los parámetros de memoria que le enviamos va a ejecutar la función Lambda que definamos, retornándonos los tiempos de respuesta y un consto aproximado por ejecución de cada una de los parámetros que le definimos.

En la pagina del proyecto podemos encontrar diferentes formas de realizar el despliegue de los servicios requeridos para ejecutarlo. En este caso vamos a utilizar el despliegue usando SAM como lo mencionan en la [pagina - opción 2](https://github.com/alexcasalboni/aws-lambda-power-tuning/blob/master/README-DEPLOY.md).
Nota: hay que tener [Docker](https://www.docker.com/) instalado y corriendo para poder ejecutar la plantilla de SAM.

```
Install the AWS SAM CLI in your local environment.

Configure your AWS credentials (requires AWS CLI installed):

$ aws configure
Clone this git repository:

$ git clone https://github.com/alexcasalboni/aws-lambda-power-tuning.git
Build the Lambda layer and any other dependencies (Docker is required):

$ cd ./aws-lambda-power-tuning
$ sam build -u
sam build -u will run SAM build using a Docker container image that provides an environment similar to that which your function would run in. SAM build in-turn looks at your AWS SAM template file for information about Lambda functions and layers in this project.

Once the build has completed you should see output that states Build Succeeded. If not there will be error messages providing guidance on what went wrong.

Deploy the application using the SAM deploy "guided" mode:

$ sam deploy -g

```
En el transcurso del despliegue nos va ir solicitando algunos datos que utiliza la plantilla para su despliegue, los cuales podemos dejar los que vienen por defecto dando ENTER cuando nos los solicite.


Una vez desplegada la infraestructura, vamos a crear una función Lambda a la cual queremos hacer un tuning en la asignación de la memoria. Esta función nos ayuda a calcular el factorial de un numero grande. Se eligió este tipo de calculo ya que puede tardar varios segundos.

![Crear funcion](https://github.com/cecamilo00/posts/blob/circleci-project-setup/LambdaTuning/funcionfactorial.png?raw=true)

Pegamos el código fuente y damos click en **Deploy**

```
import json
import sys
sys.set_int_max_str_digits(1000000000)

def CalcularFactorial(numero):
    resultado = 1
    for i in range(1, numero+1):
        resultado *= i
    return resultado


def lambda_handler(event, context):
    numero = 30000
    print(CalcularFactorial(numero))
```
![Asignar codigo]
(https://github.com/cecamilo00/posts/blob/circleci-project-setup/LambdaTuning/asignar%20codigo%202.png?raw=true)

Ahora que hemos creado la función Lambda, vamos a realizar las pruebas de tuning, para esto vamos a buscar el servicio Step Functions y la función que comienza con el nombre _powerTuningStateMachine_.

![Step Function]
(https://github.com/cecamilo00/posts/blob/circleci-project-setup/LambdaTuning/step%20function.png?raw=true)

Damos click en el nombre y despues en _Star Execution_.

![Star Function]
(https://github.com/cecamilo00/posts/blob/circleci-project-setup/LambdaTuning/start%20execution1.png?raw=true)

Después ingresamos los parámetros que requiere la función:

```
{
    "lambdaARN": "arn:aws:lambda:us-east-1:385033107168:function:Factorial",
    "powerValues": [256, 512, 1024],
    "num": 50,
    "payload": {},
    "strategy": "balanced"
}

```
En este caso le pasamos el arn de la función Lambda que acabamos de crear, la cantidad de memoria con la cual queremos que se ejecute, el numero de ejecuciones y la estrategia que es este caso es _balanced_, que sirve para encontrar la mejor relación velocidad precio por ejecución. Podemos encontrar la documentación de los parametros en este [link](https://github.com/alexcasalboni/aws-lambda-power-tuning/blob/master/README-INPUT-OUTPUT.md#user-content-state-machine-input).

![Star Function 2]
(https://github.com/cecamilo00/posts/blob/circleci-project-setup/LambdaTuning/start%20execution%203.png?raw=true)

Ahora veamos el resultado de la ejecución:

![Result 1]
(https://github.com/cecamilo00/posts/blob/circleci-project-setup/LambdaTuning/result%20execution%201.png?raw=true)

En esta ejecución podemos identificar que el tiempo (3 segundos) que tiene configurado por defecto la función Lambda no es suficiente para completar la tarea que debe realizar. Lo que debemos hacer es incrementar el tiempo que tiene la función Lambda para completar la tarea.
Vamos a la función Lambda y modificamos el tiempo de ejecución.

![General Configuration]
(https://github.com/cecamilo00/posts/blob/circleci-project-setup/LambdaTuning/general%20configuration.png?raw=true)

Definimos el tiempo a 3 minutos.

![Set Time]
(https://github.com/cecamilo00/posts/blob/circleci-project-setup/LambdaTuning/basic%20settings1.png?raw=true)

Modificado el tiempo de ejecución vamos nuevamente a la _Step Fuction_ y damos click en _Start Execution_ y copiamos los parámetros anteriores.

![Final Execution]
(https://github.com/cecamilo00/posts/blob/circleci-project-setup/LambdaTuning/final%20result%201.png?raw=true)

Al terminar la ejecución podemos ver los resultados del análisis el cual nos indica que la cantidad de memoria que que tiene mejor relación tiempo - precio es 1024.En caso que deseemos ver los resultados de una manera mas gráfica podemos copiar el link que aparece en el output y pegarlo en un navegador y veremos una pagina como la siguiente:

![Graphics Results]
(https://github.com/cecamilo00/posts/blob/circleci-project-setup/LambdaTuning/graphic%20result.png?raw=true)

EL gráfico nos facilita realizar el análisis del comportamiento de la función de acuerdo a la cantidad de memoria asignada a la función Lambda.

Por ultimo si no queremos tener los servicios que se desplegaron con SAM debemos ir a CloudFormation y eliminar la plantilla para que se borren todos los servicios.

![Delete Template]
(https://github.com/cecamilo00/posts/blob/circleci-project-setup/LambdaTuning/delete%20template.png?raw=true)

Me pueden encontrar en

[Camilo Cabrales](https://www.linkedin.com/in/camilo-cabrales-31a0bb53/)

# Referencias

[Despliegue Lambda Power Tools](https://github.com/alexcasalboni/aws-lambda-power-tuning/blob/master/README-DEPLOY.md)
[Cuotas Lambda](https://docs.aws.amazon.com/es_es/lambda/latest/dg/gettingstarted-limits.html)