1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Windowsで作成したLambdaレイヤーで"Unable to import module"エラーが発生した場合の対処(の一つ)

Last updated at Posted at 2024-01-26

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に言及しているページが見当たらなかったので後世の方の為に残しておきました。以上です。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?