- AWS Lambda 教程
- AWS Lambda - 首页
- AWS Lambda - 概述
- AWS Lambda - 环境设置
- AWS Lambda - 简介
- 构建 Lambda 函数
- Node.js 函数
- Java 函数
- Python 函数
- Go 函数
- C# 函数
- 配置 Lambda 函数
- 使用 AWS 控制台创建和部署
- 使用 AWS CLI 创建和部署
- 使用 Serverless Framework 创建和部署
- AWS 执行和调用 Lambda 函数
- 删除 Lambda 函数
- 使用 Amazon API Gateway
- Lambda 函数与 Amazon S3
- Lambda 函数与 Amazon DynamoDB
- Lambda 函数与计划事件
- Lambda 函数与 Amazon SNS
- Lambda 函数与 CloudTrail
- Lambda 函数与 Amazon Kinesis
- Lambda 函数与自定义用户应用程序
- AWS Lambda@Edge 与 CloudFront
- 使用 CloudWatch 进行监控和故障排除
- AWS Lambda - 附加示例
- AWS Lambda 有用资源
- AWS Lambda - 快速指南
- AWS Lambda - 有用资源
- AWS Lambda - 讨论
AWS Lambda – Node.js 函数
Node.js 是 AWS Lambda 函数支持的语言之一。支持的 Node.js 版本为 v6.10 和 v8.10。本章将详细讲解 AWS Lambda 函数在 Node.js 中的各种功能。
Node.js 中的处理程序
要在 Node.js 中编写 AWS Lambda 函数,首先应该声明一个处理程序。Node.js 中的处理程序是文件名和导出函数的名称。例如,文件名是index.js,导出函数名称是lambda handler,因此其对应的处理程序是index.lambdahandler
请观察此处显示的示例处理程序:
exports.lambdahandler = function(event, context, callback) { //code goes here}
处理程序参数
处理程序是构建 Lambda 函数的核心。处理程序接受三个参数:event、context 和 callback。
Event 参数
它包含触发事件的所有详细信息。例如,如果我们使用 Lambda 函数触发 S3,则事件将包含 S3 对象的详细信息。
Context 参数
它包含上下文详细信息,例如 Lambda 函数的属性和配置详细信息。
Callback 函数
它有助于将详细信息返回给调用者。回调的结构如下:
callback(error, result);
下面解释回调函数的参数:
Error – 如果在 Lambda 函数执行期间发生任何错误,则此处将包含详细信息。如果 Lambda 函数成功,则可以将null作为回调函数的第一个参数传递。
Result – 这将提供 Lambda 函数成功执行的详细信息。如果发生错误,则忽略 result 参数。
注意 – 在 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 中,以及任何控制台消息。
在 Node.js 8.10 中使用 AWS Lambda
让我们了解如何在 Node.js 8.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 函数的准确输出。
以异步方式调用处理程序
以下示例说明了以异步方式调用 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 仅对async 函数有效。
在 AWS 控制台中测试此代码后,您可以观察到以下输出:
Node.js 中的 ContextDetails
Context 对象提供详细信息,例如 Lambda 函数的名称、剩余毫秒数、请求 ID、CloudWatch 组名称、超时详细信息等。
下表显示了 Context 对象可用的方法和属性列表:
Context 对象可用的方法
序号 | 方法名称和说明 |
---|---|
1 | getRemainingTimeInMillis() 此方法以毫秒为单位提供 Lambda 函数终止函数之前剩余的时间 |
Context 对象可用的属性
序号 | 属性名称和说明 |
---|---|
1 | functionName 这将提供 AWS Lambda 函数名称 |
2 | functionVersion 这将提供正在执行的 AWS Lambda 函数的版本 |
3 | invokedFunctionArn 这将提供 ARN 详细信息。 |
4 | memoryLimitInMB 这显示了创建 Lambda 函数时添加的内存限制 |
5 | awsRequestId 这将提供 AWS 请求 ID。 |
6 | logGroupName 这将提供 CloudWatch 组名称 |
7 | logStreamName 这将提供写入日志的 CloudWatch 日志流名称。 |
8 | identity 当与 AWS Mobile SDK 一起使用时,这将提供有关 Amazon Cognito 身份提供程序的详细信息。 提供的详细信息如下:
|
9 | clientContext 当与 AWS Mobile SDK 一起使用时,这将提供客户端应用程序的详细信息。提供的详细信息如下:
|
请查看以下示例,以更好地了解 Context 对象:
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 控制台中测试此代码后,您可以观察到以下日志输出:
Node.js 中的日志记录
我们可以在 Node.js 中使用 console.log 进行日志记录。日志详细信息可以从 CloudWatch 服务中针对 Lambda 函数获取。
请观察以下示例以更好地理解:
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 中观察到以下屏幕截图:
Node.js 中的错误处理
让我们了解如何在 Node.js 中完成错误通知。请观察以下代码:
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)" ] }