在AWS中从zip文件创build一个lambda函数

我正在尝试创build一个简单的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'); } 

在helloworld.js文件中。 我压缩起来,并在创build一个lambda函数部分作为zipfile upload,我不断收到此错误:

 { "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)" ] } 

有人有主意吗?

您的文件的名称需要与处理程序configuration中的模块名称匹配。 在这种情况下,你的处理程序应该被设置为helloworld.handler ,其中helloworld是文件require()'d和handler是导出的函数。 那么它应该使用相同的zip文件。

AWS Lambda配置截图

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

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

使用Finder

不要右键单击并压缩目录 ,而是select像index.jspackage.jsonnode_modules目录这样的文件单独文件,然后右键单击进行压缩,最终可能会在同一个目录中创build一个Archive.zip文件。 压缩文件的名称不会太花哨,但至less在您将其提交给AWS Lambda时会起作用。

使用命令行

你可以使用命令行使用zip -r function.zip function ,它基本上创build一个带有一个名为function的目录的zip文件,而不是:

 $ zip function.zip index.js package.json node_modules adding: index.js (deflated 47%) adding: package.json (deflated 36%) adding: node_modules/ (stored 0%) 

如何知道validation你的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 

注意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 

请注意,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%) 

自动化 – 使用Grunt

完整的AWS Lambda种子项目在Git上可用。

第1步:初始化npm模块

npm init

第2步:安装Grunt

npm install --save-dev grunt grunt-cli

第3步:安装grunt-aws-lambda

npm install --save-dev grunt-aws-lambda

第4步:为Lambda服务创build文件夹

 # Create directory mkdir lambdaTest # Jump into folder cd lambdaTest # Create service file touch lambdaTest.js # Initialize npm npm init 

保持你的逻辑/代码到lambdaTest.js

 'use strict' exports.handler = (event, context, callback) => { console.log("Hello it's looks like working"); }; 

第5步:创buildGruntfile.js

返回到根文件夹touch Gruntfile.js

 'use strict' module.exports = function (grunt) { grunt.initConfig({ lambda_invoke: { lambdaTest: { options: { file_name: "lambdaTest/lambdaTest.js", event: "lambdaTest/test.json", } } }, lambda_package: { lambdaTest: { options: { package_folder: 'lambdaTest/' } } }, lambda_deploy: { lambdaTest: { arn: 'arn:aws:lambda:eu-central-1:XXXXXXXX:function:lambdaTest', options: { credentialsJSON: 'awsCredentials.json', region: "eu-central-1" }, } }, }); grunt.loadNpmTasks('grunt-aws-lambda'); grunt.registerTask('ls-deploy', ['lambda_package:lambdaTest', 'lambda_deploy:lambdaTest']); }; 

第6步:创buildawsCredentials.js

使用自定义策略创buildAWS IAM用户,自定义策略应该可以访问lambda:UploadFunctionlambda:UpdateFunctionCodelambda:UpdateFunctionConfigurationlambda:UpdateFunctionConfigurationiam:PassRole

 { "accessKeyId": "XXXXXXXXXXXXXXXXXXXX", "secretAccessKey": "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" } 

第7步:创build一个zip并将其部署到AWS Lambda。

ls-deploy是在上面的Gruntfile中创build的自定义任务,它创build了一个源代码zip并部署到Lambda。

grunt ls-deploy

完整的AWS Lambda种子项目在Git上可用。

这是AWS CLI的一种先进的方式。 这将节省您的时间长期使用。

首先,您应该安装并configurationAWS CLI:

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

1)创build一个档案

$ zip -r lambda *

它会为我们创buildlambda.zip文件,其中包含我们当前位置的所有文件夹和文件。

2)获得angular色ARN

$ aws iam list-roles | grep“your_role”

它会返回给我们ARN,我们将使用我们的lambda。 你应该用手创造它

列表angular色示例

3)创build我们的lambda

$ aws lambda create-function –function-name “your_lambda_name”– zip文件 fileb://lambda.zip –handler index.handler –runtime nodejs6.10 –timeout 15 –role COPY_HERE_YOUR_ARN_FROM_THE_STEP_2

我们完了!

因为在exports.handler中,你没有引用索引函数。 这可以用更简单的方法来解决

尝试这个,

 console.log('Loading function'); exports.handler = function index (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'); }