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