【问题标题】:AWS lambda function error - Unable to import module 'index': ErrorAWS lambda 函数错误 - 无法导入模块“索引”:错误
【发布时间】:2019-10-10 23:59:11
【问题描述】:

我正在尝试在 nodejs 中创建一个 lambda。按照文档,我创建了一个带有 lambda 函数、node_modules 和 package.json 的 zip 文件。我的 lambda 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 使用 lambda-local 在本地运行。但是在测试这个 lambda 时会抛出错误

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 的导入),则错误将更改为另一个节点模块。

我的 lambda 函数似乎无法加载/找到 node_modules。 是不是因为 lambda 安装 npm 失败?

任何解决此问题的建议都会有所帮助,因为我们已经为此苦苦挣扎了几天

谢谢

更多详情

  1. 我们可以通过删除 node_modules 文件夹然后在本地运行 lambda 来重现错误
  2. 如果我删除所有依赖项,一个简单的日志记录语句将起作用。
  3. lambda 在 aws 中使用节点 8.10

回答 (@Kannaiyan)

将 zip 任务更改为:

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

为我工作。

【问题讨论】:

  • 在部署 lambda 时,您还需要上传 node_module。看来您的 lodash 需要一个模块,该模块存在于您的机器中,但不在您的应用程序 node_module 中。
  • 我没有直接在我的函数中使用 lodash。但似乎它是从 ioredis 引用的。
  • 可能有一些模块使用lodashlodash 使用不在您的node_module 中的其他NPM 模块。当我们运行应用程序时,这是搜索 NPM 模块的方式,首先搜索你的目录 __dirname/node_modules,然后是 ../node_modules,这将一直持续到机器的 root 目录。因此,在本地测试时不会出现错误,因为此流程可能会发生,但是在 AWS lambda 中,该模块根本不可用。只需删除所有模块并重新安装即可。
  • 谢谢纳文。我暂时通过 AWS 控制台手动上传一个 zip 文件。在 zip 文件中,我可以在 node_modules 文件夹中看到所有必需的 npms。您能否再描述一下 - “删除所有模块并重新安装它们”

标签: node.js amazon-web-services aws-lambda


【解决方案1】:

无法导入模块“索引”:错误

您的某些依赖项似乎已安装/未正确打包。删除 node_modules 目录并使用npm install 重新安装模块应该可以解决问题。

确保您的函数按照文档 https://docs.aws.amazon.com/lambda/latest/dg/nodejs-create-deployment-pkg.html 中的说明进行打包

如果你的 bundle 遗漏了一个 node_module,那么就会导致这个错误。

EDIT1:

您遇到了 gulp 打包问题。

以下示例包含使用 gulp 打包 lambda 的完整文档。

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

希望对你有帮助。

【讨论】:

  • 我已经这样做了。 node_modules 在我上传的 zip 文件中。我的 package.json 的依赖部分的所有包都在 node_modules 文件夹中。我正在使用 gulp zip 任务来创建 zip 文件
  • 我已经更新了我的问题中的更多细节,以便其他人可以使用它
【解决方案2】:

使用 CloudFormation 创建 AWS::Serverless::Function 并使用 InlineCode 指定代码时也出现此错误,其中代码引用了未捆绑在所选运行时中的依赖项.

请注意,一些包包含在运行时中(例如,nodejs8.10 似乎至少有 aws-sdk 和 util)。

【讨论】:

    猜你喜欢
    • 2019-11-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-22
    • 2023-03-18
    • 2021-11-20
    • 1970-01-01
    • 2022-01-23
    • 2020-11-06
    相关资源
    最近更新 更多