【问题标题】:aws-lambda Cannot find moduleaws-lambda 找不到模块
【发布时间】: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”设置为处理程序名称?你能显示你的函数的标题吗?
  • 您确定压缩的是文件的内容,而不是文件本身吗?

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


【解决方案1】:

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

  1. 将文件命名为exports.js
  2. 在文件中将处理程序命名为exports.handler
  3. 将 lambda 配置中的处理程序设置为 exports.handler
  4. 只压缩文件夹的内容,而不是文件夹本身(如上所述)并将压缩文件重命名为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)的依赖关系也需要成为包的一部分。

          所以这是你必须做的:

          1. 将目录更改为项目文件夹中的 node_modules 文件夹,然后运行命令“npm install gm async”。这将在此文件夹中安装 gm、async 及其所有依赖项。
          2. 现在将“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
              节点模块

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2021-12-16
                • 2021-09-13
                • 2021-11-20
                • 2021-04-20
                • 2016-11-01
                • 1970-01-01
                • 1970-01-01
                • 2020-06-16
                相关资源
                最近更新 更多