- AWS Lambda 教程
- AWS Lambda - 主页
- AWS Lambda - 概述
- AWS Lambda - 环境设置
- AWS Lambda - 简介
- 构建 Lambda 函数
- NODEJS 中的函数
- Java 中的函数
- Python 中的函数
- Go 中的函数
- C# 中的函数
- 配置 Lambda 函数
- 使用 AWS 控制台创建和部署
- 使用 AWS CLI 创建和部署
- 使用无服务器框架创建和部署
- AWS 执行和调用 Lambda 函数
- 删除 Lambda 函数
- 使用 Amazon API Gateway
- 使用 Amazon S3 的 Lambda 函数
- 使用 Amazon DynamoDB 的 Lambda 函数
- 具有预定事件的 Lambda 函数
- 带有 Amazon SNS 的 Lambda 函数
- 带有 CloudTrail 的 Lambda 函数
- 使用 Amazon Kinesis 的 Lambda 函数
- 具有自定义用户应用程序的 Lambda 函数
- AWS Lambda@Edge 与 CloudFront
- 使用 Cloudwatch 进行监控和故障排除
- AWS Lambda - 其他示例
- AWS Lambda 有用资源
- AWS Lambda - 快速指南
- AWS Lambda - 有用的资源
- AWS Lambda - 讨论
AWS Lambda – NODEJS 中的函数
Nodejs 是 AWS Lambda 函数支持的语言之一。Nodejs支持的版本是v6.10和v8.10。在本章中,我们将详细了解NODEJS中AWS Lambda函数的各种功能。
NodeJS 中的处理程序
要在nodejs中编写AWS Lambda函数,我们首先应该声明一个处理程序。Nodejs 中的处理程序是文件的名称和导出函数的名称。例如,文件名是index.js,导出函数名是lambda handler,那么它对应的handler就是index.lambdahandler
观察此处显示的示例处理程序 -
exports.lambdahandler = function(event, context, callback) { //code goes here}
传递给处理程序的参数
Handler是构建Lambda函数的主要核心。该处理程序采用三个参数:事件、上下文和回调。
事件参数
它包含触发事件的所有详细信息。例如,如果我们使用 Lambda 函数在 S3 上触发,则事件将包含 S3 对象的详细信息。
上下文参数
它包含上下文的详细信息,例如 Lambda 函数的属性和配置详细信息。
回调函数
它有助于向呼叫者返回详细信息。回调的结构如下 -
callback(error, result);
回调函数的参数解释如下 -
错误 -如果在执行 Lambda 函数期间发生任何错误,这将包含详细信息。如果 Lambda 函数成功,则可以将null作为回调函数的第一个参数传递。
结果 -这将提供 lambda 函数成功执行的详细信息。如果发生错误,结果参数将被忽略。
注意 -不强制要求在 AWS Lambda 中使用回调函数。如果没有回调函数,则处理程序会将其返回为 null。
有效的回调签名如下 -
callback(); // It will return success, but no indication to the caller callback(null); // It will return success, but no indication to the caller callback(null, "success"); // It will return the success indication to the caller callback(error); // It will return the error indication to the caller
每当执行 AWS Lambda 时,错误或成功等回调详细信息都会与控制台消息(如果有)一起记录在 AWS CloudWatch 中。
在 Nodejs8.10 中使用 AWS Lambda
让我们了解如何在nodejs8.10中使用AWS Lambda并以同步和异步方式调用该函数。
以同步方式调用Lambda函数
以下示例向您展示了如何以同步方式调用 Lambda 函数 -
exports.handler = function(event, context, callback) { let arrItems = [4,5,6,8,9,10,35,70,80,31]; function countevennumbers (items) { return new Promise(resolve => { setTimeout(() => { let a = 0; for (var i in items) { if (items[i] % 2 == 0) { a++; } } resolve(a); },2000); }); } let evennumber = countevennumbers(arrItems); callback(null,'even numbers equals ='+evennumber); };
在 AWS 控制台中测试此代码后,您可以观察到以下输出 -
请注意,上述代码的输出是一个 Promise 对象。它不给出计数,因为计数在 setTimeout 内递增,并且函数调用不会等待 setTimeout 内的执行并返回 Promise 对象。
如果我们在处理函数上有async/await将会从 lambda 函数获得准确的输出。
以异步方式调用Handler
以下示例为您提供了有关以异步方式调用 Lambda 函数的想法 -
exports.handler = async function(event, context, callback) { let arrItems = [4,5,6,8,9,10,35,70,80,31]; function countevennumbers (items) { return new Promise(resolve => { setTimeout(() => { let a = 0; for (var i in items) { if (items[i] % 2 == 0) { a++; } } resolve(a); }, 2000); }); } let evennumber = await countevennumbers(arrItems); callback(null,'even numbers equals ='+evennumber); };
我们在上面的代码中添加了async和await。当我们在函数调用旁边使用await时,执行会暂停,直到函数内的promise得到解决。请注意,await仅对异步函数有效。
在 AWS 控制台中测试此代码后,您可以观察到以下输出 -
NodeJS 中的 ContextDetails
Context 对象提供详细信息,例如 Lambda 函数的名称、剩余时间(以毫秒为单位)、请求 ID、cloudwatch 组名称、超时详细信息等。
下表显示了上下文对象可用的方法和属性的列表 -
可用于上下文对象的方法
先生编号 | 方法名称和描述 |
---|---|
1 | getRemainingTimeInMillis() 此方法给出 Lambda 函数终止该函数之前的剩余时间(以毫秒为单位) |
可用于上下文对象的属性
先生编号 | 属性名称和描述 |
---|---|
1 | 函数名 这给出了 AWS Lambda 函数名称 |
2 | 函数版本 这给出了 AWS Lambda 函数执行的版本 |
3 | 调用函数Arn 这将提供 ARN 详细信息。 |
4 | 内存限制(以 MB 为单位) 这显示了创建 Lambda 函数时添加的内存限制 |
5 | aws请求ID 这给出了 AWS 请求 ID。 |
6 | 日志组名 这将给出 cloudwatch 组的名称 |
7 | 日志流名称 这将给出写入日志的 cloudwatch 日志流名称。 |
8 | 身份 这将提供与 aws mobile sdk 一起使用时有关 amazon cognito 身份提供商的详细信息。 详细信息如下 -
|
9 | 客户端上下文 这将是与 aws mobile sdk 一起使用时客户端应用程序的详细信息。详细信息如下 -
|
查看以下示例以更好地了解上下文对象 -
exports.handler = (event, context, callback) => { // TODO implement console.log('Remaining time =>', context.getRemainingTimeInMillis()); console.log('functionName =>', context.functionName); console.log('AWSrequestID =>', context.awsRequestId); console.log('logGroupName =>', context.log_group_name); console.log('logStreamName =>', context.log_stream_name); console.log('clientContext =>', context.clientContext); callback(null, 'Name of aws Lambda is=>'+context.functionName); };
在 AWS 控制台中测试此代码后,您可以观察到以下输出 -
在 AWS 控制台中测试此代码后,您可以观察以下日志输出 -
登录 NodeJS
我们可以使用 console.log 来登录 NodeJS。日志详细信息可以根据 Lambda 函数从 CloudWatch 服务中获取。
观察以下示例以更好地理解 -
exports.handler = (event, context, callback) => { // TODO implement console.log('Logging for AWS Lamnda in NodeJS'); callback(null, 'Name of aws Lambda is=>'+context.functionName); };
在 AWS 控制台中测试此代码后,您可以观察到以下输出 -
您可以从 CloudWatch 观察以下屏幕截图 -
NodeJS 中的错误处理
让我们了解 NodeJS 中的错误通知是如何完成的。观察以下代码 -
exports.handler = function(event, context, callback) { // This Source code only throws error. var error = new Error("something is wrong"); callback(error); };
您可以在日志输出中观察到以下内容 -
回调中给出的错误详细信息如下 -
{ "errorMessage": "something is wrong", "errorType": "Error", "stackTrace": [ "exports.handler (/var/task/index.js:2:17)" ] }