LambdaでAPI等を作っていると外部ライブラリをLambdaレイヤーに追加するシーンが多々発生しますが、ローカルのWindows環境で外部ライブラリの動作確認をした後に、pip install -t
してLambdaレイヤーを作成したらLambdaで以下のエラーが発生した際の調査メモ。
※他の原因(循環参照)でも同じエラーが発生するようなのでどちらが原因かは適宜判断
[ERROR] Runtime.ImportModuleError: Unable to import module'lambda_function': cannot import name 'xxx' from partially initialized module 'xxx' (most likely due to a circular import)
環境
- ローカル環境:Windows
- Lambda:Python
原因
そのまま書いてありました。
要はライブラリにバイナリを含む場合は、インストール時の環境(Windows)とLambda実行環境(Amazon Linux)の差異でエラーになるようです。
NumPy や pandas などのコンパイル済みコードを含む Python パッケージは、デフォルトでは必ずしも Lambda ランタイムと互換性があるとは限りません。pip を使用して、こうしたパッケージをインストールすると、そのパッケージでは、ローカルマシンのアーキテクチャ向けにモジュール名パッケージをダウンロードしてコンパイルします。Linux オペレーティングシステム (OS) を使用していない場合にそうすると、デプロイパッケージには Lambda Python ランタイムとの互換性がなくなります。
対処
「インストール時と実行時の環境が異なる」のが原因なので、環境の合わせ方で対処方法が何案かあります。
対処方法1:Windowsでpip installする際に、Lambda実行環境と同じ環境を指定する
上のリンクに記載がある対処です。一番お手軽な方法かなと思います。
以下の2行目以降をいつものコマンドに追加します。後は流れで。
※Lambda実行環境がPython3.9のアーキテクチャx86_64の場合
pip install hogehoge -t ./python \
--platform manylinux2014_x86_64 \
--implementation cp \
--python-version 3.9 \
--only-binary=:all: --upgrade \
対処方法2:Lambda実行環境とバージョンを揃えた環境でpip installする
こちらも動作を確認しました。
Python3.9であればデフォルトのCloud9環境でpip install -t
するだけです。Python3.9ならこれはこれで楽です。
対処方法3: pypiからWheelファイルを直接ダウンロード
これは自分では試していないのですが、以下のブログにドストレートに書いてあったのでいけそうな気がします。
締め
re:Post以外に対処方法1に言及しているページが見当たらなかったので後世の方の為に残しておきました。以上です。