はじめに
Pythonの依存ライブラリにおいてネイティブライブラリを使う場合は、
ビルド(pipする)する環境と、AWS Lambda側の環境を揃えておくという話は昔から聞いていました。
ただ、実際に何がどう影響してダメなのか?全然調べたこともなかったので、
ハマったついでにpip install
で取得したライブラリを確認してみたメモです。
Lambda実行時に発生したエラー
エラー内容
pyproj
という距離計算を行うモジュールを使用した場合に発生しました。
(このエラーだけ見ても、最初は何が悪いか全然分かりませんでしたが。。。)
[ERROR] Runtime.ImportModuleError: Unable to import module 'lambda_handler': cannot import name '_datadir' from partially initialized module 'pyproj' (most likely due to a circular import) (/var/task/pyproj/__init__.py)
エラー発生時の環境
- ビルド側:Python3.7のDockerImage(https://hub.docker.com/_/python)
- Lambda側:Python3.8のランタイム
エラー解消時の環境
- ビルド側:Python3.8のDockerImage(https://hub.docker.com/_/python)
- Lambda側:Python3.8のランタイム
pyprojライブラリの中身(一部抜粋)
細かいインストールの仕組みは理解できていませんが、環境を自動的に把握して、
依存するネイティブライブラリをダウンロードしているようでした。
ビルド環境がDockerImage Python3.7
pyproj
- _crs.cpython-37m-x86_64-linux-gnu.so
- _datadir.cpython-37m-x86_64-linux-gnu.so
- proj.py
ビルド環境がDockerImage Python3.8
pyproj
- _crs.cpython-38m-x86_64-linux-gnu.so
- _datadir.cpython-38m-x86_64-linux-gnu.so
- proj.py
ビルド環境がWindows Python3.7インストール(おまけ)
pyproj
- _crs.cp37-win32.pyd
- _datadir.cp37-win32.pyd
- proj.py
さいごに
少しだけ理解というか自身の納得感が深まりました。
ただ、amazonlinuxの公式DockerImageが配布されているので、ビルド環境はそちらにすべきなのかもです。