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 找不到模块的主要内容,如果未能解决你的问题,请参考以下文章