AWSLambdaでOpenCV-Pythonを使用できません
OpenCVをS3バケットに入れて、ラムダレイヤーに割り当てようとしています。
このオンラインについてはほとんど何もありませんし、私が見たものはうまくいきませんでした。
私はなんとかAmazonLinux環境でdockerを使用することができ、このチュートリアルに従いました。 https://aws.amazon.com/premiumsupport/knowledge-center/lambda-layer-simulated-docker/
私はsetuptools、wheel、opencv-python == 4.4.0.42をrequirements.txtファイルに追加しました。
setuptoolsとwheelは、私が更新したにもかかわらず、更新が必要なときにこれらを含めることが推奨されていた以前のエラーのためです。しかし、それは彼らと一緒に働くので、誰が知っていますか。
圧縮してS3バケットに入れたDockerイメージを作成しました。
{"errorMessage": "モジュール 'lambda_function'をインポートできません:libGL.so.1:共有オブジェクトファイルを開くことができません:そのようなファイルまたはディレクトリはありません"、 "errorType": "Runtime.ImportModuleError"}を実行すると表示され続けますしかし。
何が悪いのかわからないようです。
何か案は?
回答
レイヤーに多数の依存関係を追加する必要があります。以下は、ラムダの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コンソールで
mylayer.zipAWSコンソールに基づいてラムダレイヤーを作成します。に指定するCompatible runtimesことを忘れないでくださいpython3.8。AWSを追加して、SciPyレイヤー
AWSLambda-Python38-SciPy1xとcv2を含む独自のレイヤーを関数に提供します。
したがって、関数には2つのレイヤーがあります。
- 次のラムダ関数を使用して、ラムダのレイヤーの基本的なテストを実行します。
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