AWS Lambda - ฟังก์ชันใน NODEJS

Nodejs เป็นหนึ่งในภาษาที่รองรับฟังก์ชัน AWS Lambda เวอร์ชันที่รองรับกับ nodejs คือ v6.10 และ v8.10 ในบทนี้เราจะเรียนรู้เกี่ยวกับฟังก์ชันต่างๆของฟังก์ชัน AWS Lambda ใน NODEJS โดยละเอียด

ตัวจัดการใน NodeJS

ในการเขียนฟังก์ชันAWS Lambda ใน nodejs อันดับแรกเราควรประกาศตัวจัดการก่อน ตัวจัดการใน nodejs คือชื่อของไฟล์และชื่อของฟังก์ชันการส่งออก ตัวอย่างเช่นชื่อของไฟล์คือindex.js และชื่อฟังก์ชันการส่งออกคือ lambda handlerดังนั้นตัวจัดการที่สอดคล้องกันคือ index.lambdahandler

สังเกตตัวจัดการตัวอย่างที่แสดงที่นี่ -

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

Params ถึง Handler

Handler เป็นแกนหลักในการสร้างฟังก์ชัน Lambda ตัวจัดการใช้เวลาสามพารามิเตอร์:event, context และ callback.

พารามิเตอร์เหตุการณ์

มีรายละเอียดทั้งหมดของเหตุการณ์ที่ทริกเกอร์ ตัวอย่างเช่นหากเราใช้ฟังก์ชัน Lambda เพื่อเรียกใช้บน S3 เหตุการณ์จะมีรายละเอียดของวัตถุ S3

พารามิเตอร์บริบท

มีรายละเอียดของบริบทเช่นคุณสมบัติและรายละเอียดการกำหนดค่าของฟังก์ชัน Lambda

ฟังก์ชันโทรกลับ

ช่วยในการให้รายละเอียดกลับไปยังผู้โทร โครงสร้างของการโทรกลับมีลักษณะดังนี้ -

callback(error, result);

พารามิเตอร์ของฟังก์ชันการโทรกลับอธิบายไว้ด้านล่าง -

Error −สิ่งนี้จะมีรายละเอียดหากมีข้อผิดพลาดเกิดขึ้นระหว่างการเรียกใช้ฟังก์ชัน Lambda ถ้าฟังก์ชัน Lambda สำเร็จnull สามารถส่งผ่านเป็นพารามิเตอร์แรกสำหรับฟังก์ชันเรียกกลับ

Result −สิ่งนี้จะให้รายละเอียดของการทำงานของฟังก์ชันแลมด้าที่ประสบความสำเร็จ หากเกิดข้อผิดพลาดพารามิเตอร์ผลลัพธ์จะถูกละเว้น

Note −ไม่บังคับให้ใช้ฟังก์ชันเรียกกลับใน AWS Lambda ในกรณีที่ไม่มีฟังก์ชันเรียกกลับตัวจัดการจะคืนค่าเป็นโมฆะ

ลายเซ็นติดต่อกลับที่ถูกต้องมีให้ด้านล่าง -

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 พร้อมกับข้อความคอนโซลหากมี

การทำงานกับ AWS Lambda ใน Nodejs8.10

ให้เราเข้าใจวิธีการทำงานกับ AWS Lambda ใน nodejs8.10 และเรียกใช้ฟังก์ชันในลักษณะซิงค์และไม่ซิงค์

เรียกใช้ฟังก์ชัน Lambda ด้วยวิธี Sync

ตัวอย่างต่อไปนี้ให้แนวคิดเกี่ยวกับการเรียกใช้ฟังก์ชัน 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 -

โปรดทราบว่าผลลัพธ์จากโค้ดด้านบนเป็นวัตถุสัญญา ไม่ให้การนับเนื่องจากการนับจะเพิ่มขึ้นภายใน setTimeout และการเรียกใช้ฟังก์ชันไม่รอการดำเนินการภายใน setTimeout และส่งคืนวัตถุสัญญา

ถ้าเรามี async/await บนฟังก์ชันตัวจัดการจะได้รับเอาต์พุตที่แน่นอนจากฟังก์ชันแลมบ์ดา

การเรียกใช้ Handler ด้วยวิธี Async

ตัวอย่างต่อไปนี้ให้แนวคิดเกี่ยวกับการเรียกใช้ฟังก์ชัน Lambda ด้วยวิธี async -

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ข้างการเรียกใช้ฟังก์ชันการดำเนินการจะหยุดชั่วคราวจนกว่าสัญญาภายในฟังก์ชันจะได้รับการแก้ไข โปรดทราบว่าawait ใช้ได้เฉพาะสำหรับ async ฟังก์ชั่น.

คุณสามารถสังเกตผลลัพธ์ต่อไปนี้หลังจากทดสอบโค้ดนี้ในคอนโซล AWS -

ContextDetails ใน NodeJS

วัตถุบริบทให้รายละเอียดเช่นชื่อของฟังก์ชัน Lambda เวลาที่เหลือเป็นมิลลิวินาทีรหัสคำขอชื่อกลุ่ม cloudwatch รายละเอียดการหมดเวลาเป็นต้น

ตารางต่อไปนี้แสดงรายการวิธีการและแอตทริบิวต์ที่พร้อมใช้งานกับวัตถุบริบท -

วิธีที่ใช้ได้สำหรับวัตถุบริบท

ซีเนียร์ No ชื่อวิธีการและคำอธิบาย
1

getRemainingTimeInMillis()

วิธีนี้ให้เวลาที่เหลืออยู่ในหน่วยมิลลิวินาทีจนกว่าฟังก์ชันแลมด้าจะยุติฟังก์ชัน

แอตทริบิวต์ที่พร้อมใช้งานสำหรับวัตถุบริบท

ซีเนียร์ No ชื่อแอตทริบิวต์และคำอธิบาย
1

functionName

สิ่งนี้ให้ชื่อฟังก์ชัน AWS Lambda

2

functionVersion

สิ่งนี้ทำให้เวอร์ชันของฟังก์ชัน AWS Lambda ดำเนินการ

3

nvokedFunctionArn

สิ่งนี้จะให้รายละเอียด ARN

4

memoryLimitInMB

แสดงขีด จำกัด หน่วยความจำที่เพิ่มในขณะที่สร้างฟังก์ชัน Lambda

5

awsRequestId

สิ่งนี้ให้รหัสคำขอ AWS

6

logGroupName

ซึ่งจะทำให้ชื่อของกลุ่ม cloudwatch

7

logStreamName

สิ่งนี้จะให้ชื่อสตรีมบันทึกของ cloudwatch ที่มีการเขียนบันทึก

8

identity

สิ่งนี้จะให้รายละเอียดเกี่ยวกับ amazon cognito identity provider เมื่อใช้กับ aws mobile sdk

รายละเอียดมีดังนี้ -

  • identity.cognito_identity_id
  • identity.cognito_identity_pool_id
9

clientContext

นี่จะแสดงรายละเอียดของแอปพลิเคชันไคลเอนต์เมื่อใช้กับ sdk มือถือ aws รายละเอียดที่ได้รับมีดังนี้ -

  • 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

ดูตัวอย่างต่อไปนี้เพื่อรับแนวคิดที่ดีขึ้นเกี่ยวกับวัตถุบริบท -

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 รายละเอียดบันทึกสามารถดึงข้อมูลจากบริการ 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 -

การจัดการข้อผิดพลาดใน 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)"  ]
}