Node.js で Lambda コードを実行すると「モジュールをインポートできません」というエラーが表示されるのですが、どうすれば解決できますか?

最終更新日: 2021-07-26

Node.js 内の AWS Lambda コードを実行しようとすると「モジュールをインポートできません」というエラーが表示されます。

簡単な説明

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

このエラーを解決するには、Lambda の Node.js コードで使用するライブラリを含めたデプロイパッケージまたは Lambda レイヤーを作成します。

注: 以下では、デプロイパッケージではなく 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 レイヤーをアップロードする権限が付与されました。

3.    EC2 インスタンスに接続し、Node.js をインストールします。

$ curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.34.0/install.sh | bash
$ . ~/.nvm/nvm.sh
$ nvm install node

4.    nodejs フォルダを作成します。

$ mkdir nodejs

5.    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 ライブラリに置き換えます。

6.    aws-xray-sdk ライブラリ用の zip アーカイブを作成します。

$ zip -r layer.zip nodejs

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

7.    Lambda レイヤーを公開します。

$ aws lambda publish-layer-version --layer-name xray --zip-file fileb://layer.zip --compatible-runtimes nodejs12.x --region us-east-1