Node.js で AWS Lambda 関数を作成しましたが、呼び出すと「Cannot find module」エラーが発生します。エラーが発生しないように デプロイパッケージを構築する方法を教えてください。
簡単な説明
「Cannot find module」(モジュールが見つかりません) エラーは、通常、次の 3 つの理由のいずれかで発生します。
- Lambda 関数のデプロイパッケージに、Lambda サービスが必要なモジュールとライブラリをロードするための正しいフォルダ構造がない。
- デプロイパッケージに正しいファイル権限がない。
- デプロイパッケージにインポートするモジュールが含まれていない。
注: Lambda にはグローバル読み取り権限が必要です。
解決方法
.zip ファイルのルートフォルダに関数コードを含むデプロイパッケージを作成し、すべてのファイルに読み取りおよび実行権限を適用するには、次の手順を実行します。
注意: AWS Command Line Interface (AWS CLI) のコマンド実行時にエラーが発生する場合は、AWS CLI の最新バージョンを使用していることを確認してください。
Linux および macOS の場合
関数プロジェクトフォルダへの依存関係のインストール
注意: ほとんどの Node.js モジュールはプラットフォームに依存しませんが、一部のモジュールは特定のオペレーティングシステム環境に対してコンパイルされます。Lambda は、Linux 環境で動作します。npm でモジュールをインストールする場合のベストプラクティスは、正しい依存関係が含まれるように Linux 環境で .zip ファイルを構築することです。
1. AWS CLI で、ディレクトリをプロジェクトフォルダに変更します。例:
cd /project-folder-name
重要: project-folder-name の部分を実際のプロジェクトフォルダの名前に置き換えてください。
2. 関数に必要な各モジュールに対して次のコマンドを実行して、依存関係を関数プロジェクトフォルダにローカルにインストールします。
npm install package-name
重要: package-name の部分を実際のパッケージ名に置き換えてください。解凍されたファイルの関数のサイズには 250 MB の制限があります。関数を動作させるのに必要なライブラリのみを含めてください。
例えば、AWS SDK for JavaScript モジュールをプロジェクトフォルダのルートにインストールするには、次のコマンドを実行します。
npm install aws-sdk
注: Lambda には、基本コンテナ設定の一部として AWS SDK for JavaScript ライブラリが含まれています。別のバージョンのライブラリを使用する場合は、ローカルなコピーを含めることもできます。現在の Lambda 環境およびサポート対象のライブラリの詳細については、Lambda 実行環境および利用可能なライブラリを参照してください。
デプロイパッケージの構築
AWS CLI で、次のコマンドを実行します。
zip -r ../function-name.zip .
注意: function-name の部分をデプロイパッケージに付ける名前に置き換えてください。これにより、プロジェクトフォルダのすべてのファイルが親フォルダにある .zip ファイルに配置されます。
デプロイパッケージの検証
1. AWS CLI で、次のコマンドを実行します。
zipinfo ../function-name.zip
注意: function-name の部分をデプロイパッケージの実際のファイル名に置き換えます。.zip ファイルに unzip -l を実行してコンテンツをリストすることもできますが、出力は詳細ではありません。
2. 関数ハンドラのソースファイルは、zip ファイルのルートにあることを検証するために出力を確認してください。
3. 出力を確認して、ファイルにグローバル読み取り許可があることを検証してください。詳細については、「デプロイパッケージをアップロードするときの「permission denied」または「unable to import module」という Lambda エラーをトラブルシューティングするにはどうすればよいですか?」を参照してください。
Windows の場合:
デプロイパッケージの構築
1. ファイルエクスプローラーで、プロジェクトフォルダーを開きます。
2. すべてのプロジェクトファイルを選択し、右クリックしてコンテキストメニューを開きます。
3. 送信するを選択し、圧縮 (ジップ済み) フォルダーを選択します。
4. .zipファイル名を入力します。
デプロイパッケージのアップロードおよび検証
1. Lambda コンソールで、関数を選択します。
2. [関数コード] の [コードエントリタイプ] で、[.zipファイルをアップロードする] を選択します。
3. 関数パッケージで、 アップロードを選択します。
4. 作成した.zipファイルを選択し、開くを選択します。
5. コンソールの最上部で、[保存] を選択します。
ヒント: AWS CLI から update-function-code をコマンドを実行して .zip ファイルをアップロードすることもできます。
6. アップロードが完了したら、[テスト] を選択します。
ヒント: AWS CLI から 7-Zip を使用して、デプロイパッケージのファイル権限を検証することもできます。7-Zip は 7-Zip のウェブサイトからダウンロードできます。
関連情報
Node.js の AWS Lambda デプロイパッケージ
デプロイパッケージの作成
Node.js での Lambda 関数の構築