AWS Lambda - Fungsi di NODEJS

Nodejs adalah salah satu bahasa yang didukung oleh fungsi AWS Lambda. Versi yang didukung dengan nodejs adalah v6.10 dan v8.10. Di bab ini, kita akan mempelajari tentang berbagai fungsi fungsi AWS Lambda di NODEJS secara mendetail.

Penangan di NodeJS

Untuk menulis fungsi AWS Lambda di nodejs, pertama-tama kita harus mendeklarasikan penangan terlebih dahulu. Handler di nodejs adalah nama file dan nama fungsi ekspor. Misalnya, nama file tersebut adalahindex.js dan nama fungsi ekspor adalah lambda handler, jadi penangannya adalah index.lambdahandler

Amati penangan sampel yang ditunjukkan di sini -

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

Params ke Handler

Handler adalah inti utama untuk membangun fungsi Lambda. Pawang mengambil tiga param:event, context dan callback.

Parameter Peristiwa

Itu memiliki semua detail acara yang dipicu. Misalnya, jika kita menggunakan fungsi Lambda untuk dipicu di S3, acara akan memiliki detail objek S3.

Parameter Konteks

Ini memiliki detail konteks seperti properti dan detail konfigurasi fungsi Lambda.

Fungsi Callback

Ini membantu dalam memberikan detail kembali ke pemanggil. Struktur callback terlihat sebagai berikut -

callback(error, result);

Parameter fungsi panggilan balik dijelaskan di bawah ini -

Error −Ini akan memiliki perincian jika ada kesalahan yang terjadi selama eksekusi fungsi Lambda. Jika fungsi Lambda berhasil,null dapat dilewatkan sebagai param pertama untuk fungsi callback.

Result −Ini akan memberikan detail keberhasilan eksekusi fungsi lambda. Jika terjadi kesalahan, parameter hasil diabaikan.

Note −Tidak wajib menggunakan fungsi panggilan balik di AWS Lambda. Jika tidak ada fungsi callback, penangan akan mengembalikannya sebagai null.

Tanda tangan panggilan balik yang valid diberikan di bawah ini -

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

Kapan pun AWS Lambda dieksekusi, detail panggilan balik seperti kesalahan atau keberhasilan, dicatat di AWS CloudWatch bersama dengan pesan konsol, jika ada.

Bekerja dengan AWS Lambda di Nodejs8.10

Mari kita pahami cara bekerja dengan AWS Lambda di nodejs8.10 dan menjalankan fungsi secara sinkron dan asinkron.

Memanggil Fungsi Lambda dengan Cara Sinkronisasi

Contoh berikut memberi Anda gambaran tentang menjalankan fungsi Lambda secara sinkron -

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

Anda dapat mengamati keluaran berikut setelah menguji kode ini di konsol AWS -

Perhatikan bahwa keluaran dari kode di atas adalah objek promise. Itu tidak memberikan hitungan, karena hitungan bertambah di dalam setTimeout dan pemanggilan fungsi tidak menunggu eksekusi di dalam setTimeout dan mengembalikan objek promise.

Jika kita punya async/await pada fungsi handler akan mendapatkan keluaran yang tepat dari fungsi lambda.

Memanggil Penangan dengan Cara Asinkron

Contoh berikut memberi Anda gambaran tentang memanggil fungsi Lambda dengan cara asinkron -

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

Kami telah menambahkan async dan awaitdalam kode di atas. Saat kami menggunakanawaitdi samping pemanggilan fungsi, eksekusi dijeda hingga janji di dalam fungsi diselesaikan. Catat ituawait hanya berlaku untuk async fungsi.

Anda dapat mengamati keluaran berikut setelah menguji kode ini di konsol AWS -

ContextDetails di NodeJS

Objek konteks memberikan detail seperti nama fungsi Lambda, waktu tersisa dalam milidetik, id permintaan, nama grup cloudwatch, detail waktu tunggu, dll.

Tabel berikut menunjukkan daftar metode dan atribut yang tersedia dengan objek konteks -

Metode tersedia untuk objek konteks

Sr Tidak Nama Metode & Deskripsi
1

getRemainingTimeInMillis()

Metode ini memberikan waktu yang tersisa dalam milidetik hingga fungsi Lambda menghentikan fungsinya

Atribut tersedia untuk objek konteks

Sr Tidak Nama atribut & Deskripsi
1

functionName

Ini memberi nama fungsi AWS Lambda

2

functionVersion

Ini memberikan versi fungsi AWS Lambda yang sedang dijalankan

3

nvokedFunctionArn

Ini akan memberikan detail ARN.

4

memoryLimitInMB

Ini menunjukkan batas memori yang ditambahkan saat membuat fungsi Lambda

5

awsRequestId

Ini memberikan id permintaan AWS.

6

logGroupName

Ini akan memberi nama grup cloudwatch

7

logStreamName

Ini akan memberi nama aliran log cloudwatch tempat log ditulis.

8

identity

Ini akan memberikan detail tentang penyedia identitas cognito amazon saat digunakan dengan aws mobile sdk.

Detail yang diberikan adalah sebagai berikut -

  • identity.cognito_identity_id
  • identity.cognito_identity_pool_id
9

clientContext

Ini akan menjelaskan detail aplikasi klien saat digunakan dengan aws mobile sdk. Detail yang diberikan adalah sebagai berikut -

  • 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 - ini memiliki diktekan nilai khusus dari aplikasi klien seluler
  • client_context.env - memiliki detail lingkungan dari AWS Mobile SDK

Lihat contoh berikut untuk mendapatkan ide yang lebih baik tentang objek konteks -

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

Anda dapat mengamati keluaran berikut setelah menguji kode ini di konsol AWS -

Anda dapat mengamati keluaran log berikut setelah menguji kode ini di konsol AWS -

Masuk ke NodeJS

Kita dapat menggunakan console.log untuk masuk ke NodeJS. Detail log dapat diambil dari layanan CloudWatch terhadap fungsi Lambda.

Perhatikan contoh berikut untuk pemahaman yang lebih baik -

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

Anda dapat mengamati keluaran berikut setelah menguji kode ini di konsol AWS -

Anda dapat mengamati tangkapan layar berikut dari CloudWatch -

Penanganan Error di NodeJS

Mari kita pahami bagaimana pemberitahuan kesalahan dilakukan di NodeJS. Perhatikan kode berikut -

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

Anda dapat mengamati hal berikut di keluaran log -

Detail kesalahan diberikan dalam panggilan balik sebagai berikut -

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