この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
はじめに
AWS Cloud9 上で Lambda ファンクションをローカルで実行する際に Unable to import module 'DemoFunction/lambda_function': No module named 'requests'
エラーが出た場合の原因と対処方法を紹介します.
エラーが発生した環境と現象
Cloud9 IDE を使用して Lambda ファンクションを作成しました.
今回、アプリケーション名は DemoApplication, ファンクション名は DemoFunction, ランタイムは Python としました.
以下は自動で生成されたファイルです.
cm-yokota.shinsuke:~/environment $ tree -L 2 DemoApplication/
DemoApplication/
├── DemoFunction
│ └── lambda_function.py
├── __init__.py
├── requirements.txt
├── template.yaml
└── venv
├── bin
├── include
├── lib
├── lib64 -> ./lib
└── local
Lambda ファンクションでモジュールをインストールする場合, 実行ファイルと同じディレクトリにモジュールをインストールするので, 次のコマンドを実行し DemoFunction 以下にモジュールを配置しました.
cm-yokota.shinsuke:~/environment $ cd DemoApplication/DemoFunction/
cm-yokota.shinsuke:~/environment/DemoApplication/DemoFunction $ pip install --target=./ requests
(省略)
Successfully installed certifi-2020.4.5.1 chardet-3.0.4 idna-2.9 requests-2.23.0 urllib3-1.25.9
この状態で, 下記スクリプトをローカル実行したところ, Unable to import module 'DemoFunction/lambda_function': No module named 'requests'
エラーが発生しました.
import requests
def lambda_handler(event, context):
return 'Done'
原因と対処
モジュールのインストール先が間違っていたことがエラーの原因でした.
Cloud9 は Lambda アプリケーション を利用しているため, アプリケーションディレクトリ(今回はDemoApplication/)が Lambda ファンクションの実行ディレクトリになります.
したがって, import requests
で requests モジュールを読み込みたい場合はアプリケーションディレクトリ直下にモジュールをインストールする必要がありました.
cm-yokota.shinsuke:~/environment $ tree -L 2 DemoApplication/
DemoApplication/
├── この階層にパッケージ設置
├── DemoFunction
│ └── lambda_function.py
├── __init__.py
├── requirements.txt
├── template.yaml
└── venv
├── bin
├── include
├── lib
├── lib64 -> ./lib
└── local
DemoApplication 以下にモジュールを配置することで正常にファンクションをローカル実行することができる様になりました.