从zip文件在AWS中创建lambda函数

jst*_*hng 48 javascript amazon-web-services node.js aws-lambda

我正在尝试创建一个简单的lambda函数,我遇到了一个错误.

我的代码基本上是

console.log('Loading function');

exports.handler = function(event, context) {
    console.log('value1 =', event.key1);
    console.log('value2 =', event.key2);
    console.log('value3 =', event.key3);
    context.succeed(event.key1);  // Echo back the first key value
    // context.fail('Something went wrong');
}
Run Code Online (Sandbox Code Playgroud)

在helloworld.js文件中.我将其压缩并在创建lambda函数部分时将其作为zip文件上传,并且我不断收到此错误:

{
  "errorMessage": "Cannot find module 'index'",
  "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)"
  ]
}
Run Code Online (Sandbox Code Playgroud)

有人有主意吗?

Jam*_*mes 67

您的文件名称需要与Handler配置中的模块名称匹配.在这种情况下,应将Handler设置为helloworld.handler,helloworldrequire()'d的文件在哪里,并且handler是导出的函数.然后它应该使用相同的zip文件.

AWS Lambda配置截图

  • 如果您尝试上传包含lambda文件的压缩文件夹,您还会看到此错误您必须压缩并上载目录的内容,而不是目录本身. (3认同)
  • 我复制了你的功能测试,上传并运行它,并成功获得了输出`value1`.你改变了吗? (2认同)
  • 我担心这超出了我的范围,但我很高兴zip文件正常工作. (2认同)

bit*_*voc 56

确保index.js位于zipfile的根目录中,而不是在子目录中.

在我的情况下,我有模块的名称与文件的名称和导出的处理程序匹配,真正的问题是macOS和zip程序,它基本上在zip文件中创建一个文件夹,所以当在AWS Lambda引擎中解压缩时,index.js在子目录中结束.

使用Finder

不要右键单击并压缩目录,而是选择单个文件(如index.js,package.jsonnode_modules目录)并右键单击以压缩文件,最后可能会在同一目录中找到Archive.zip文件.zip文件的名称不会很花哨但至少在将它提交给AWS Lambda时会起作用.

使用命令行

你可以使用命令行犯同样的错误zip -r function.zip function,基本上创建一个zip文件,其中包含一个目录function,而不是:

$ zip function.zip index.js package.json node_modules

adding: index.js (deflated 47%)
adding: package.json (deflated 36%)
adding: node_modules/ (stored 0%)
Run Code Online (Sandbox Code Playgroud)

如何知道验证您的zip文件

使用finder,如果双击zip文件并在子目录中解压缩,则Lambda将无法看到该文件,因为index.js位于该子目录中.

使用命令行zipinfo:

$ zipinfo function.zip | grep index.js | more
-rw-r--rw-  2.1 unx     1428 bX defN 27-Jul-16 12:21 function/index.js
Run Code Online (Sandbox Code Playgroud)

注意index.js如何在子目录中结束function,你搞砸了.

$ zipinfo function.zip | grep index.js | more
-rw-r--rw-  3.0 unx     1428 tx defN 27-Jul-16 12:21 index.js
Run Code Online (Sandbox Code Playgroud)

请注意,index.js不在子文件夹中,此zip文件可在AWS Lambda中使用.

利用npm命令压缩功能

所以我在我的包中添加了一个脚本,只需运行即可为我压缩项目文件 npm run zip

{
  "name": "function",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "zip": "zip function.zip package.json *.js node_modules"
  },
  "dependencies": {
    "aws-sdk": "^2.4.10"
  }
}

$ npm run zip

> function@1.0.0 zip 
> zip function.zip package.json *.js node_modules

  adding: package.json (deflated 41%)
  adding: index.js (deflated 47%)
  adding: local.js (deflated 42%)
  adding: node_modules/ (stored 0%)
Run Code Online (Sandbox Code Playgroud)

  • "不要右键单击并压缩目录" - 我需要的东西.谢谢! (4认同)
  • 在您的示例中:"$ zip function.zip index.js package.json node_modules"缺失-r表示node_modules文件夹将为空 - 您可以在示例的输出中看到(添加:node_modules /(存储0%) ) - 我不认为那是你想要的吗? (4认同)

小智 6

这是使用AWS CLI的高级方法。它将节省您长期使用的时间。

首先,您应该安装和配置AWS CLI:

http://docs.aws.amazon.com/cli/latest/userguide/installing.html

1)建立档案

$ zip -r lambda *

它将为我们创建lambda.zip文件,其中所有文件夹和文件都位于当前位置。

2)获取角色ARN

$ aws iam list-roles | grep“ your_role”

它会返回给我们与我们的lambda一起使用的ARN。你应该用手创造它

清单角色示例

3)创建我们的lambda

$ aws lambda创建函数-函数名称 “ your_lambda_name” -zip文件 fileb://lambda.zip --handler index.handler --runtime nodejs6.10 --timeout 15 --role COPY_HERE_YOUR_ARN_FROM_THE_STEP_2

我们完了!