[AWS] Lambda 実行時に発生するハンドラーやモジュールが見つからないエラーの解決法
![[AWS] Lambda 実行時に発生するハンドラーやモジュールが見つからないエラーの解決法](/static/6e51d2a6df7a0c01d9a8809dd0f4c17e/9bec7/how-to-solve-lambda-error-that-handler-or-module-cannot-be-found.png)
こんにちは、じゅんじゅんです。AWS Lambda を Node.js で使っていたとき、Lambda 実行時に index.handler is undefined or not exported や Cannot find module ‘index’ というエラーに出くわしました。
今回はこちらの2つのエラーが発生する原因と解決法を紹介します。
1. ファイル名またはエクスポートする関数名が設定されているハンドラーと異なる
1つ目は処理を記述しているファイル名、またはそのファイル中のエクスポートする関数名が設定されているハンドラーと異なる場合に発生するケースです。
ファイル名が異なる場合は Cannot find module ‘index’ が、エクスポートする関数名が異なる場合は index.handler is undefined or not exported というエラーが発生します。
Lambda のコンソールの「コード」タブに「ランタイム設定」という部分があり、そこにハンドラーが書かれています。ここに記載されているハンドラーとは Lambda が呼び出されたときに実行される関数のことです。
このハンドラーはデフォルトで index.handler と設定されています。
私は index.js 内の exports の部分の関数名を別の名前にしてしまっていました。
index.handler は index.js ファイルでエクスポートされている handler 関数 ということですので、以下のようにファイル名とエクスポートする関数名を合わせる必要があります。
exports.handler = async event => {
// 処理
}2. デプロイパッケージを zip 化する際のパスが間違っている
2つ目はデプロイパッケージとして zip ファイルを使用する際に、間違ったパスで zip 化したときに発生するケースです。
この場合は Cannot find module ‘index’ というエラーが発生します。
例として、以下のようなパスの作業ディレクトリをデプロイパッケージとする場合を考えます。
C:\Users\HogeHoge\Desktop\aws_practice\lambda_test
↓ lambda_test の中身
- node_modules
- index.js
- package.json
- package-lock.json
zip 化するコマンドは zip -r deploy_package.zip * を使いましたが、私はこれを aws_practice がカレントディレクトリの状態で実行してしまいました。
これでは lambda_test ディレクトリごと zip 化し、 index.js がないと判断されてしまうので、 index.js がある lambda_test をカレントディレクトリにして zip コマンドを実行する必要があります。
ちなみに Windows のエクスプローラで 7-Zip を使って zip 化する場合は lambda_test に対してではなくその中身の index.js などをドラッグした状態で実行します。
まとめ
「ハンドラーやモジュールが見つからない」という内容のエラーでしたが、発生する原因がわかりづらかったので悩まされました。




