Node.js で AWS Lambda コードを実行する際、「Cannot find module」または「Cannot find Package」というエラーが発生します。
簡単な説明
Node.js コードで指定したライブラリが Lambda 環境で見つからない場合は、次のいずれかのエラーが発生します。これらのエラーは、Node.js ライブラリの一部で、Lambda が事前にパッケージ化されていないことが原因で発生します。
CommonJS でモジュールが見つからない場合、次のエラーが発生します。 Runtime.ImportModuleError: Error: Cannot find module.
JavaScript ES6 でモジュールが見つからない場合、次のエラーが表示されます。 Error [ERR_MODULE_NOT_FOUND]: Cannot find package.
解決策
これらのエラーを解決するには、Node.js コードで使用するライブラリを含めたデプロイパッケージまたは Lambda レイヤーを作成します。
Node.js ランタイム 16 以前では、Lambda は階層化された JavaScript ES モジュールの依存関係をサポートしていません。デプロイには依存関係を含める必要があります。Lambda は、Node.js 20 用の JavaScript ES モジュールの依存関係をサポートしています。
デプロイパッケージではなく Lambda レイヤーを作成すると、そのレイヤーを複数の Lambda 関数で再利用できます。各 Lambda ランタイムは、特定の /opt ディレクトリフォルダを PATH 変数に追加します。レイヤーが同じフォルダ構造を使用している場合、Lambda 関数のコードはパスを指定せずにそのレイヤーのコンテンツにアクセスできます。
重要: Node.js 用にインポートするライブラリは、nodejs/node_modules というフォルダ構造内にある必要があります。
Lambda がサポートするランタイムの基盤であるオペレーティングシステム (OS) と同じ OS に Lambda レイヤーを作成することをおすすめします。たとえば、最新バージョンの Node.js は Amazon Linux 2023 Amazon マシンイメージ (AMI) を基盤とします。
注: AWS コマンドラインインターフェイス (AWS CLI) コマンドの実行中にエラーが発生した場合は、「AWS CLI で発生したエラーのトラブルシューティング」を参照してください。また、AWS CLI の最新バージョンを使用していることを確認してください。
Node.js ライブラリ用の Lambda レイヤーを作成するには、次の手順を実行します。
-
Amazon Linux 2 AMI から Amazon Elastic Compute Cloud (Amazon EC2) インスタンスを作成します。
-
publish-layer-version API を呼び出すアクセス許可を持つ AWS Identity and Access Management (IAM) ロールを作成します。
-
IAM ロールを Amazon EC2 インスタンスにアタッチします。
注: 完了すると、EC2 インスタンスに、publish-layer-version API コールで Lambda レイヤーをアップロードするアクセス許可が付与されます。
-
SSH を使用して EC2 インスタンスに接続します。
-
Node.js をインストールします。
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.34.0/install.sh | bash$ . ~/.nvm/nvm.sh
nvm install node
-
nodejs フォルダを作成します。
mkdir nodejs
-
aws-xray-sdk ライブラリを nodejs フォルダにインストールします。
cd nodejs$ npm init ***answer all queries for initialization that create a package.json file***
npm install --save aws-xray-sdk
注: aws-xray-sdk というライブラリ例は、インポートする実際の Node.js ライブラリに置き換えます。
-
aws-xray-sdk ライブラリ用の zip アーカイブを作成します。
zip -r layer.zip nodejs
注: aws-xray-sdk ライブラリは、Node.js レイヤーに必要なフォルダ形式 (nodejs/node_modules) になっています。
-
Lambda レイヤーを発行するには、次の publish-layer-version コマンドを実行します。
aws lambda publish-layer-version --layer-name xray --zip-file fileb://layer.zip --compatible-runtimes nodejs12.x --region your-region
注: your-region は、お使いの AWS リージョンに置き換えます。
コードに ECMAScript 6 (ES6) モジュールまたは CommonJS モジュールを追加する方法については、「JavaScript ES6/CommonJS 構文」を参照してください。
関連情報
Lambda デプロイパッケージをアップロードする際、「permission denied」または「unable to import module」エラーが発生する場合の解決方法を教えてください
Node.js 用の Lambda デプロイパッケージを作成する方法を教えてください