AWS Lambda es un servicio que permite ejecutar código sin preocuparnos por la infraestructura de los servidores donde corren -Serverless-. Esto lo convierte en un servicio muy potente y práctico para implementar una gran variedad de proyectos.

AWS Lambda es compatible de forma nativa con Java, Go, PowerShell, Node.js, C#, Python y Ruby.

AWS Lambda incluye los módulos integrados en la versión de Python que despliegues (2.7, 3.6, 3.7, 3.8 o 3.9) como por ejemplo json. Adicionalmente, incluye boto3 ya que es la librería oficial de AWS para las integraciones de nuestras aplicaciones en Python con los servicios de AWS como S3, EC2, DynamoDB entre otros.

Tiempos de ejecución de Python

NombreAWS SDKSistema OperativoArquitecturas
python3.9boto3-1.18.55 botocore-1.21.55Amazon Linux 2x86_64, arm64
python3.8boto3-1.18.55 botocore-1.21.55Amazon Linux 2x86_64, arm64
python3.7boto3-1.18.55 botocore-1.21.55Amazon Linuxx86_64
python3.6boto3-1.18.55 botocore-1.21.55Amazon Linuxx86_64
python2.7boto3-1.17.100 botocore-1.20.100Amazon Linuxx86_64

Fuente: AWS

Evidentemente, en la gran mayoría de los casos de uso de funciones Lambda con Python, vamos a requerir utilizar librerías externas que nos ayuden a codificar la lógica de nuestra función.

En este ejemplo práctico, vamos a aprovisionar una función Lambda para ejecutarse con Python 3.9 incluyendo la librería pandas.

Lo primero que debemos hacer es crear la función Lambda a través de la interfaz de consola de AWS:

  • Seleccione la opción de “Comience con un ejemplo simple de Hello World”.
  • Escriba un nombre apropiado para su función Lambda.
  • Seleccione el runtime Python 3.9.
  • Seleccione la arquitectura x86_64.
  • En permisos seleccione la opción “Cree un nuevo rol con permisos básicos de Lambda”.
  • Clic en el botón Create functions.

Luego, debemos preparar una capa de Python con librería Pandas:

La librería pandas es un potente kit de herramientas de análisis de datos de Python. Cuando se instala pandas, de manera automática el sistema instala otras dependencias de pandas como lo son pytz, python-dateutil y numpy.

Con Numpy pasa un caso particular y es que su compilación deber ser exactamente igual a la máquina en la que se va a ejecutar. Si revisamos el cuadro donde vemos las características de cada runtime de Python vemos que la versión 3.9 se va a ejecutar en Lambda en un sistema operativo Amazon Linux 2. Por tanto es necesario que numpy sea compilado en una máquina igual.

Para resolver esto, lo que vamos a hacer es:

  1. Crear una instancia de EC2 con Amazon Linux 2.

  2. En la EC2 Instalar Python 3.9 - Podemos seguir esta guía

  3. Instalar virtualenv

    pip3.9 install virtualenv

  4. Crear un directorio, por ejemplo: compilacion-pandas y allí crear un entorno virtual.

    virtualenv venv

    source venv/bin/activate

  5. Instalar pandas

    pip3.9 install pandas

  6. Copiar lib o lib64 a un directorio llamado python.

    cp -r /home/ec2-user/pandas/venv/lib64 /home/ec2-user/pandas/venv/python

  7. Renombrar lib64 a lib

    mv lib64 lib

  8. Ir a la raiz de la instancia e instalar AWS CLI

    curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip" unzip awscliv2.zip sudo ./aws/install

  9. Eliminar basura, comprimir en .zip la carpeta python y enviarla a S3

    rm -r *.whl *.dist-info __pycache__

    zip -r9 pandas39.zip python

    aws s3 cp pandas39.zip s3://bucket-0574-base

En este punto ya tenemos en S3 nuestro .zip con pandas compilado en una máquina Amazon Linux 2.

Ahora lo úlitmo que debemos hacer es ir ala función Lambda y en el apartado Layers crear un nuevo Layer compatible con el rumtime Python 3.9 y la arquitectura x86_64 y finalmente cargamos el .zip desde S3.

Recursos complementarios:

Ideas sueltas:

  • Es fundamental aprender a realizar esta misma configuración pero desde el enfoque de infraestructura como código.