AWS Lambdaで「ハンドラーが見つからない」エラーの原因と解決法

aws-lambda-handler-undefined
  • URLをコピーしました!

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はうまく使えば非常に強力なツールですので、ぜひ積極的に活用していきましょう。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

コメント

コメントする

CAPTCHA


目次