Non è possibile utilizzare OpenCV-Python in AWS Lambda
Ho provato a inserire OpenCV in un bucket S3 e quindi ad assegnarlo a un livello lambda.
C'è molto poco su questo in linea e quello che ho visto non ha funzionato.
Sono riuscito a utilizzare docker con l'ambiente Amazon Linux e ho seguito questo tutorial. https://aws.amazon.com/premiumsupport/knowledge-center/lambda-layer-simulated-docker/
Ho aggiunto setuptools, wheel e opencv-python == 4.4.0.42 al file requirements.txt.
setuptools e wheel a causa di un errore precedente in cui la raccomandazione era di includerli in quanto devono essere aggiornati, anche se li ho aggiornati. Ma funziona con loro, quindi chi lo sa.
Ho creato l'immagine docker che ho zippato e inserito in un bucket S3.
Continuo a ricevere {"errorMessage": "Unable to import module 'lambda_function': libGL.so.1: can't open shared object file: No such file or directory", "errorType": "Runtime.ImportModuleError"} quando lo eseguo anche se.
Non riesco a capire cosa c'è che non va.
Qualche idea?
Risposte
Dovrai aggiungere un mucchio di dipendenze al tuo livello. Di seguito sono riportati i passaggi che ho utilizzato per opencv_python su lambda.
1. Sulla workstation locale (finestra del terminale 1)
mkdir /tmp/mylayer && cd /tmp/mylayer
echo opencv-python==4.4.0.42 > ./requirements.txt
2. Sulla workstation locale (finestra del terminale 2)
docker run -it -v /tmp/mylayer:/mylayer lambci/lambda:build-python3.8 bash
Il comando precedente ti metterà nel contenitore docker.
All'interno del contenitore:
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. Di nuovo sulla workstation locale (finestra del terminale 1)
Comprimi la pythoncartella in mylayer.zip.
zip -r -9 mylayer.zip python
Nella console AWS
Crea un livello lambda basato su
mylayer.zipnella Console AWS. Non dimenticare di specificareCompatible runtimesapython3.8.Aggiungi AWS fornisce il livello SciPy
AWSLambda-Python38-SciPy1xe il tuo livello con cv2 nella tua funzione.
Quindi avrai due livelli nella tua funzione.
- Eseguire il test di base del livello in lambda utilizzando la seguente funzione lambda:
import cv2
def lambda_handler(event, context):
print(dir(csv))
La funzione viene eseguita correttamente (viene visualizzata la stampa parziale).
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