exports is not defined in ES module scopeエラーの解決方法

記事タイトルとURLをコピーする

こんばんは、SWX3人目の熊谷(悠)です。

Node.js Lambdaで開発時、掲題のエラーに遭遇したので解決策を備忘録として残します

結論

Lambda 作成時に自動作成されていたindex.mjsファイルの拡張子を「index.js」へ変更する

原因

CommonJS モジュールでのみ動作するコードだったため、実行時エラーが発生していた

参考:ES モジュールとしての関数ハンドラーの指定:https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/lambda-nodejs.html#designate-es-module

デフォルトで、Lambda は .js サフィックスが付いたファイルを CommonJS モジュールとして扱います。
オプションで、コードを ES モジュールとして指定できます。.mjs のファイル名拡張子を使用する方法で実行できます。


参考:Node.js ハンドラーの基本:https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/nodejs-handler.html#nodejs-handler-basics

それぞれ、ハンドラー関数の定義の仕方が異なる

ES module handler の場合

export const handler = async (event, context) => {
  console.log("EVENT: \n" + JSON.stringify(event, null, 2));
  return context.logStreamName;
};

CommonJS module handler の場合

exports.handler = async function (event, context) {
  console.log("EVENT: \n" + JSON.stringify(event, null, 2));
  return context.logStreamName;
};