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、contextcallback

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 控制台中测试此代码后,您可以观察到以下输出:

Even Number Count

请注意,以上代码的输出是一个 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);
};

我们在以上代码中添加了asyncawait。当我们在函数调用旁边使用await 时,执行将暂停,直到函数内的 Promise 解析。请注意,await 仅对async 函数有效。

在 AWS 控制台中测试此代码后,您可以观察到以下输出:

Even Number Count Output

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 身份提供程序的详细信息。

提供的详细信息如下:

  • identity.cognito_identity_id
  • identity.cognito_identity_pool_id
9

clientContext

当与 AWS Mobile SDK 一起使用时,这将提供客户端应用程序的详细信息。提供的详细信息如下:

  • client_context.client.installation_id
  • client_context.client.app_title
  • client_context.client.app_version_name
  • client_context.client.app_version_code
  • client_context.client.app_package_name
  • client_context.custom - 它包含来自移动客户端应用程序的自定义值的字典
  • client_context.env - 它包含来自 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 控制台中测试此代码后,您可以观察到以下输出:

Succeeded Logs

在 AWS 控制台中测试此代码后,您可以观察到以下日志输出:

Log Output Testing

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 控制台中测试此代码后,您可以观察到以下输出:

Output After Testing

您可以从 CloudWatch 中观察到以下屏幕截图:

Screenshot Cloud Watch

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);   
};

Execution Result Details

您可以在日志输出中观察到以下内容:

Log Output Observation

错误详细信息在回调中提供如下:

{
   "errorMessage": "something is wrong",
   "errorType": "Error",
   "stackTrace": [    "exports.handler (/var/task/index.js:2:17)"  ]
}
广告