
AWS Lambdaを使ってサーバーなしで処理を実行する場面は増えていますが、実際に開発環境で試したときに「ハンドラーが見つからない」というエラーに直面したことがある方も多いでしょう。
本記事では、その原因と具体的な解決策について解説します。
実行時に発生したエラー内容
まずは、あるプロジェクトで遭遇したエラーの内容をご紹介します。
Node.jsを使ってMongoDBと接続し、ある情報を検索して表示するという処理をLambdaで行おうとしたところ、以下のようなエラーが出ました。
Runtime.HandlerNotFound: index.handler is undefined or not exported
このメッセージは、「Lambdaの設定で指定されたhandlerが見つからない」という意味です。
ここでいうハンドラーとは、Lambdaが実行時に最初に呼び出す関数のことを指します。
これはLambdaの管理画面で「ハンドラー」として設定する必要があります。
エラーの原因
今回のコードでは以下のようにmainという関数を定義していました。
const main = async (key) => {
// MongoDBへ接続してデータ操作する処理
}
しかし、この関数はLambda関数として正しくエクスポートされておらず、Lambdaはindex.handlerという関数を探しにいった結果、見つからずにエラーが発生したのです。
Node.jsでLambdaを動かす際には、以下のようにエントリーポイントとなる関数を明示的にエクスポートする必要があります。
正しいエクスポート方法と修正例
以下は正しい書き方の例です。
Lambdaが実行時に呼び出すべき関数(ハンドラー)をエクスポートし、その内部でメイン処理を呼び出しています。
const MongoClient = require('mongodb').MongoClient;
exports.handler = async (event) => {
const key = event.key; // 送信されるデータからキーを取得
const uri = "mongodb://ユーザー名:パスワード@ホスト名:ポート番号/?ssl=true";
const client = new MongoClient(uri, {
tlsCAFile: __dirname + '/証明書ファイル.pem',
});
try {
await client.connect();
const db = client.db('データベース名');
const collection = db.collection('コレクション名');
await collection.insertOne({ key: "a1", name: "名前A" });
await collection.insertOne({ key: "b2", name: "名前B" });
const result = await collection.findOne({ key });
console.log(result);
await collection.deleteMany({});
return { statusCode: 200, body: JSON.stringify(result) };
} catch (err) {
console.error(err);
return { statusCode: 500, body: 'エラーが発生しました' };
} finally {
await client.close();
}
};
このようにすることで、非同期処理でMongoDBとの接続と操作を行いながらも、Lambdaの仕様に沿った形でハンドラー関数を定義できます。
Lambdaでよくある落とし穴
初心者にありがちなミスとして、次の点が挙げられます。
- メイン処理のみを書いて、ハンドラーをエクスポートしていない
exports.handlerで定義した関数の名前が設定と一致していない- ファイル名とハンドラー名の組み合わせがLambda設定とずれている(例:ファイル名
index.jsなら、ハンドラー設定はindex.handler)
Lambdaを使う際には、関数のエクスポートと設定の整合性が非常に重要です。
最後に
今回は、AWS Lambdaで「ハンドラーが見つからない」というエラーが出たときの原因とその解決方法について解説しました。
Node.jsでLambdaを使う際は、ハンドラー関数の定義とエクスポートが正しくできているかを必ず確認しましょう。
また、非同期処理や外部サービスとの接続(今回の例ではMongoDB)を行う際にも、適切なエラーハンドリングとリソースの解放処理(finallyでのclose())が必要です。
このようなエラーは慣れないうちはつまずきやすいですが、一度仕組みを理解してしまえばスムーズに扱えるようになります。
Lambdaはうまく使えば非常に強力なツールですので、ぜひ積極的に活用していきましょう。
- Original:https://minory.org/aws-lambda-handler-undefined.html
- Source:minory
- Author:管理者