AWS Lambda에서 OpenCV-Python을 사용할 수 없음

Sep 23 2020

OpenCV를 S3 버킷으로 가져온 다음 람다 계층에 할당하려고했습니다.

이 온라인에 대해서는 거의 없으며 내가 본 것은 작동하지 않았습니다.

Amazon Linux 환경에서 Docker를 사용하고이 튜토리얼을 따랐습니다. https://aws.amazon.com/premiumsupport/knowledge-center/lambda-layer-simulated-docker/

requirements.txt 파일에 setuptools, wheel 및 opencv-python == 4.4.0.42를 추가했습니다.

setuptools 및 wheel은 업데이트가 필요하므로 업데이트가 필요하므로 권장 사항이 이전 오류로 인해 업데이트되었지만 업데이트했습니다. 그러나 그것은 그들과 함께 작동하므로 누가 압니다.

내가 압축하여 S3 버킷에 넣은 도커 이미지를 생성했습니다.

실행할 때 { "errorMessage": "Unable to import module 'lambda_function': libGL.so.1 : cannot open shared object file : No such file or directory", "errorType": "Runtime.ImportModuleError"} 그러나.

나는 무엇이 잘못되었는지 알아낼 수없는 것 같다.

어떤 아이디어?

답변

7 Marcin Sep 23 2020 at 06:59

레이어에 많은 종속성을 추가해야합니다. 다음은 람다에서 opencv_python에 사용한 단계입니다.

1. 로컬 워크 스테이션에서 (터미널 창 1)

mkdir /tmp/mylayer && cd /tmp/mylayer

echo opencv-python==4.4.0.42 > ./requirements.txt

2. 로컬 워크 스테이션에서 (터미널 창 2)


docker run -it -v /tmp/mylayer:/mylayer  lambci/lambda:build-python3.8 bash

위의 명령은 Docker 컨테이너로 이동합니다.

컨테이너 내부 :

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. 다시 로컬 워크 스테이션에서 (터미널 창 1)

팩 python에 폴더를 mylayer.zip.

zip -r -9 mylayer.zip python

AWS 콘솔에서

  1. mylayer.zipAWS 콘솔을 기반으로 람다 계층을 생성합니다 . 로 지정 Compatible runtimes하는 것을 잊지 마십시오 python3.8.

  2. AWS 제공 SciPy 계층 AWSLambda-Python38-SciPy1x과 cv2가있는 자체 계층을 함수에 추가합니다.

따라서 함수 에는 두 개의 레이어 가 있습니다.

  1. 다음 람다 함수를 사용하여 람다에서 계층의 기본 테스트를 수행합니다.
import cv2

def lambda_handler(event, context):    
    print(dir(csv))

기능이 올바르게 실행됩니다 (부분 출력이 표시됨).

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