在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文件。
确保你的index.js位于zipfile的根目录下,而不是在子目录中。
在我的情况下,我有模块的名称匹配文件的名称和导出的处理程序,真正的问题是macOS和zip程序基本上创build一个文件夹内的压缩文件,所以当在AWS Lambda引擎中解压缩index.js结束于一个子目录。
使用Finder
不要右键单击并压缩目录 ,而是select像index.js , package.json和node_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:UploadFunction
, lambda:UpdateFunctionCode
, lambda:UpdateFunctionConfiguration
, lambda:UpdateFunctionConfiguration
和iam: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'); }