以下の記事を参考にLangchainを利用するためのLambda Layerを構築したが、モジュールの呼び出し時にエラーが出て解決に少々てこずったので備忘録
エラーの状況
Lambdaを実行すると以下のようなエラーが発生:
[ERROR] Runtime.ImportModuleError: Unable to import module 'lambda_function': No module named 'langchain'
レイヤーを作成してきちんとアタッチしたはずなのに...なぜ?
考えられる原因
1. レイヤーの構造がおかしい
下記の記事にある通りにレイヤーの構造が実装ができていない場合、動かない
2. Pythonのバージョン不一致
Lambda関数で選択したPythonのバージョンとレイヤーを作成したPythonのバージョンが異なると動かない。← 今回の原因これ。
3. 依存関係が足りない
langchainは他のライブラリに依存していることが多く、それらも一緒にインストールする必要があります。
解決方法
正しいディレクトリ構造でレイヤーを作る
# こんな感じで構造を作ります
mkdir -p python/lib/python3.9/site-packages
pip install langchain -t python/lib/python3.9/site-packages/
# ZIPファイル作成
cd python
zip -r ../langchain-layer.zip .
重要なのは python/lib/pythonX.X/site-packages/
この構造
Pythonバージョンの一致を確認
Lambda関数とLayerで同じPythonバージョンを使用しているか確認する
デバッグコードを追加
どうしても原因がわからない場合は、Lambdaに以下のコードを追加して検索パスを確認:
import sys
import logging
logger = logging.getLogger()
logger.setLevel(logging.INFO)
def lambda_handler(event, context):
logger.info("Python Path: %s", sys.path)
# ここでパスを確認できる
まとめ
私の利用していたpythonのバージョンは3.13.xで、Layerの構築で参考にした記事のpythonバージョンは3.12.xであったため、今回のインポートエラーが発生していた。
単純なミスではあったが、なかなか気づくことができなかったので、この記事が誰かの役に立つことを祈っています!