Anaconda en AWS Lambda con imagen de contenedor

anaconda

Use Anaconda en AWS Lambda con imagen de contenedor

Anaconda es una distribución de Python que facilita la instalación de Python, además de varias de sus bibliotecas de terceros más utilizadas, de manera flexible en una máquina con Windows o Linux. Sin embargo, no existe una manera fácil de utilizar estas bibliotecas en AWS lambda.

Recientemente, Lambda introdujo su compatibilidad con imágenes acoplables, lo que hace que el entorno de Conda con las bibliotecas deseadas esté disponible para Lambda.

Antes de continuar, espero que los lectores tengan una comprensión básica de Conda, miniconda y Anaconda.

Para este ejercicio, necesita acceso al entorno de AWS con:

  • Acceso SSH temporal a EC2 Amazon Linux
  • Acceso al repositorio de imágenes de AWS ECR para publicar imágenes
  • Crear y ejecutar lambda

Paso 1: Crear el archivo de entorno

SSH en EC2 (Amazon Linux) y ejecute los siguientes comandos.

¿Por qué Ec2 y no local? Esto se debe a que cuando traté de hacerlo desde mi máquina Mac, hubo una diferencia de libs específica del entorno y lambda estaba fallando.

(1) instalar anaconda:

sudo yum update -y && yum install -y wget && yum clean all
wget https://repo.anaconda.com/archive/Anaconda3-2022.05-Linux-x86_64.sh
sh Anaconda3-2022.05-Linux-x86_64.sh
source ~/.bashrc

(2) Cree un entorno virtual conda e instale las bibliotecas deseadas. Por ejemplo, estoy instalando boto3 y NumPy

conda create --name blog_test
conda activate blog_test
conda install -y -c conda-forge numpy
conda install -y -c anaconda boto3

(3) exportar el entorno a un archivo. Esto crea todas las bibliotecas necesarias como un archivo YAML.

conda env export --no-build --file blog-environment.yml

Paso 2: preparar archivos para crear la imagen

Este paso se puede realizar en su local. Para implementar una imagen de contenedor en Lambda, necesita la CLI de AWS y la CLI de Docker. puede leer más en la documentación de aws (este documento solo habla de python-pip, no de conda, pero tiene detalles detallados si está interesado)

(1) Para simplificar, cree una carpeta, por ejemplo: “prepare_lambda_image” y cd en la carpeta

(2) Copie los 2 archivos en la carpeta donde está ejecutando el paso 2 (a) blog-environment.yml (b) my_lambda_file.py (su código de Python)

(3) cree un Dockerfile que instale miniconda y empaquete bibliotecas para lambda. (El Dockerfile de muestra está debajo de copiar y pegar y editar según sea necesario)

Nota: al momento de escribir este blog, python 3.9 es el último, así que obtuve la imagen base de AWS 3.9 y miniconda3

FROM public.ecr.aws/lambda/python:3.9

RUN yum update -y && yum install -y wget && yum clean all

RUN wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh -o miniconda.sh && sh Miniconda3-latest-Linux-x86_64.sh -b -p /opt/miniconda

COPY aws-assignment.yml /tmp/environment.yml

RUN /opt/miniconda/bin/conda env create --file /tmp/environment.yml --prefix /opt/conda-env

RUN /opt/conda-env/bin/pip install awslambdaric

# We now replace the image’s existing Python with Python from the conda environment:
RUN mv /var/lang/bin/python3.9 /var/lang/bin/python3.9-clean && ln -sf /opt/conda-env/bin/python /var/lang/bin/python3.9COPY my_lambda_file.py /opt/my-code/my_lambda_file.py
ENV PYTHONPATH "/var/lang/lib/python3.9/site-packages:/opt/my-code"


#ENTRYPOINT ["/lambda-entrypoint.sh"]
CMD ["my_lambda_file.lambda_handler"]

Paso 3: Crea y empuja la imagen

Antes de continuar, actualice sus credenciales de AWS a través de IAM_role o perfil predeterminado o variables ambientales

(1) Autentique la CLI de Docker en su registro de Amazon ECR. (suponiendo que el número de cuenta de AWS sea 123456789012)

aws ecr get-login-password --region us-east-1 | docker login --username AWS --password-stdin 123456789012.dkr.ecr.us-east-1.amazonaws.com

(2) Cree un repositorio en Amazon ECR usando el comando create-repository o manualmente

aws ecr create-repository --repository-name blog-test --image-scanning-configuration scanOnPush=true --image-tag-mutability MUTABLE

(3) Implemente la imagen en Amazon ECR mediante el comando docker push.

version="latest"
docker build -t blog_test:${version} .
docker tag blog_test:${version} 123456789012.dkr.ecr.us-east-1.amazonaws.com/blog_test:${version}
docker push 123456789012.dkr.ecr.us-east-1.amazonaws.com/blog_test:${version}

Paso 4: crea la función lambda

Finalmente estamos listos para crear la función lambda con la imagen que se creó arriba

Como se muestra en la siguiente imagen de la consola de AWS, seleccione las opciones resaltadas a continuación al crear una función lambda y ya está todo listo.


Conclusión

Todo el proceso de creación de la imagen y hacer que funcione con lambda puede parecer engorroso, pero una vez que lo domines, será fácil y estará más controlado por el usuario.


Si le interesa, puede echar un vistazo a algunos de los otros artículos que he escrito recientemente sobre Laravel:

Recent Post