No se puede usar OpenCV-Python en AWS Lambda
He intentado introducir OpenCV en un bucket de S3 y luego asignarlo a una capa lambda.
Hay muy poco sobre esto en línea y lo que he visto no ha funcionado.
Me las arreglé para usar Docker con el entorno de Amazon Linux y seguí este tutorial. https://aws.amazon.com/premiumsupport/knowledge-center/lambda-layer-simulated-docker/
Agregué setuptools, wheel y opencv-python == 4.4.0.42 al archivo requirements.txt.
setuptools y wheel debido a un error anterior en el que la recomendación era incluirlos ya que necesitan actualización, aunque los he actualizado. Pero funciona con ellos, así que quién sabe.
Creé la imagen de la ventana acoplable que comprimí y puse en un cubo de S3.
Sigo recibiendo {"errorMessage": "No se puede importar el módulo 'lambda_function': libGL.so.1: no se puede abrir el archivo de objeto compartido: no existe ese archivo o directorio", "errorType": "Runtime.ImportModuleError"} cuando lo ejecuto aunque.
Parece que no puedo entender qué está mal.
¿Algunas ideas?
Respuestas
Deberá agregar un montón de dependencias a su capa. A continuación se muestran los pasos que he usado para opencv_python en lambda.
1. En la estación de trabajo local (ventana de terminal 1)
mkdir /tmp/mylayer && cd /tmp/mylayer
echo opencv-python==4.4.0.42 > ./requirements.txt
2. En la estación de trabajo local (ventana de terminal 2)
docker run -it -v /tmp/mylayer:/mylayer lambci/lambda:build-python3.8 bash
El comando anterior lo colocará en el contenedor de la ventana acoplable.
Dentro del contenedor:
cd /mylayer
pip install --no-deps -t python/lib/python3.8/site-packages/ -r requirements.txt
yum install -y mesa-libGL
cp -v /usr/lib64/libGL.so.1 /mylayer/python/lib/python3.8/site-packages/opencv_python.libs/
cp -v /usr/lib64/libGL.so.1.7.0 /mylayer/python/lib/python3.8/site-packages/opencv_python.libs/
cp -v /usr/lib64/libgthread-2.0.so.0 /mylayer/python/lib/python3.8/site-packages/opencv_python.libs/
cp -v /usr/lib64/libgthread-2.0.so.0 /mylayer/python/lib/python3.8/site-packages/opencv_python.libs/
cp -v /usr/lib64/libglib-2.0.so.0 /mylayer/python/lib/python3.8/site-packages/opencv_python.libs/
cp -v /usr/lib64/libGLX.so.0 /mylayer/python/lib/python3.8/site-packages/opencv_python.libs/
cp -v /usr/lib64/libX11.so.6 /mylayer/python/lib/python3.8/site-packages/opencv_python.libs/
cp -v /usr/lib64/libXext.so.6 /mylayer/python/lib/python3.8/site-packages/opencv_python.libs/
cp -v /usr/lib64/libGLdispatch.so.0 /mylayer/python/lib/python3.8/site-packages/opencv_python.libs/
cp -v /usr/lib64/libGLESv1_CM.so.1.2.0 /mylayer/python/lib/python3.8/site-packages/opencv_python.libs/
cp -v /usr/lib64/libGLX_mesa.so.0.0.0 /mylayer/python/lib/python3.8/site-packages/opencv_python.libs/
cp -v /usr/lib64/libGLESv2.so.2.1.0 /mylayer/python/lib/python3.8/site-packages/opencv_python.libs/
cp -v /usr/lib64/libxcb.so.1 /mylayer/python/lib/python3.8/site-packages/opencv_python.libs/
cp -v /usr/lib64/libXau.so.6 /mylayer/python/lib/python3.8/site-packages/opencv_python.libs/
cp -v /usr/lib64/libXau.so.6 /mylayer/python/lib/python3.8/site-packages/opencv_python.libs/
cp -v /lib64/libGLdispatch.so.0.0.0 /mylayer/python/lib/python3.8/site-packages/opencv_python.libs/
3. En la estación de trabajo local nuevamente (ventana de terminal 1)
Empaque la pythoncarpeta en mylayer.zip.
zip -r -9 mylayer.zip python
En la consola de AWS
Cree una capa lambda basada en
mylayer.zipen la consola de AWS. No se olvide de especificarCompatible runtimesapython3.8.Agregue la capa SciPy de AWS
AWSLambda-Python38-SciPy1xy su propia capa con cv2 a su función.
Entonces tendrás dos capas en tu función.
- Realice la prueba básica de la capa en lambda usando la siguiente función lambda:
import cv2
def lambda_handler(event, context):
print(dir(csv))
La función se ejecuta correctamente (se muestra una impresión parcial).
slation3D', 'exp', 'extractChannel', 'fastAtan2', 'fastNlMeansDenoising', 'fastNlMeansDenoisingColored', 'fastNlMeansDenoisingColoredMulti', 'fastNlMeansDenoisingMulti', 'fillConvexPoly', 'fillPoly', 'filter2D', 'filterHomographyDecompByVisibleRefpoints', 'filterSpeckles', 'find4QuadCornerSubpix', 'findChessboardCorners', 'findChessboardCornersSB', 'findChessboardCornersSBWithMeta', 'findCirclesGrid', 'findContours', 'findEssentialMat', 'findFundamentalMat', 'findHomography', 'findNonZero', 'findTransformECC', 'fisheye', 'fitEllipse', 'fitEllipseAMS', 'fitEllipseDirect', 'fitLine', 'flann', 'flann_Index', 'flip', 'floodFill', 'gemm', 'getAffineTransform', 'getBuildInformation', 'getCPUFeaturesLine', 'getCPUTickCount', 'getDefaultNewCameraMatrix', 'getDerivKernels', 'getFontScaleFromHeight', 'getGaborKernel', 'getGaussianKernel', 'getHardwareFeatureName', 'getNumThreads', 'g