AWS Lambda
開発者ガイド

Node.js の AWS Lambda 関数ハンドラ

ハンドラは、イベントを処理する Lambda 関数内のメソッドです。関数を呼び出すと、ランタイムによってハンドラメソッドが実行されます。ハンドラによってレスポンスが終了するか、レスポンスが返ったら、別のイベントを処理できるようになります。

次の例の関数では、イベントオブジェクトの内容をログに記録して、そのログの場所が返ります。

例 index.js

exports.handler = async function(event, context) { console.log("EVENT: \n" + JSON.stringify(event, null, 2)) return context.logStreamName }

関数を設定すると、ハンドラ設定の値はファイルの名前とエクスポートしたハンドラモジュールの名前をドットで区切ったものになります。コンソールのデフォルトと、このガイドの例では、index.handler です。これは、index.js によってエクスポートされた handler モジュールを表します。

ランタイムでは、ハンドラメソッドに 3 つの引数を渡します。event オブジェクトには、呼び出し元の情報が含まれています。この情報は、呼び出し側より呼び出しを行うときに JSON 形式の文字列として渡されます。AWS のサービスで関数を呼び出す場合、そのイベント構造はサービスによって異なります

2 番目の引数は、コンテキストオブジェクトです。この引数には、呼び出し、関数、および実行環境に関する情報が含まれます。前述の例では、関数は、コンテキストオブジェクトからログストリームの名前を取得し、それを呼び出し元に返します。

3 番目の引数 callback は、レスポンスを送信するために non-async 関数で呼び出すことができる関数です。コールバック関数は、Error とレスポンスの 2 つの引数を取ります。応答オブジェクトは、JSON.stringify と互換性がある必要があります。

非同期関数の場合は、callback を使用する代わりに、レスポンス、エラー、または promise をランタイムに返します。

非同期関数

非同期関数では、return および throw をそれぞれ使用して、レスポンスまたはエラーを送信することができます。これらのメソッドを使用してレスポンスまたはエラーを返すには、関数でキーワード async を使用する必要があります。

コードで非同期タスクを実行する場合は、実行が終了していることを確認できるように promise を返します。promise を解決または拒否した場合、Lambda は、レスポンスまたはエラーを呼び出し元に返します。

例 index.js – async および promise を含む HTTP リクエスト

const https = require('https') let url = "https://docs.aws.amazon.com/lambda/latest/dg/welcome.html" exports.handler = async function(event) { const promise = new Promise(function(resolve, reject) { https.get(url, (res) => { resolve(res.statusCode) }).on('error', (e) => { reject(Error(e)) }) }) return promise }

promise を返すライブラリでは、その promise を直接ランタイムに返すことができます。

例 index.js – async および promise を含む AWS SDK

const AWS = require('aws-sdk') const s3 = new AWS.S3() exports.handler = async function(event) { return s3.listBuckets().promise() }

非同期関数

次の例の関数では、URL をチェックし、ステータスコードを呼び出し元に返します。

例 index.js – コールバックを含む HTTP リクエスト

const https = require('https') let url = "https://docs.aws.amazon.com/lambda/latest/dg/welcome.html" exports.handler = function(event, context, callback) { https.get(url, (res) => { callback(null, res.statusCode) }).on('error', (e) => { callback(Error(e)) }) }

非同期以外の関数の場合は、イベントループが空になるか、関数がタイムアウトするまで、関数の実行が継続されます。レスポンスは、すべてのイベントループタスクが完了するまで、呼び出し元に送信されません。関数がタイムアウトした場合は、エラーが返ります。すぐにレスポンスが返るようにランタイムを設定するには、context.callbackWaitsForEmptyEventLoop を false に設定します。

次の例では、有効になるとすぐに Amazon S3 のレスポンスが呼び出し元に返ります。イベントループで実行されているタイムアウトは停止し、次に関数が呼び出されたときに実行を継続します。

例 index.js – callbackWaitsForEmptyEventLoop

const AWS = require('aws-sdk') const s3 = new AWS.S3() exports.handler = function(event, context, callback) { context.callbackWaitsForEmptyEventLoop = false s3.listBuckets(null, callback) setTimeout(function () { console.log('Timeout complete.') }, 5000) }

このページの内容: