こんにちは ひこにき です
先日ですが Lambda(Python)で画像変換の処理をしたく Pillow のモジュールを入れたのですがサーバーにデプロイするとエラーとなり、かなり嵌りました。。。こちらの内容で解消される人がいると幸いです
Google先生に聞いて色々なサイトを見たのですが、エラー内容からは他と同様にLambda上のプラットフォームとPillowのモジュールの互換性の問題だろうとは想定できていたのですが
皆さん色々な手順で試されているのですが解消されず、、、
- AmazonLinuxのDockerイメージ上で pip コマンドでインストールしたモジュールを利用する
- ローカルのPC(x86_64)とPythonのバージョンをLambdaと合わせる(当たり前ですが、、)
- pypi.org から 対象のPythonVersion、プラットフォーム、「manylinux_2」のライブラリをDLして入れる
ここからは実際に対応した手順について説明したいと思います
発生していたエラー内容
cannot import name ‘_imaging’ from ‘PIL’ (/var/task/PIL/init.py)
解消のためにリトライして何度見たことでしょう、、、
Lambdaのバージョンとプラットフォームを確認
当たり前ですが、LambdaのランタイムのPythonのバージョンとアーキテクチャを確認します。今回は python3.9 で x86_64 ですね。
serverless frameworkを利用している場合は serverless.yml の以下で設定できます。architecture 未指定の場合は デフォルト x86_64 となります
provider:
name: aws
runtime: python3.9
architecture: x86_64
ローカル環境の python バージョン確認 & pip最新化
① ローカルの python のバージョンが Lambdaのランタイムと同じか確認します
$ python --version
Python 3.9.16
※ 通常 pipでモジュール入れる場合は合わせますが、 pipでpythonのバージョン指定するので不要かも?他のモジュールもローカルにDLして入れると思うので合わせておきましょう
② 続けて pip の最新化を行います
$ python -m pip install --upgrade pip
プラットフォーム指定でのPillowモジュールのインストール
–plattform には manylinux2014_x86_64 を指定します!(アーキテクチャに合わせる)
–python-version は 3.9 を指定します!(ランタイムと合わせる)
–target は、モジュールをインストールする場所 を設定。カレントの場合「.」を指定
–only-binary バイナリパッケージをダウンロードを指定(ソースでローカルコンパイルではない)
$ pip install --platform manylinux2014_x86_64 --target . --python-version 3.9 --only-binary=:all: --upgrade Pillow
ローカルに PIL と Pillow.libs がインストールされますので こちらを Lambdaにアップロードしてください(Pillow-x.x.x.dist-info などは不要です)
おまけ
いかがでしたでしょうか? これでLambdaのエラー解消されましたでしょうか
参考にしたサイトで「pypi.org から 対象のPythonVersion、プラットフォーム「manylinux_2」のライブラリをDLして入れる」の対応でいけるのではないかと思ってたのですが、厳密にはDLするモジュールのバージョンの互換性もあるらしく最新バージョンでもエラーは解消されませんでした。
テスト的な環境で上記のコマンドを行った際には 最初は「Pillow-10.0.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl」がDLされたのですが、最終的に入ったモジュールは「Pillow-9.5.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl」でした(2023年7月時点)
以上、Lambda で Pillow のモジュールがエラーで動かない件についての解消方法でした
コメント