Lambda で Pillow のモジュールがエラーで動かない件について完全に対応する

AWS

こんにちは ひこにき です

先日ですが 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

ローカルに PILPillow.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 のモジュールがエラーで動かない件についての解消方法でした

コメント

タイトルとURLをコピーしました