環境
macOS Mojave
versin 10.14.5
目的とゴール
AWS Lambda上でPillowライブラリを使えるようにすることをゴールとします。
AWS LambdaでPython3.7で画像ファイルを操作する関数を開発していたところ、python Pillowのライブラリのimportに失敗しました。
from PIL import Image
from PIL import Image
Response:
{
"errorMessage": "Unable to import module 'lambda_function'"
}
ローカル環境にインストールしたpython Pillowを「.zipファイルをアップロード」にてAWS Lamabda上にはインストールしていました。
python PillowのライブラリはインストールしたOS環境に依存するらしく、AWS Lambda上で動作するPillowはAmazon Linux環境にインストールしたpython Pillowが必要ということがわかり、その手順を本記事に残します。
手順
- Dockerをインストール
- DockerにAWS Linuxの環境を用意する
- Docker環境にPythonとPythonのPillowライブラリをインストール
- AWS Lambda上に「.zipファイルをアップロード」でインストール
Dockerのインストール
こちらの記事を参考にさせていただきました。
Dockerインストールメモ
https://qiita.com/n-yamanaka/items/ddb18943f5e43ca5ac2e
Dockerのバージョンを表示、インストールされたことを確認します。
docker version
AWS Linuxの環境を用意する
Amazon ECRからAmazon Linux コンテナを取得する方法がありますが、今回はより手軽な方法である、公開されたamazonlinuxからイメージを取得しコンテナを作成します。
amazonlinuxのdockerイメージ
https://hub.docker.com/_/amazonlinux
docker pull amazonlinux
にてイメージをダウンロードします。
Docker環境にPythonとPythonのPillowライブラリをインストール
こちらの記事を参考にさせていただきました。
AWS Lambda で Pillow を使おうとしたらハマった
https://michimani.net/post/aws-use-pillow-in-lambda/
Dockerfileとdocker-compose.yml、ディレクトリ構成は参考にさせていただいた記事と同等のものにしました。
また、requirements.txtには以下としました。
- requirements.txtの中身
Pillow
Dockerfileの階層に移動して、コンテナをビルド・立ち上げします。
docker-compose up --build
$ docker-compose up --build
Removing docker_test_app_1
Building app
Step 1/3 : FROM amazonlinux:latest
---> b94321659aca
省略
app_1 | WARNING: Running pip install with root privileges is generally not a good idea. Try `pip3 install --user` instead.
app_1 | Collecting boto3 (from -r /home/deploy/requirements.txt (line 1))
app_1 | Downloading
省略
docker_test_app_1 exited with code 0
distにライブラリが出力されていることを確認できました。
(WARNINGが出たので、docker-compose.ymlのcommandをpip3 install --userに差し替えて叩いてみましたが、解消しませんでした。原因特定はできず)
(ちなみに、docker環境に直接ログインして、
yum install python3 -y
mkdir /home/deploy
pip3 install Pillow -t dist/
を実行して、手に入れたPillowライブラリは、エラー"Unable to import module 'lambda_function'"が解消しませんでした。こちらも原因特定はできず)
AWS Lambda上にPython Pillowをインストール
distに出力されたライブラリをzip圧縮し、コードエントリタイプ「.zipファイルをアップロード」を選択してインストールします。
ここで画面で動かしていたlambda_function.py、他コードがあれば、バックアップを取りライブラリと一緒にzipファイルに含めてください。
そうしないと、「.zipファイルをアップロード」したタイミングで消えてしまいます。
また、zipファイルはlambda_function.py、ライブラリを直接選択した状態で圧縮する方法で作成します。lambda_function.py、ライブラリが保存されているディレクトリを圧縮してzipファイルの場合は展開に失敗しました。
参考サイト
Dockerインストールメモ
https://qiita.com/n-yamanaka/items/ddb18943f5e43ca5ac2e
AWS Lambda で Pillow を使おうとしたらハマった
https://michimani.net/post/aws-use-pillow-in-lambda/