技術(tech)

AWS Lambda python: Unable to import module ‘lambda_function’: No moduleの対処

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を実行してみると… エラーが消えてモジュールがきちんと読み込まれます。

 

誰かの助けになれば幸いです。