【问题标题】:Unable to use any 3rd party module with AWS Lambdas无法将任何第 3 方模块与 AWS Lambda 一起使用
【发布时间】:2017-06-28 08:07:15
【问题描述】:

我正在开发一个使用模块(异步、请求等)的 lambda

Unable to import module 'index': Error 
at Function.Module._resolveFilename (module.js:338:15) 
at Function.Module._load (module.js:280:25) 
at Module.require (module.js:364:17) 
at require (module.js:380:17) 
at Object.<anonymous> (/var/task/index.js:1:63) 
at Module._compile (module.js:456:26) 
at Object.Module._extensions..js (module.js:474:10) 
at Module.load (module.js:356:32) 
at Function.Module._load (module.js:312:12) 
at Module.require (module.js:364:17)

示例代码:

var 
  AWS = require('aws-sdk'),
  util = require('util'),
  request = require('request');

exports.handler = function(event, context) {
   console.log('test');
   context.done();
};

只要不需要 3rd 方模块(除了 aws-sdk),它就可以正常工作(打印测试)。只要我添加一行,例如:

require('request') // or async, config and so on

它因上述错误而失败。我也尝试通过指定完整路径来直接调用这些模块,但没有成功。就像调用require时看错了目录一样。

在控制台中转储process.env 会产生:

PATH: '/usr/local/bin:/usr/bin:/bin',
LAMBDA_TASK_ROOT: '/var/task',
LAMBDA_RUNTIME_DIR: '/var/runtime',
AWS_REGION: 'us-west-2',
AWS_DEFAULT_REGION: 'us-west-2',
AWS_LAMBDA_LOG_GROUP_NAME: '/aws/lambda/Thumbnailer',
AWS_LAMBDA_LOG_STREAM_NAME: '2015/12/10/[$LATEST]3f8ef236195448c88f206634bde6301b',
AWS_LAMBDA_FUNCTION_NAME: 'Thumbnailer',
AWS_LAMBDA_FUNCTION_MEMORY_SIZE: '512',
AWS_LAMBDA_FUNCTION_VERSION: '$LATEST',
NODE_PATH: '/var/runtime:/var/task:/var/runtime/node_modules',

这是我正在工作的module - 显然这曾经在某些时候有效,但不适用于我。

想法?我觉得我在这里缺少一些 lambdas 独有的配置。

【问题讨论】:

  • 您能描述一下您的 lambda 部署包吗?
  • @James - 我压缩文件(不是文件夹)。 Lambda 似乎运行良好,只是无法使用该模块。
  • 好吧 - 我应该说它不会抛出错误,但什么也没发生,因为它只是回调,所以可能是其他问题。

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


【解决方案1】:

天哪,这很痛苦...原来 OSX 使 node_modules 文件夹只能由用户读取,而 AWS 无法读取它。使node_modules 文件夹和内容可以被世界读取并且它可以工作。我不确定所有 OSX 设置是否都反应相同。我正在使用nvm,这可能是罪魁祸首。

更新。我曾经将所有文件设置为0666,但遇到了可执行文件的问题。这是一个可以正确解决问题的小脚本。它将所有文件设置为0666,除非可执行文件或目录在这种情况下0777。从项目文件夹中运行它(请注意不这样做的含义!):

这是我发布的 question 的脚本:

#!/bin/bash
find . \
 '(' -perm -0700 -exec chmod 0777 '{}' + ')' -o \
 '(' -perm -0600 -exec chmod 0666 '{}' + ')'

【讨论】:

  • 我刚遇到这个问题,但是权限已经是世界可读的了。关于原因或修复的任何其他想法?
  • @ken 查看 James 的评论 - 确保您不压缩文件夹,而是压缩单个文件。
  • 我只是在查看 node-lambda 代码,它似乎遍历代码目录中的每个文件并将每个文件放入一个 zip 中。实际上,对于非 Windows,它可以使用本地压缩,但结果相同。似乎没有配置选项,但实际上我认为这是正确的行为。不是吗?
  • 嗯,我还没有使用 node-lambda。我只是 osx 压缩并上传。想到的另一件事是确保您在 AWS 面板上的设置指定了相同的入口点。我假设您的代码确实有一个 index.js 并且您的 aws 面板反映了这一点(我会假设如果您遇到与我相同的错误,那么它在亚马逊方面是正确的)
  • 是的,我正在使用一个正在正确部署的微服务,但随后我将单个 JS 文件拆分为少数“必需”的子模块。不是确定是那个还是其他什么,但由于某种原因它无法导入我的入口点文件:Unable to import module 'dist/transporter'
猜你喜欢
  • 1970-01-01
  • 2016-07-08
  • 2023-04-08
  • 2016-08-31
  • 1970-01-01
  • 1970-01-01
  • 2018-06-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多