我正在尝试创建一个简单的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');
}
{
"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)"
]
}
有人有什么想法吗?
答案 0 :(得分:66)
您的文件名称需要与处理程序配置中的模块名称匹配。在这种情况下,您的处理程序应设置为helloworld.handler
,其中helloworld
是需要的文件()'d,handler
是导出的函数。然后它应该使用相同的zip文件。
答案 1 :(得分:54)
确保您的index.js位于zipfile的根目录中,而不是在子目录中。
在我的情况下,我的模块名称与文件名和导出的处理程序相匹配,真正的问题是macOS和zip程序基本上在zip文件中创建了一个文件夹,因此在AWS Lambda引擎中解压缩时index.js以子目录结尾。
不要右键单击并压缩目录,而是选择单个文件,例如 index.js , package.json 和 node_modules 目录并右键单击以进行压缩,最终可能会在同一目录中找到Archive.zip文件。 zip文件的名称不会很花哨但至少在将它提交给AWS Lambda时会起作用。
使用zip -r function.zip function
命令行可能会犯同样的错误,该命令行基本上会创建一个名为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%)
使用 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
注意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 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%)
答案 2 :(得分: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”
它将返回给我们ARN,我们将使用我们的lambda。你应该用手创造
3)创建我们的lambda
$ aws lambda create-function - function-name “your_lambda_name” - zip-file fileb://lambda.zip - handler < / strong> index.handler - 运行时 nodejs6.10 - 超时 15 - 角色 COPY_HERE_YOUR_ARN_FROM_THE_STEP_2
我们完成了!
答案 3 :(得分:0)
Grunt
第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服务创建文件夹
# 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步:创建Gruntfile.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步:创建awsCredentials.js
使用自定义策略创建AWS IAM用户,自定义策略应该可以访问lambda:GetFunction
,lambda:UploadFunction
,lambda:UpdateFunctionCode
,lambda:UpdateFunctionConfiguration
和iam:PassRole
{
"accessKeyId": "XXXXXXXXXXXXXXXXXXXX",
"secretAccessKey": "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
}
第7步:创建一个zip并部署到AWS Lambda。
ls-deploy
是由上面的Gruntfile创建的自定义任务,它创建一个源代码压缩并部署到Lambda。
grunt ls-deploy
答案 4 :(得分:0)
以一个名为“ sample ”的文件夹为例,我们要对其进行压缩。假设示例文件夹中有一些子文件夹或文件。
问。你该怎么办?
Ans-以下是步骤:
问:该怎么办?
回答-不要压缩“样本”文件夹。这行不通。
答案 5 :(得分:-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');
}