aws-lambda 找不到模块

Posted

技术标签:

【中文标题】aws-lambda 找不到模块【英文标题】:aws-lambda Cannot find module 【发布时间】:2015-08-21 02:26:23 【问题描述】:

从 zip 文件上传代码时,我在 aws-lambda 控制台中不断收到此错误。我已经尝试上传其他 zip 文件并且它们工作正常。 .js 文件在 zip 文件中名为“CreateThumbnail.js”。我相信处理程序也被正确命名为“CreateThumbnail.handler”。 node_modules 子目录也已设置。有人知道吗?


  "errorMessage": "Cannot find module 'CreateThumbnail'",
  "errorType": "Error",
  "stackTrace": [
  "Function.Module._resolveFilename (module.js:338:15)",
  "Function.Module._load (module.js:280:25)",
  "Module.require (module.js:364:17)",
  "require (module.js:380:17)"
  ]

【问题讨论】:

您是否在“更改功能配置和角色”部分中将“CreateThumbnail”设置为处理程序名称?你能显示你的函数的标题吗? 您确定压缩的是文件的内容,而不是文件本身吗? 【参考方案1】:

我能够让它工作的方式是:

    将文件命名为exports.js 在文件中将处理程序命名为exports.handler 将 lambda 配置中的处理程序设置为 exports.handler 只压缩文件夹的内容,而不是文件夹本身(如上所述)并将压缩文件重命名为exports.zip

【讨论】:

文件的实际名称并不重要。关键是要完全限定文件和通向它的路径。我的 zip 文件有一个名为 scripts 的目录,其中有几个文件,其中包含 exports.handler。对于Lamdba 控制台中的Handler,我指定scripts/transforms.handler【参考方案2】:

好的,我自己做的,只要确保您制作的 zip 文件不会出现在文件夹中,因为 AWS 会解压缩您上传的文件并尝试通过以下方式查找 .js 文件您提供的处理程序的名称,如果它在文件夹中,它将无济于事。

【讨论】:

冠军。如果使用将所有内容都放在一个文件夹中的 OS X“压缩”(应该如此),那么很容易被此绊倒。 这救了我,因为我试图导出当前代码,导出时它把所有东西都放在一个文件夹中,所以我认为我在上传时也需要一个文件夹【参考方案3】:

一个可能的问题是,如果您将 lambda 作为通过 PowerShell Compress-Archive 创建的 zip 文件上传。 Compress-Archive has a bug 导致 AWS 将文件提取到平面树中(无子目录),文件名中带有反斜杠:

【讨论】:

该错误报告中的comments 之一有使用命令行版本7zip 而不是Compress-Archive 的说明。这对我有用【参考方案4】:

如果您使用AWS Lambda Layers,则需要验证您的目录结构是否在层所需的结构上:

例如对于moment.js node.js 模块,您需要以下结构:

aws-lambda-layer.zip
│ nodejs
│ nodejs/node_modules
└ nodejs/node_modules/moment

因此,要创建一个具有正确结构的层 zip 文件,我们可以在项目的根目录中使用以下命令:

mkdir -p nodejs && cp -r node_modules nodejs/ && zip -r aws-lambda-layer.zip nodejs

【讨论】:

【参考方案5】:

如果您的压缩文件没有全球读取权限,则可能会出现此确切错误。 (chmod -R ugo+r)。

在压缩文件之前检查文件权限。不幸的是,AWS 没有足够强调这一点,它给许多人带来了很多麻烦。

【讨论】:

我正在使用 gulp 构建并使用 gulp-zip 包生成我的 zip 文件,它产生了这种形式的问题。似乎只在它尝试压缩它时发生(默认),所以使用这个选项使它对我有用:.pipe(zip('myfile.zip', compress: false ))。谢谢,我在这个上拉了一段时间的头发。 抓紧..compress:false 不起作用,但gulp-zip 仍然是罪魁祸首。手动压缩相同的文件有效。【参考方案6】:

某些库文件可能没有全局读取,因此 lambda 将无法读取内容并构建内容。

在打包之前确保node_modules中的所有文件都是可读的:

chmod -R +r node_modules

然后压缩并上传。

【讨论】:

这真是一个陷阱。非常感谢。【参考方案7】:

我在 node_modules 目录中构建的自定义模块上遇到了这个问题。在我的 Win10 机器上测试一切正常,但上传时我一直收到同样的“找不到模块 'modulename'”错误。

原来我有一个不匹配;这是无法找到的模块中的 package.json 行:

"main": "./build/modulename.js",

这是实际的文件名:

Modulename.js

区分大小写; Windows 不是,Linux(以及 AWS)是。

【讨论】:

【参考方案8】:

这是我遵循的来自https://docs.aws.amazon.com/lambda/latest/dg/nodejs-package.html 的说明,它有效。

使用依赖项更新 Node.js 函数

打开命令行终端或 shell。确保本地环境中的 Node.js 版本与函数的 Node.js 版本匹配。

为部署包创建一个文件夹。以下步骤假定文件夹名为 my-function。

使用 npm install 命令在 node_modules 目录中安装库。

npm install the_package_that_is_missing

创建一个包含项目文件夹内容的 .zip 文件。使用 r(递归)选项确保 zip 压缩子文件夹。

zip -r function.zip .

使用 update-function-code 命令上传包。

aws lambda update-function-code --function-name my-function --zip-file fileb://function.zip

现在您的函数可以运行了!

【讨论】:

【参考方案9】:

AWS Lambda 使用文件名和处理程序函数的名称,因此如果您这样定义处理程序:exports.myHandler = function(event, context) 在名为 index.js 的文件中,您的处理程序是 index.myHandler

【讨论】:

如果我需要使用打字稿,我还需要做些什么来使用 index.ts 而不是 index.js【参考方案10】:

这对我来说很简单。

我得到了,无法创建索引。就我而言,我的带有exports.handler 的主lambda 文件必须被称为index.js

尝试调用您的主文件 CreateThumbnail.js

【讨论】:

【参考方案11】:

本教程告诉您在 zip 文件中包含以下项目:

创建缩略图.js /node_modules/gm /node_modules/async

它没有考虑的是两个包(gm,async)的依赖关系也需要成为包的一部分。

所以这是你必须做的:

    将目录更改为项目文件夹中的 node_modules 文件夹,然后运行命令“npm install gm async”。这将在此文件夹中安装 gm、async 及其所有依赖项。 现在将“CreateThumbnail.js”文件和complete“node_modules”文件夹打包成一个zip文件并上传。它现在应该可以工作了。

所以你的完整包应该是这样的:

CreateThumbnail.js
/node_modules/.bin
/node_modules/array-parallel
/node_modules/array-series
/node_modules/async
/node_modules/cross-spawn
/node_modules/debug
/node_modules/gm
/node_modules/isexe
/node_modules/lodash
/node_modules/lru-cache
/node_modules/ms
/node_modules/pseudomap
/node_modules/which
/node_modules/yallist

【讨论】:

【参考方案12】:

这无关,但谷歌把我带到了这里,所以:

AWS 会给你一个错误:

Unable to import module '<myfile>': Error

对我来说真正发生的事情是需要一个不存在的 JS 文件。这个错误有点误导。

【讨论】:

【参考方案13】:

文件名: 应用程序.js “app.js”中的 Lambda 函数: export.handler = 函数(事件,上下文)... Amazon 控制台上的 Lambda 处理程序: app.handler (app.js + 出口。handler = app.handler)

解压文件夹后,您应该会看到: 应用程序.js 节点模块

【讨论】:

以上是关于aws-lambda 找不到模块的主要内容,如果未能解决你的问题,请参考以下文章

windows找不到指定模块怎么办?

matlab安装,找不到指定模块,程序

找不到指定模块

解决找不到pip模块的问题

S7200编程时找不到添加模似量模块设置

电脑找不到指定的模块是怎么回事?