Não é possível usar OpenCV-Python no AWS Lambda
Tenho tentado obter o OpenCV em um balde S3 e, em seguida, atribuí-lo a uma camada lambda.
Há muito pouco sobre isso online e o que eu vi não funcionou.
Consegui usar o docker com o ambiente Linux do Amazon e segui este tutorial. https://aws.amazon.com/premiumsupport/knowledge-center/lambda-layer-simulated-docker/
Adicionei setuptools, wheel e opencv-python == 4.4.0.42 ao arquivo requirements.txt.
setuptools e wheel por causa de um erro anterior em que a recomendação era incluí-los porque eles precisam de atualização, embora eu os tenha atualizado. Mas funciona com eles, quem sabe.
Criei a imagem da janela de encaixe que compactei e coloquei em um balde S3.
Continuo recebendo {"errorMessage": "Não é possível importar o módulo 'lambda_function': libGL.so.1: não é possível abrir o arquivo de objeto compartilhado: Não existe esse arquivo ou diretório", "errorType": "Runtime.ImportModuleError"} quando o executo Apesar.
Não consigo descobrir o que está errado.
Alguma ideia?
Respostas
Você precisará adicionar várias dependências à sua camada. Abaixo estão as etapas que usei para opencv_python em lambda.
1. Na estação de trabalho local (janela do terminal 1)
mkdir /tmp/mylayer && cd /tmp/mylayer
echo opencv-python==4.4.0.42 > ./requirements.txt
2. Na estação de trabalho local (janela do terminal 2)
docker run -it -v /tmp/mylayer:/mylayer lambci/lambda:build-python3.8 bash
O comando acima o colocará no contêiner do docker.
Dentro do contêiner:
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. Na estação de trabalho local novamente (janela do terminal 1)
Empacote a pythonpasta em mylayer.zip.
zip -r -9 mylayer.zip python
No console AWS
Crie a camada lambda com base no
mylayer.zipAWS Console. Não se esqueça de especificarCompatible runtimesparapython3.8.Adicione camada AWS fornecer SciPy
AWSLambda-Python38-SciPy1xe sua própria camada com cv2 em sua função.
Portanto, você terá duas camadas em sua função.
- Execute o teste básico da camada em lambda usando a seguinte função lambda:
import cv2
def lambda_handler(event, context):
print(dir(csv))
A função é executada corretamente (impressão parcial mostrada).
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