その他
    ホーム 技術発信 あぴらぼ式 [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なども利用すると便利かと思います。

    記事を共有