ブログblog

Lambdaの外部モジュールのimportでエラーが出た場合の解決方法

Writer: noda 更新日:2021/12/20

はじめに

Lambdaで外部モジュールのPillowを使おうとしてエラーが出ました。
今後も同じ状況が生まれる可能性があるので書き記します。

環境

ローカルPCのOS:Windows
言語:Python
外部モジュールはLambda Layerにデプロイして使います。
今回の外部モジュールの例はPillowです。(Pythonで画像を取り扱うモジュール)
Lambda Layerのデプロイ方法などはたくさん記事があるので本記事では割愛します。

エラー内容

エラーが出た箇所は以下です。

実際に出たエラー内容は以下です。
Unable to import module '関数名': cannot import name '_imaging' from 'PIL' (/opt/python/PIL/__init__.py)

原因

結論としては、モジュールのビルド方法がLambdaを動かしているOSに合っていないことです。
普段SAMを用いてLambdaにデプロイしているのですが、
Lambda Layerにデプロイするときは、ローカルでpipインストールしたモジュールファイルをデプロイしています。
調べていて知ったのですが、Pythonのモジュールによってはpipインストールするときに、
インストールしようとしているOSによってビルド方法が違うものがあるようです。
今回はWindowsでpipインストールしたものをデプロイしてエラーになっています。
requestsなど上記手順でデプロイしても動くものもありますので、モジュールによるのかと思います。

ゴール

Lambda LayerもしくはLambdaへのデプロイ時に使用する外部モジュールのファイル群の入手方法を記載します。

入手方法

調べていて、Amazon Linuxが入ったEC2でpipインストールする方法や、同じくAmazon LinuxをDockerで立ち上げて入手する方法が結構出てきましたがそれでもうまくいきませんでした。
そんな中たまたま開いた公式の記事に入手方法が書いてあったので、そちらを参考にしました。

1.https://pypi.orgを開くと上部に検索ボックスがあるのでモジュール名を入力し検索します。
2.検索結果です。任意のモジュールを選択します。今回はPillow8.4を使うので一番上を選択しました。

3.左のナビゲーションからDownload filesを選択
4.ファイルのリストが出てくるので、任意のWheelファイルを選択します。
左から3列目がPythonのバージョンです。
今回はPython3.9なのでcp39のうち
Pillow-8.4.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
を選択しました。
ものにより差はありますが、「manylinux_2」「x86_64」と入っている名前のものだとLambdaで動くようです。

5.ダウンロード&展開してファイルを使用

まとめ

上記手順で入手したファイルを使用することで見事Lambdaで動かすことができました。
今後も同じようなエラーが出た時はまずこの方法を試したいと思います。