Menu Close

AWS Lambda – Instalando librerías y binarios

AWS Lambda - Instalando librerías y binarios

Table of Contents

1. Caso de uso

AWS Lambda es un servicio muy versátil que proporciona la capacidad de desarrollar aplicaciones a bajo costo computacional debido a que no requieren de una instancia para sus ejecuciones y solo cuesta basado en sus llamadas.

Existirán momentos donde querremos utilizar recursos que no se encuentren directamente en lambda y sean cruciales para el funcionamiento de nuestra solución, para esto utilizaremos las capas de Lambda donde podremos instalar estos paquetes y luego utilizarlos en nuestra solución como si siempre hubiesen estado instalados.

Ejemplificación: Librerías de python y archivos binario

Consideración: Si bien, se ejemplifica mediante python, podremos realizar este proceso para cualquier lenguaje de programación aceptado por Lambda.

2. Pre-requisitos

2.1. Docker

AWS Lambda corre en una imagen Linux que contiene las dependencias para correr tu código. Pero si estas utilizando Windows o OSx podemos simular un ambiente de AWS Lambda utilizando un contenedor de Docker.

Puedes conseguirlo a través del siguiente enlace.

Nota: Procura descargar Docker desktop.

3. Configuración de la imagen

Creando una imagen Lambda

  • Lo primero que haremos es ir a nuestro terminal y referirnos hasta una carpeta donde queramos almacenar dicha imagen. Una vez ahí, procederemos a correr el siguiente comando: docker pull lambci/lambda:build-python3.6

  • Nota: En este caso estamos descargando los requerimientos para proceder a crear una imagen de Lambda con Python 3.6 pero es posible utilizar otros lenguajes u otras versiones.

Simular el ambiente

  • Luego de hacer esto, procedemos a correr la imagen mediante el siguiente comando, que utiliza la carpeta actual para simular una consola bash de nuestra imagen.

    docker run -v “%cd%”:/var/task -it lambci/lambda:build-python3.6 bash

  • OSx: En caso de estar desarrollando en OSx cambiar el valor %cd% por $PWD.

Instalación de paquetes

Teniendo nuestra consola bash funcionando, podemos proceder a la instalación de los paquetes que estimemos convenientes. Para esto, crearemos una carpeta donde instalaremos las librerías para luego empaquetar dicha carpeta y poder subirla como una capa.

AWS recomienda utilizar el nombre del lenguaje utilizado para la carpeta, en nuestro caso python. Para este ejemplo instalaremos un archivo binario FFMPEG, que puedes encontrar en este enlace. Lo importante es que sea el ejecutable del programa.

Step 1: Creando carpeta

  • Utilizaremos el siguiente comando: mkdir python

Step 2: Agregando binarios

Cualquier binario ejecutable que queramos agregar a nuestra imagen debemos agregarla al directorio principal. Para este ejemplo, descargaremos la última versión de FFMPEG, descomprimimos el archivo y copiamos los archivos ffmpeg y ffprobe a la carpeta que creamos en el paso anterior.

Step 3: Instalar otros recursos del lenguaje

A través de nuestra consola bash, entraremos a la carpeta e instalaremos en ella las dependencias. Por ejemplo si quisiésemos instalar pandas lo haríamos como en una instalación normal de python pero agregando la bandera -t para especificar donde se realizará la instalación junto con ./ para hacer referencia a la carpeta actual.

  • cd python
  • pip install pandas -t ./

Step 4: Comprimir recursos

Para poder ser utilizado como una capa, debemos comprimir el archivo en un .zip. AWS requiere que estos archivos se encuentre con todos los permisos, no solo de lectura, lamentablemente si estas en Windows no importa que cambies la configuración de cada archivo pues al comprimirlo se perderá esta información.

Para solucionar esto se puede utilizar el archivo zip_chmod777.py, con el cual se puede modificar cada archivo interno y entregarle los permisos.


Archivo zip_chmod777.ph
from zipfile import ZipInfo, ZipFile, ZIP_DEFLATED

def access_handler(name):
    old_zipname = name
    new_zipname = ‘layer_’ + name  

    old_zip = ZipFile(old_zipname,’r’)
    new_zip = ZipFile(new_zipname, ‘w’, compression=ZIP_DEFLATED)

    for file_name in old_zip.namelist():
        zip_info = ZipInfo(file_name)
        zip_info.compress_type = ZIP_DEFLATED
        zip_info.create_system = 3 # Specifies Unix
        zip_info.external_attr = 0o777 << 16 # Sets chmod 777 on the file
        new_zip.writestr(zip_info, old_zip.read(file_name)) # You have to write the file contents in with ZipInfo

    old_zip.close()
    new_zip.close()

if __name__ == “__main__”:
    name = input(‘Zip File name: ‘)
    if ‘.zip’ not in name:
        name += ‘.zip’
    access_handler(name)


En términos generales lo que se hace en esta función, es recibir el nombre de un archivo comprimido tipo zip y se crea uno nuevo con el prefijo layer_.

Luego a cada archivo dentro del zip original, se le especifican 3 puntos, el tipo de compresión, el sistema operativo (que utilizaremos 3 para referenciar Unix) y añadiremos un atributo externo donde el código ahí presente 0o777 << 16 le otorga todos los permisos a los archivos. Finalmente se guarda el nuevo archivo.

Podemos correr este archivo llamándolo a través de una consola o haciendole doble click desde el directorio que almacena nuestro zip.

Importante: Una vez hecho esto, borre el zip original y cambie el nombre del zip nuevo para que sea de la forma recomendada por AWS.

4. Configuración de la capa

Almacenando el recurso en la nube

Existen ciertas políticas sobre cuanto es el peso adecuado para subir el archivo directamente a la capa que crearemos en Lambda o bien si deberemos almacenarlo en algún Bucket en S3. Para esto ya teníamos configurado un Bucket donde estábamos realizando conversión de audio a texto. Ahí mismo creamos una carpeta llamada libs (nombrado convenientemente, no hay requerimiento que impida nombrarlo como queramos) y subímos el archivo comprimido ahí.

Importante: Copia el link al archivo pues lo necesitaremos más adelante.

Creando una Capa de Lambda

  • Lo primero será dirigirnos a nuestra consola AWS y entrar en Lambda.

  • Una vez dentro, entraremos en la sección Capas o Layers.

  • Luego crearemos una nueva capa donde nos desplegará un formulario


  • Aquí, ingresaremos un nombre representativo de la capa y, si bien es optativo, se recomienda ingresar alguna descripción pues podremos realizar versionamientos de la capa y la descripción nos permitirá reconocer que versión de la capa necesitamos utilizar. Luego seleccionamos la opción Cargar un archivo de Amazon S3 y colocamos el link del archivo que subimos en la sección anterior. Finalmente pero no menos importante, seleccionamos el/los tiempo/s de ejecución compatibles con nuestro paquete, para este caso nosotros pondremos Python3.6.

Agregar la capa a la función Lambda

  • Finalmente, para poder utilizar estas librerías nos dirigiremos a la función que estamos implementando


  • Seleccionamos la parte que dice Layers y en el menú inferior
  • Recordatorio: El recurso estará disponible y visible solo para funciones que comparta el tiempo de ejecución que definimos anteriormente.
  • Eso es todo, ya podemos utilizar el recurso en nuestra función, particularmente para el ejemplo que hemos realizado, podemos utilizar el binario de ffmpeg desde la carpeta local en lambda
  • FFMPEG = ‘/opt/python/ffmpeg’  Y llamarla mediante un sub-proceso # INPUT: audio_filename.extension def convert(filename, extension=‘mp3’):
  • CMD = “{0} -i {1} {2}”.format(FFMPEG,TEMP+filename,TEMP+filename.split(‘.’)[0]+‘.{0}’.format(extension)) process = subprocess.check_output(CMD, shell=True, stderr=subprocess.STDOUT, stdin=subprocess.DEVNULL)
    return process

5. Referencias

Escríbanos

Publicado en »Blog Español

Close Bitnami banner
Bitnami