从 zip 文件在 AWS 中创建 lambda 函数
Creating a lambda function in AWS from zip file
我正在尝试创建一个简单的 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 文件中。我将其压缩并在创建 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)"
]
}
有没有人有什么想法?
您的文件名称需要与 Handler 配置中的模块名称匹配。在这种情况下,您的处理程序应设置为 helloworld.handler
,其中 helloworld
是将被 require() 的文件,而 handler
是导出的函数。然后它应该使用相同的 zip 文件。
确保您的 index.js 位于 zip 文件的根目录中,而不是子目录中。
在我的例子中,我的模块名称与文件名称和导出的处理程序相匹配,真正的问题是 macOS 和 zip 程序,它基本上在 zip 文件中创建一个文件夹,因此在 AWS Lambda 中解压缩时引擎 index.js 结束于一个子目录。
使用访达
不要右键单击并压缩目录,而是 select 单个文件 index.js, package.json和node_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%)
如何知道验证您的 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
注意 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 Seed project is available on 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 服务创建文件夹
# Create directory
mkdir lambdaTest
# Jump into folder
cd lambdaTest
# Create service file
touch lambdaTest.js
# Initialize npm
npm init
让你的 logic/code 变成 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
完成AWS Lambda Seed project is available on Git.
这是因为在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');
}
这是 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"
它将 return 提供给我们将与 lambda 一起使用的 ARN。你应该亲手创造它
Example for list-roles
3) 创建我们的 lambda
$ aws lambda create-function --function-name "your_lambda_name" --zip-file fileb://lambda.zip --handler index.handler --runtime nodejs6.10 --timeout 15 --role COPY_HERE_YOUR_ARN_FROM_THE_STEP_2
我们完成了!
让我们以一个名为“sample”的文件夹为例,我们要压缩它。假设示例文件夹中有一些子文件夹或文件。
问。你必须做什么?
答案 - 以下是步骤:
- 进入文件夹 'sample'。
- select 所有必需的文件或子文件夹。
- 右键单击任何一个并select发送至。
- 您会看到 Archive.zip,只需将它保存在您的笔记本电脑中的任何地方
想要。
- 将此 zip 上传为亚马逊 lambda 函数。
Q.What不做?
Ans - 不要压缩 'sample' 文件夹。不行。
我正在尝试创建一个简单的 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 文件中。我将其压缩并在创建 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)"
]
}
有没有人有什么想法?
您的文件名称需要与 Handler 配置中的模块名称匹配。在这种情况下,您的处理程序应设置为 helloworld.handler
,其中 helloworld
是将被 require() 的文件,而 handler
是导出的函数。然后它应该使用相同的 zip 文件。
确保您的 index.js 位于 zip 文件的根目录中,而不是子目录中。
在我的例子中,我的模块名称与文件名称和导出的处理程序相匹配,真正的问题是 macOS 和 zip 程序,它基本上在 zip 文件中创建一个文件夹,因此在 AWS Lambda 中解压缩时引擎 index.js 结束于一个子目录。
使用访达
不要右键单击并压缩目录,而是 select 单个文件 index.js, package.json和node_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%)
如何知道验证您的 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
注意 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 Seed project is available on 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 服务创建文件夹
# Create directory
mkdir lambdaTest
# Jump into folder
cd lambdaTest
# Create service file
touch lambdaTest.js
# Initialize npm
npm init
让你的 logic/code 变成 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
完成AWS Lambda Seed project is available on Git.
这是因为在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');
}
这是 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"
它将 return 提供给我们将与 lambda 一起使用的 ARN。你应该亲手创造它
Example for list-roles
3) 创建我们的 lambda
$ aws lambda create-function --function-name "your_lambda_name" --zip-file fileb://lambda.zip --handler index.handler --runtime nodejs6.10 --timeout 15 --role COPY_HERE_YOUR_ARN_FROM_THE_STEP_2
我们完成了!
让我们以一个名为“sample”的文件夹为例,我们要压缩它。假设示例文件夹中有一些子文件夹或文件。
问。你必须做什么?
答案 - 以下是步骤:
- 进入文件夹 'sample'。
- select 所有必需的文件或子文件夹。
- 右键单击任何一个并select发送至。
- 您会看到 Archive.zip,只需将它保存在您的笔记本电脑中的任何地方 想要。
- 将此 zip 上传为亚马逊 lambda 函数。
Q.What不做?
Ans - 不要压缩 'sample' 文件夹。不行。