Node.js で Lambda コードを実行したときの「Cannot find module」または「Cannot find Package」というエラーを解決するにはどうすればよいですか?

所要時間2分
0

Node.js で AWS Lambda コードを実行すると、「Cannot find Package」または「Cannot find Package」というエラーが表示されます。

簡単な説明

Node.js コードで指定したライブラリが Lambda 環境で見つからない場合は、次のいずれかのエラーが表示されます。これらのエラーは、Lambda に Node.js ライブラリの一部が事前にパッケージ化されていないために発生します。

  • 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 18 では JavaScript ES モジュールの依存関係をサポートしています。

以下の手順を使用して Lambda レイヤーを作成します。デプロイパッケージの代わりに Lambda レイヤーを作成すると、そのレイヤーを複数の Lambda 関数で再利用できます。各 Lambda ランタイムは、特定の /opt ディレクトリフォルダーを PATH 変数に追加します。レイヤーが同じフォルダー構造を使用している場合、Lambda 関数のコードはパスを指定しなくてもレイヤーのコンテンツにアクセスできます。

重要: Node.js 用にインポートするライブラリは、nodejs/node_modules フォルダー構造内にある必要があります。

解決方法

Lambda ランタイムを実行する基盤となるオペレーティングシステムと同じオペレーティングシステムで Lambda レイヤーを作成するのがベストプラクティスです。例えば、すべてのバージョンの Node.js は Amazon Linux 2 の Amazon マシンイメージ (AMI) の上で実行されます。

Node.js ライブラリ用の Lambda レイヤーを作成します。

  1. Amazon Linux 2 AMI から Amazon Elastic Compute Cloud (Amazon EC2) インスタンスを作成します

  2. publish-layer-version API を呼び出す権限を持つ AWS Identity and Access Management (IAM) ロールを作成します。次に、IAM ロールを EC2 インスタンスにアタッチします

注: これで、EC2 インスタンスに、publish-layer-version API 呼び出し用の Lambda レイヤーをアップロードする権限が付与されました。

  1. EC2 インスタンスに接続し、Node.js をインストールします。
$ curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.34.0/install.sh | bash
$ . ~/.nvm/nvm.sh
$ nvm install node
  1. nodejs フォルダーを作成します。
$ mkdir nodejs
  1. aws-xray-sdk ライブラリを nodejs フォルダーにインストールします。
$ cd nodejs
$ npm init  ***answer all queries regarding initialization that create a package.json file***
$ npm install --save aws-xray-sdk

注: aws-xray-sdk サンプルライブラリを、インポートしたい Node.js ライブラリに置き換えます。

  1. aws-xray-sdk ライブラリ用の zip アーカイブを作成します。
$ zip -r layer.zip nodejs

注: aws-xray-sdk ライブラリは、Node.js レイヤーに必要なフォルダー形式 (nodejs/node_modules) になっています。

  1. Lambda レイヤーを公開します。
$ aws lambda publish-layer-version --layer-name xray --zip-file fileb://layer.zip --compatible-runtimes nodejs12.x --region us-east-1

注: 読み込んだコードに ECMAScript 6 (ES6) モジュールまたは CommonJS モジュールを追加する手順については、「JavaScript ES6/CommonJS syntax」を参照してください。

関連情報

Lambda デプロイパッケージをアップロードするときに「権限が拒否されました」または「モジュールをインポートできません」というエラーを解決するには、どうすればよいですか?

AWS公式
AWS公式更新しました 1年前
コメントはありません