web-dev-qa-db-ja.com

AWS Lambdaのコンテキストとコールバック

AWSでラムダ関数を使用するのが大好きです。理想的には、サーバーのメンテナンスにかかる時間を理想的に短縮できました。私の質問は、ラムダを使用する場合、コンテキストオブジェクトと関数を終了するコールバック関数が存在することです。コンテキスト上でコールバックを使用する使用例はありますか。

Context.succeed()の動作をcallback(error、message)に教えてもらえますか

var startedAt = new Date();

var interval = setInterval(function () {
    console.log(startedAt, new Date());
}, 1000);

exports.handler = function (event, context, callback) {
    setTimeout(function () {
        console.log('returning');
        // v1:
        return callback(null);
        // v2:
        // return context.succeed();
    }, 5000);
};
9
Naveen Kerati

context.succeedは古いやり方であり、0.10.42ランタイムでサポートされています(callbackパラメーターは特にそうではありません)。新しいランタイム(4.3および6.10)で実行している場合、下位互換性のために含まれていますが、「適切な」方法はcallback機能を使用することです。

12
James Thorpe

Herecallbackcontext.succeedの改善として表されます。

さらに、 イベントループ により、Node.jsは非ブロッキングI/O操作を実行できます。 callbackが予想より長く待機する場合、イベントループに他の未完了のタスクがあることに気づかないことを意味し、これは問題です。キューで待機しているタスクを知る必要があります。 次の関数 を使用して、callbackが待機している理由を理解できます。

process._getActiveHandles() //gets you handles that are still alive
process._getActiveRequests() //gets you info about active libuv requests.

これらのタスクを完了する前にラムダを凍結すると、予期しない動作が発生する可能性があります。次のラムダ実行は、同じコンテナで実行できます。これは、前のラムダ実行のイベントループタスクが現在のラムダ実行で完了することを意味します。

また、exports.handlerに対して複数のテストがあり、callbackですべてのテストが独立していると仮定します。 context.succeedを使用すると、最初のテストのために2番目のテストが(失敗する代わりに)合格し、イベントループにタスクが残ります。

4
KernelMode