Impossible d'utiliser OpenCV-Python dans AWS Lambda
J'ai essayé d'obtenir OpenCV dans un compartiment S3, puis de l'attribuer à une couche lambda.
Il y a très peu de choses à ce sujet en ligne et ce que j'ai vu n'a pas fonctionné.
J'ai réussi à utiliser docker avec l'environnement amazon linux et j'ai suivi ce tutoriel. https://aws.amazon.com/premiumsupport/knowledge-center/lambda-layer-simulated-docker/
J'ai ajouté setuptools, wheel et opencv-python == 4.4.0.42 au fichier requirements.txt.
setuptools et wheel en raison d'une erreur antérieure où la recommandation était de les inclure car ils doivent être mis à jour, même si je les ai mis à jour. Mais cela fonctionne avec eux, alors qui sait.
J'ai créé l'image docker que j'ai compressée et placée dans un compartiment S3.
Je continue à recevoir {"errorMessage": "Impossible d'importer le module 'lambda_function': libGL.so.1: impossible d'ouvrir le fichier objet partagé: aucun fichier ou répertoire de ce type", "errorType": "Runtime.ImportModuleError"} lorsque je l'exécute bien que.
Je n'arrive pas à comprendre ce qui ne va pas.
Des idées?
Réponses
Vous devrez ajouter un tas de dépendances à votre couche. Voici les étapes que j'ai utilisées pour opencv_python sur lambda.
1. Sur le poste de travail local (fenêtre du terminal 1)
mkdir /tmp/mylayer && cd /tmp/mylayer
echo opencv-python==4.4.0.42 > ./requirements.txt
2. Sur le poste de travail local (fenêtre du terminal 2)
docker run -it -v /tmp/mylayer:/mylayer lambci/lambda:build-python3.8 bash
La commande ci-dessus vous placera dans le conteneur du docker.
À l'intérieur du conteneur:
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. Sur le poste de travail local à nouveau (fenêtre du terminal 1)
Emballez le pythondossier dans mylayer.zip.
zip -r -9 mylayer.zip python
Dans la console AWS
Créez une couche lambda basée sur
mylayer.zipdans la console AWS. N'oubliez pas de préciserCompatible runtimesàpython3.8.Ajouter AWS fournit une couche SciPy
AWSLambda-Python38-SciPy1xet votre propre couche avec cv2 dans votre fonction.
Vous aurez donc deux couches dans votre fonction.
- Effectuez un test de base de la couche en lambda à l'aide de la fonction lambda suivante:
import cv2
def lambda_handler(event, context):
print(dir(csv))
La fonction s'exécute correctement (impression partielle affichée).
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