ホーム あぴらぼ式 [AWS] LambdaでOpenCVを使用
[AWS] LambdaでOpenCVを使用
 

[AWS] LambdaでOpenCVを使用

Information

この記事はアピリッツの技術ブログ「あぴらぼ式」から移行した記事です。情報が古い可能性がありますのでご注意ください。

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なども利用すると便利かと思います。

記事を共有

最近人気な記事