AWS Lambda –NODEJSの関数

Nodejsは、AWSLambda関数がサポートする言語の1つです。nodejsでサポートされているバージョンはv6.10とv8.10です。この章では、NODEJSのAWSLambda関数のさまざまな機能について詳しく学習します。

NodeJSのハンドラー

nodejsでAWSLambda関数を作成するには、最初にハンドラーを最初に宣言する必要があります。nodejsのハンドラーは、ファイルの名前とエクスポート関数の名前です。たとえば、ファイルの名前は次のとおりです。index.js エクスポート関数名は lambda handler、したがって、対応するハンドラーは index.lambdahandler

ここに示されているサンプルハンドラーを観察します-

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

ハンドラーへのパラメーター

ハンドラーは、Lambda関数を構築するための主要なコアです。ハンドラーは3つのパラメーターを取ります。event, context そして callback

イベントパラメータ

トリガーされたイベントのすべての詳細が含まれています。たとえば、S3でトリガーされるLambda関数を使用している場合、イベントにはS3オブジェクトの詳細が含まれます。

コンテキストパラメータ

Lambda関数のプロパティや構成の詳細などのコンテキストの詳細が含まれています。

コールバック機能

発信者に詳細を返すのに役立ちます。コールバックの構造は次のようになります-

callback(error, result);

コールバック関数のパラメータを以下に説明します-

Error −Lambda関数の実行中にエラーが発生した場合は、詳細が表示されます。Lambda関数が成功した場合、null コールバック関数の最初のパラメーターとして渡すことができます。

Result −これにより、ラムダ関数の正常な実行の詳細がわかります。エラーが発生した場合、結果パラメータは無視されます。

Note −AWSLambdaでコールバック関数を使用することは必須ではありません。コールバック関数がない場合、ハンドラーはそれを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が実行されるたびに、エラーや成功などのコールバックの詳細が、コンソールメッセージ(存在する場合)とともにAWSCloudWatchに記録されます。

Nodejs8.10でのAWSLambdaの操作

nodejs8.10でAWSLambdaを操作し、同期および非同期の方法で関数を呼び出す方法を理解しましょう。

同期方法で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関数を非同期で呼び出す方法についてのアイデアを示しています-

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コンソールでこのコードをテストした後、次の出力を確認できます-

NodeJSのContextDetails

コンテキストオブジェクトは、Lambda関数の名前、ミリ秒単位の残り時間、リクエストID、Cloudwatchグループ名、タイムアウトの詳細などの詳細を提供します。

次の表は、コンテキストオブジェクトで使用可能なメソッドと属性のリストを示しています-

コンテキストオブジェクトに使用できるメソッド

シニア番号 メソッド名と説明
1

getRemainingTimeInMillis()

このメソッドは、Lambda関数が関数を終了するまでの残り時間をミリ秒単位で示します

コンテキストオブジェクトで使用可能な属性

シニア番号 属性名と説明
1

functionName

これにより、AWSLambda関数名が与えられます

2

functionVersion

これにより、実行中のAWSLambda関数のバージョンが提供されます

3

nvokedFunctionArn

これにより、ARNの詳細がわかります。

4

memoryLimitInMB

これは、Lambda関数の作成中に追加されたメモリ制限を示しています

5

awsRequestId

これにより、AWSリクエストIDが提供されます。

6

logGroupName

これにより、cloudwatchグループ名が付けられます

7

logStreamName

これにより、ログが書き込まれるクラウドウォッチログストリームの名前がわかります。

8

identity

これにより、aws mobilesdkで使用した場合のAmazonCognitoIDプロバイダーの詳細がわかります。

詳細は以下の通りです−

  • identity.cognito_identity_id
  • identity.cognito_identity_pool_id
9

clientContext

これにより、aws mobilesdkで使用した場合のクライアントアプリケーションの詳細がわかります。詳細は以下のとおりです。

  • 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-モバイルクライアントアプリからのカスタム値のdictがあります
  • client_context.env-AWS MobileSDKからの環境の詳細があります

次の例を見て、コンテキストオブジェクトについてより良いアイデアを得てください-

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にログインできます。ログの詳細は、Lambda関数に対してCloudWatchサービスから取得できます。

理解を深めるために、次の例を参照してください。

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)"  ]
}