1. ホーム
  2. node.js

[解決済み] AWS lambda function error - Unable to import module 'index': エラー

2022-02-01 10:39:43

質問内容

nodejsでlambdaを作ろうとしています。ドキュメントに従って、私はラムダ関数、node_modules、package.jsonを含むzipファイルを作成しました。私のラムダZIPファイルの構造は次のとおりです。

my-lambda-function/
|
|---util/
|     |
|     |--util-1.js
|     |--util-2.js
|---api/
|     |
|     |--api-call-1.js
|     |--api-call-2.js    
|
|---config
|     |
|     |--env/
|     | |--env-file-1.js
|     |
|     |--config-file-1.js
|     |--config-file-2.js
|
|---node_modules/
|     |
|     |--module-1/
|     |--module-2/
|---index.js
|---package.json

このZIPファイルを作成するために、gulpのタスクを使っています。

gulp.task('zip', ['test'], () => {
 const buildArtifact = ['index.js', 'package.json', 'util/**', 
 'config/**', 'api/**'];
 Object.keys(pjson.dependencies).forEach((dep) => {
  buildArtifact.push(`node_modules/${dep}/**/*`);
 });
 const zipFile = `${pjson.name}.zip`;
 return gulp.src(buildArtifact, { base: '.' })
   .pipe(zip(zipFile))
   .pipe(gulp.dest('build'));
});

このラムダはlambda-localでローカルに実行されています。しかし、テスト中にこのラムダはエラーを投げます。

Unable to import module 'index': Error
at Function.Module._resolveFilename (module.js:547:15)
at Function.Module._load (module.js:474:25)
at Module.require (module.js:596:17)
at require (internal/module.js:11:18)
at Object.<anonymous> (/var/task/node_modules/ioredis/built/utils/lodash.js:2:19)
at Module._compile (module.js:652:30)
at Object.Module._extensions..js (module.js:663:10)
at Module.load (module.js:565:32)

現在のエラーはioredisモジュール(node_moduesフォルダにあります)を指していますが、コードからioredisの使用を削除すると(ioredisのimportを削除する)、エラーは別のノードモジュールに変わります。

私のラムダ関数が node_modules をロード/検索できないようです。 lambdaがnpmのインストールに失敗しているのが原因でしょうか?

数日前から悩んでいるので、解決するためのポインタがあれば助かります

ありがとうございます。

詳細

  1. node_modules フォルダを削除し、ローカルでラムダを実行すると、エラーを再現することができます。
  2. 依存関係をすべて削除すると、些細なロギング文が機能するようになります。
  3. ラムダはawsのnode 8.10を使用しています。

回答 (@Kannaiyan)

zipタスクを変更する。

gulp.task('npm-install', () => gulp.src('./package.json')
  .pipe(gulp.dest('build/'))
  .pipe(install({ production: true })));

が動作しました。

解決方法は?

<ブロッククオート

モジュール 'index' をインポートできません。エラー

依存関係の一部が正しくインストールされていない/パッケージ化されていないようです。node_modules ディレクトリを削除して、モジュールを再インストールしてください。 npm install は問題を解決するはずです。

ドキュメントに記載されているように、関数がパッケージ化されていることを確認します。 https://docs.aws.amazon.com/lambda/latest/dg/nodejs-create-deployment-pkg.html

バンドルに node_module がない場合、このエラーになります。

EDIT1です。

gulpのパッケージングに問題があるようです。

次の例は、gulpでlambdaをパッケージングするための完全なドキュメントを持っています。

https://medium.com/@AdamRNeary/a-gulp-workflow-for-amazon-lambda-61c2afd723b6

お役に立てれば幸いです。