AWS Lambda - Hàm trong NODEJS

Nodejs là một trong những ngôn ngữ mà hàm AWS Lambda hỗ trợ. Phiên bản được hỗ trợ với nodejs là v6.10 và v8.10. Trong chương này, chúng ta sẽ tìm hiểu chi tiết về các chức năng khác nhau của hàm AWS Lambda trong NODEJS.

Xử lý trong NodeJS

Để viết hàm LambdaAWS trong nodejs, trước tiên chúng ta nên khai báo một trình xử lý trước. Trình xử lý trong nodejs là tên của tệp và tên của hàm xuất. Ví dụ, tên của tệp làindex.js và tên hàm xuất là lambda handler, vì vậy trình xử lý tương ứng của nó là index.lambdahandler

Quan sát trình xử lý mẫu được hiển thị ở đây -

exports.lambdahandler = function(event, context, callback) {   //code goes here}

Tham số để xử lý

Handler là cốt lõi chính để xây dựng hàm Lambda. Trình xử lý có ba tham số:event, contextcallback.

Tham số sự kiện

Nó có tất cả các chi tiết của sự kiện được kích hoạt. Ví dụ, nếu chúng ta đang sử dụng hàm Lambda được kích hoạt trên S3, sự kiện sẽ có thông tin chi tiết về đối tượng S3.

Tham số ngữ cảnh

Nó có các chi tiết của ngữ cảnh như các thuộc tính và chi tiết cấu hình của hàm Lambda.

Chức năng gọi lại

Nó giúp cung cấp thông tin chi tiết lại cho người gọi. Cấu trúc của callback trông như sau:

callback(error, result);

Các tham số của hàm gọi lại được giải thích dưới đây:

Error −Điều này sẽ có thông tin chi tiết nếu có bất kỳ lỗi nào xảy ra trong quá trình thực thi hàm Lambda. Nếu hàm Lambda thành công,null có thể được chuyển làm tham số đầu tiên cho hàm gọi lại.

Result −Điều này sẽ cung cấp chi tiết về việc thực thi thành công hàm lambda. Nếu xảy ra lỗi, tham số kết quả sẽ bị bỏ qua.

Note −Không bắt buộc phải sử dụng hàm gọi lại trong AWS Lambda. Trong trường hợp nếu không có hàm gọi lại, trình xử lý sẽ trả về giá trị null.

Các chữ ký gọi lại hợp lệ được cung cấp bên dưới:

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

Bất cứ khi nào AWS Lambda được thực thi, các chi tiết gọi lại như lỗi hoặc thành công sẽ được đăng nhập vào AWS CloudWatch cùng với các thông báo trên bảng điều khiển, nếu có.

Làm việc với AWS Lambda trong Nodejs8.10

Hãy để chúng tôi hiểu cách làm việc với AWS Lambda trong nodejs8.10 và gọi hàm theo cách đồng bộ và không đồng bộ.

Gọi hàm Lambda theo cách đồng bộ hóa

Ví dụ sau cung cấp cho bạn ý tưởng về cách gọi hàm Lambda theo cách đồng bộ:

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

Bạn có thể quan sát kết quả đầu ra sau khi kiểm tra mã này trong bảng điều khiển AWS:

Lưu ý rằng đầu ra từ đoạn mã trên là một đối tượng hứa hẹn. Nó không cung cấp số lượng, vì số lượng được tăng lên bên trong setTimeout và lệnh gọi hàm không đợi thực thi bên trong setTimeout và trả về đối tượng hứa hẹn.

Nếu chúng ta có async/await trên hàm xử lý sẽ nhận được kết quả chính xác từ hàm lambda.

Gọi trình xử lý theo cách không đồng bộ

Ví dụ sau cung cấp cho bạn ý tưởng về cách gọi hàm Lambda theo cách không đồng bộ:

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

Chúng tôi đã thêm asyncawaittrong đoạn mã trên. Khi chúng tôi sử dụngawaitbên cạnh lời gọi hàm, việc thực thi sẽ tạm dừng cho đến khi lời hứa bên trong hàm được giải quyết. Lưu ý rằngawait chỉ có giá trị cho async chức năng.

Bạn có thể quan sát kết quả đầu ra sau khi kiểm tra mã này trong bảng điều khiển AWS:

ContextDetails trong NodeJS

Đối tượng ngữ cảnh cung cấp các chi tiết như tên của hàm Lambda, thời gian còn lại tính bằng mili giây, id yêu cầu, tên nhóm đồng hồ trên đám mây, chi tiết thời gian chờ, v.v.

Các bảng sau đây hiển thị danh sách các phương thức và thuộc tính có sẵn với đối tượng ngữ cảnh:

Phương thức có sẵn cho đối tượng ngữ cảnh

Sr.No Tên & Mô tả phương pháp
1

getRemainingTimeInMillis()

Phương thức này cung cấp thời gian còn lại tính bằng mili giây cho đến khi hàm Lambda kết thúc hàm

Các thuộc tính có sẵn cho đối tượng ngữ cảnh

Sr.No Tên và mô tả thuộc tính
1

functionName

Điều này cung cấp cho tên hàm AWS Lambda

2

functionVersion

Điều này cung cấp cho phiên bản của hàm AWS Lambda đang thực thi

3

nvokedFunctionArn

Điều này sẽ cung cấp thông tin chi tiết về ARN.

4

memoryLimitInMB

Điều này cho thấy giới hạn bộ nhớ được thêm vào khi tạo hàm Lambda

5

awsRequestId

Điều này cung cấp id yêu cầu AWS.

6

logGroupName

Điều này sẽ cung cấp tên của tên nhóm đồng hồ đám mây

7

logStreamName

Thao tác này sẽ cung cấp tên của tên luồng nhật ký trên cloudwatch nơi các nhật ký được viết.

số 8

identity

Điều này sẽ cung cấp thông tin chi tiết về nhà cung cấp nhận dạng nhận dạng amazon khi được sử dụng với sdk di động aws.

Thông tin chi tiết được đưa ra như sau:

  • identity.cognito_identity_id
  • identity.cognito_identity_pool_id
9

clientContext

Điều này sẽ chi tiết về ứng dụng khách khi được sử dụng với sdk di động aws. Các chi tiết được đưa ra như sau:

  • 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 - nó có các giá trị tùy chỉnh từ ứng dụng khách trên thiết bị di động
  • client_context.env - nó có thông tin chi tiết về môi trường từ AWS Mobile SDK

Hãy xem ví dụ sau để hiểu rõ hơn về đối tượng ngữ cảnh -

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

Bạn có thể quan sát kết quả đầu ra sau khi kiểm tra mã này trong bảng điều khiển AWS:

Bạn có thể quan sát đầu ra nhật ký sau khi kiểm tra mã này trong bảng điều khiển AWS -

Đăng nhập NodeJS

Chúng ta có thể sử dụng console.log để đăng nhập NodeJS. Chi tiết nhật ký có thể được tìm nạp từ dịch vụ CloudWatch dựa trên hàm Lambda.

Quan sát ví dụ sau để hiểu rõ hơn -

exports.handler = (event, context, callback) => {
   // TODO implement
   console.log('Logging for AWS Lamnda in NodeJS');
   callback(null, 'Name of aws Lambda is=>'+context.functionName);
};

Bạn có thể quan sát kết quả đầu ra sau khi kiểm tra mã này trong bảng điều khiển AWS:

Bạn có thể quan sát ảnh chụp màn hình sau đây từ CloudWatch -

Xử lý lỗi trong NodeJS

Hãy cho chúng tôi hiểu cách thông báo lỗi được thực hiện trong NodeJS. Quan sát đoạn mã sau:

exports.handler = function(event, context, callback) {
   // This Source code only throws error. 
   var error = new Error("something is wrong");
   callback(error);   
};

Bạn có thể quan sát những điều sau trong đầu ra nhật ký:

Chi tiết lỗi được đưa ra trong cuộc gọi lại như sau:

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