Lambdaのcontextについて調べてみた

2014.12.08

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

謎のcontext.doneのnull

超小ネタです。 AWS Lambdaと格闘していてcontext.doneの第一引数nullが気になって仕方がなかったので、ざくっと調べてみました。

検証コード

index.js

function getProperties(obj) {
    var properties = '';
    for (var prop in obj){
        properties += prop + "=" + obj[prop] + "\n";
    }
    return properties;
}

exports.handler = function(event, context) {
    console.log('context = ' + getProperties(context));
    context.done(null, "Hello");
}

結果

2014-12-08T08:03:23.919Z	xxxxxxx-xxxx-xxxx-xxxx-xxxxxxxx	context = invokeid=xxxxxxx-xxxx-xxxx-xxxx-xxxxxxxx
done=function (err, message) {
            if(doneStatus) {
                return;
            }
            doneStatus = true;
            var error = null;
            if(!(typeof err == "undefined" || (typeof err == "object" && !err))) {
                error = util.format(err);
                console.log(error);
            }
            /*
             * use a timeout to perform the operation once the user gives up control of the event thread
             * This is how HTTP handler works right now
            */
            setTimeout(function() {
                postDone(error, message);
            }, 0);
        }
Message
-------
Hello

出てきました。持ってるプロパティは2つだけのようですね。invokeiddoneというfunctionだけでした。

invokeid

ログの先頭に付与されていた値と同じものが入っていたので、Lambdaを実行する際に発行される一意なキーのようです。

done

サンプルでも最後にcontext.done()で実行されてました。1番目の引数にエラーオブジェクト、2番めの引数にメッセージオブジェクトを埋め込めば良いようです。

まとめ

JavaScriptは気軽に中が覗けて良いですね。context.done(null, message)の「nullってなんだよ」と思ったので調べてみました。 successHandlerとかfailHandlerを作らずに、ErrorもSuccessもひっくるめてdone一つで済ませちゃうんですね。JavaScriptの文化なのでしょうか( ꒪⌓꒪)

参照