Lambda on PythonでOpenCVライブラリを使う
AWS S3(以下、S3)に画像ファイルをアップロードした際、
AWS Lambda(以下、Lambda)で画像加工を行う、というのは
よく使われるケースの一つかと思います。
そこで、Lambda on Python 2.7でOpenCVライブラリを使用するための手順について、ご紹介したいと思います。
ライブラリのimport
まず一般的なライブラリのimport方法についてです。
LambdaでPythonのライブラリを使う際は、
通常のPythonと同じようにimportするわけですが、
Lambda特有の事情として、2点注意点があります。
それは、
boto3などの一部のライブラリを除いた、標準ライブラリ以外のライブラリを使う際には、
Lambdaコード本体に加えて、ライブラリもzipファイル内にまとめて
パッケージとしてアップロードしなければならないということです。
具体的には、
mkdir lambda-package cd lambda-package pip install Image -t .
といったように、ディレクトリを作成し、pipコマンドに-tのオプションを指定することで、
該当ディレクトリ内にライブラリをインストールする必要があります。
あとは、Lambda本体内で
from PIL import Image
のように、通常通りimportすればOKです。
2点目の注意点として、
上記のpip install を行う際には、
Lambdaの実行環境である、Amazon Linux OS内でビルドする必要があるということです。
なので、将来的にLambdaによってサーバレスで実行するつもりでも
一旦はEC2を立ち上げて(あるいはAmazon Linux のDockerイメージを使ってコンテナを使用して)、
pip install する必要があります。
OpenCVを使う場合
ただ、OpenCVを使う場合、
単純に上記の方法だけだとうまくいきません。
それはOpenCVが共有ライブラリを使用するのですが、
Lambda環境内だと、パッケージ外の共有ライブラリを参照できないためです。
そこで、.soも含めてパッケージ化する必要があります。
aws-lambda-python-opencvというgithubプロジェクトがあるので、
こちらを使用することで、簡単にOpenCVをLambdaで使用できます。
[speech_bubble type=”std” subtype=”L1″ icon=”neko_04-1.png” name=”” ]ありがたや、ありがたや。[/speech_bubble]
使い方は、Readmeにもありますが、
Amazon Linux上で、
#!/bin/bash yum update -y yum install -y git cmake gcc-c++ gcc python-devel chrpath cd /tmp wget https://github.com/aeddi/aws-lambda-python-opencv/archive/master.zip unzip master.zip chmod 777 aws-lambda-python-opencv-master cd aws-lambda-python-opencv-master su -c './build.sh' ec2-user
を実行します。
すると、lambda-packageというディレクトリがaws-lambda-python-opencv-master配下にできているので、
cd aws-lambda-python-opencv-master/lambda_package vi lambda_function.py
で、
import cv2 def lambda_handler(event, context): # ~ # 画像の取得 # ~ image_path = "~" # image画像のパス img = cv2.imread(image_path) # cvを保存 cv2.imwrite('/tmp/image.jpeg',img) return 'Success.'
のような感じで、OpenCVを使用するLambda Functionを作ることが可能です。
あとは、lambda_function.pyが配置されているディレクトリで、
zip -r ../lambda-package.zip *
で、パッケージを作成します。
一つ上のディレクトリに
lambda-package.zip
が作られているはずなので、
これをLambda関数としてデプロイすればOKです。
aws-lambda-python-opencvのReadmeにあるように
S3経由でアップロードしてもよいでしょうし、
コンソール画面からアップロードしてもいいと思います。
(10MB以上のアップロードはS3経由が推奨されています)
注意点
上記の方法で画像加工のライブラリを使用することができるようになりますが、
注意点があります。
それは、アップロードするzipファイルは50MBを超えてはならないという制限があることです。
OpenCVをビルドすると、それだけで、20MBを超えるサイズになってしまうので、
一緒にバンドルしたライブラリによっては、上記の制限を超えてしまう恐れがあります。
まとめ
Lambdaで画像加工ライブラリを使用する際には、
zipのパッケージに含める必要があります。
また、OpenCVを使う場合は、
aws-lambda-python-opencvなども利用すると便利かと思います。