Crear layers para Lambdas python desde la consola de AWS

Crear layers para Lambdas python desde la consola de AWS

¿Aún atascas tu zip con librerías?

Cargar librerías en el zip del código puede provocar que nuestra función Lambda pese tanto que no nos permita hacer el deploy o, en su defecto, que no nos muestre el editor de código fuente, lo cuál es útil (pero no recomendable) para cuando hay que hacer ajustes rápidos en el código sin necesidad de volver a deployar la función completa. Hay que recordar que las funciones Lambda están pensadas para microservicios.

Otra práctica común al hablar de microservicios es tener varias funciones en el mismo repo; al tratarse del mismo código vamos a necesitar las mismas librerías en todas nuestras funciones, eso nos obliga a que, cuando se agregue una nueva librería y haya que actualizar el código de una Lambda ya deployada, tengamos que actualizar no sólo el código, sino también las librerías a pesar de que el cambio haya sido sólo de unas cuantas líneas de código.

Una solución es usar layers, pues se crean una sola vez y pueden ser compartidos por cualquier cantidad de funciones compatibles, además tiene un sistema de versiones, el cual nos permite cambiar entre versiones del mismo layer por si hay que hacer un rollback.

Una herramienta que resulta muy útil a la hora de crear layers es el CloudShell, el cuál nos permite usar un shell de una instancia Amazon Linux 2, la misma que se utiliza en Lambda, por lo tanto nos resuelve posibles problemas de compatibilidad.

Abrir el CloudShell

Una vez deployado el código, si lo probamos y truena debido a falta de librerías.

Hay que abrir en otra pestaña el CloudShell que se encuentra en un botón arriba a la derecha.

Instalar python

Cuando la consola termine de cargar hay que instalar la versión de python que necesitemos. Hay que recordar que todo lo que instalamos en esta consola es temporal, por lo tanto al reiniciar la consola hay que volver a instalar python.

Python 3.8

sudo amazon-linux-extras enable python3.8
sudo yum install python3.8
python3.8 --version

Python 3.9

sudo yum -y groupinstall "Development Tools"
sudo yum -y install openssl-devel bzip2-devel libffi-devel
sudo wget https://www.python.org/ftp/python/3.9.10/Python-3.9.10.tgz
sudo tar xvf Python-3.9.10.tgz
cd Python-*/
./configure --enable-optimizations
sudo make altinstall
python3.9 --version

Entorno virtual

cd ~
python3.8 -m venv env
python3.9 -m venv env
source env/bin/activate
python --version

Creación de carpetas para layers

Antes de poder instalar las librerías hay que crear las carpetas para que Lambda las entienda.

Python 3.8

mkdir -p python/lib/python3.8/site-packages
cd python/lib/python3.8/site-packages

Python 3.9

mkdir -p python/lib/python3.9/site-packages
cd python/lib/python3.9/site-packages

Instalar librerías

Dentro de la carpeta site-packages se pueden instalar las librerías necesarias con el siguiente comando:

pip install <nombre_de_la_librería> -t .

Zippear y descargar las librerías

cd ~
zip -r python.zip python/*
pwd

Crear el layer

Nota: A pesar de que nos deja escoger más de un runtime, no es recomendable meter más de uno por capa, ya que tendríamos que duplicar las librerías para cada versión, es decir, tendríamos en la carpeta python/lib dos carpetas, una para python3.8 y otra para python3.9 y si queremos meter alguna librería muy pesada, como por ejemplo pandas, un sólo layer con dos pandas excede el tamaño permitido.

Nota: Es posible separar en varios layers las librerías si es que pesan demasiado para un sólo layer, sin embargo, la función también tiene un límite de tamaño permitido de 262144000 bytes.

Agregar el layer a la función

Pro tip

Se puede descargar un layer ya creado y sólo instalar las librerías faltantes.

source env/bin/activate
python --version
unzip <archivo>.zip

Actualizar un layer

Es importante seleccionar la misma arquitectura y runtime de la Lambda, si no el layer no estará disponible.

Paso final

Si todas las librerías fueron instaladas correctamente, la Lambda se debería ejecutar sin errores de importación de módulos.

Luego de asegurarnos que la Lambda corre, ahora sí podemos generar una versión definitiva del layer, la cuál vamos a poder utilizar en todas las funciones que requieran ese set de librerías.

Comparte lo bueno:

Escribe un comentario

Tu correo electrónico no será publicado.

Este sitio está protegido por reCAPTCHA y se aplican la política de privacidad y los términos de servicio de Google.