pythonの処理をLambdaで書いていて、外部モジュールが必要だったので、lambdaのlayerを使って読み込ませようとしました。
その際に、「AWS Lambda python: Unable to import module ‘lambda_function’: No module named ‘regex._regex’」のエラーが出て、解決するまで2~3時間悩みました。
解決方法が分かったので記事にまとめます。
同じ悩みを抱えている方の参考になれば幸いです。
参考:layer
動作環境
- mac OS Big Sur 11.7
- プロセッサ:Intel
- python3.9
事象
# 外部モジュールをローカルにダウンロードしてから
python3.9 -m pip install python-binance -t python/
# zipファイルに固めて
zip -r layer.zip python
# AWSのlambdaのコンソール上で、レイヤーに登録し、
# こんな感じのlambdaを実行させようとしていました
import os
from binance import Client, ThreadedWebsocketManager, ThreadedDepthCacheManager
def lambda_handler(event, context):
print('--- Start...')
すると…
AWS Lambda python: Unable to import module 'lambda_function': No module named 'regex._regex'
タイトルにあるエラーが出ました。
ちゃんとzipに固めて読み込ませているのに、なぜ?となりました。
原因
pip installしてzipで固める作業をした環境(mac OS)とlambdaの実行環境との環境差異が原因でした。(環境の差異によって、どのような変化があるのか、根本原因までは追っていないです)
Linux OSを使用してinstallして、layerに登録して読み込ませてあげると、動くようです。
こちらの記事が、解決の決め手となりました。
https://stackoverflow.com/questions/64498145/aws-lambda-python-unable-to-import-module-lambda-function-no-module-named-r
公式ドキュメントもちょっと参考になりました。
https://aws.amazon.com/jp/premiumsupport/knowledge-center/lambda-import-module-error-python/
解決方法
簡単な方法として、python3.9のdockerコンテナ上で、pip installしてzipに固めたモジュールを、layerに登録してやります。
# ホスト(mac OS)での実行
docker pull python:3.9
docker run -itd --name python python:3.9
docker exec -it python /bin/sh
# コンテナでの実行
cd var/tmp
mkdir python
python3.9 -m pip install python-binance -t python/
## zipコマンドが無いので入れる
apt update && apt install -y zip
## zipに固める
zip -r layer.zip python
# ホスト(mac OS)での実行
## コンテナ側で作ったzipファイルをコピーしてくる
docker cp python:/var/tmp/layer.zip ./
あとは、ここで作成したzipファイルをlayerに登録してあげます。
再度、lambdaを実行してみると… エラーが消えてモジュールがきちんと読み込まれます。
誰かの助けになれば幸いです。