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: