AWS LambdaでNode.js 4.3.2が利用可能になりました
SAの西谷(@Keisuke69)です。
本日よりAWS LambdaでNode.js 4.3.2が利用可能になりました。利用にあたってはファンクションの作成時もしくは更新の際にランタイムの選択で「nodejs4.3」を選ぶだけです。なお、Node.js 0.10を利用したファンクションの作成もサポートされますが、2016年10月にNode.js 0.10がEOLとなるためこれ以降は新規作成はできなくなります。
ここではNode.js 4.3.2が利用可能になったことに伴う変更点について簡単に御案内します。
主な変更点
Node.jsのv4ではJavaScript界隈では非常に重要なアップデートであるES6(ECMAScript 2015、ES2015)のサポート範囲が拡大しています。もちろんPromiseも利用可能になっています。これまでNode.js 0.10だったためにPromiseが利用できずに非同期処理周りを扱うにあたってasync.jsを利用していた人が多いと思いますが今後はPromiseが利用できます。また、アロー関数なんかも利用可能になるのでこれまでよりシンプルに記述することが可能になります。Promiseに関してはこちらの「JavaScript Promiseの本」がとても参考になると思います。
プログラミングモデルの変更
今回のリリースを機にAWS LambdaにおけるNode.jsのプログラミングが一部変更になります。変更になるというより拡張されるといったほうが正しいかも知れません。具体的にはこれまでファンクションの終了時に明示的にコールしていたcontext.done(), context.succeed(), context.fail()の3つのメソッドの代わりにコールバックを利用する形になります。これらのメソッドは今後も利用可能ですが今後はコールバックを利用したモデルが推奨となります。なお、Node.js 0.10ではこの新しいモデルは利用できないので気をつけてください。
新しいモデルでは以下のように記述します。
exports.myHandler = function(event, context, callback) {
...
// Use callback() and return information to the caller.
}
eventはこれまでと変わりありません。
contextはこれまでのものに加えて今回あらたに "callbackWaitsForEmptyEventLoop" というプロパティが追加になっています。このパラメータはコールバックの動作を変更するために使用します。デフォルト値はtrueになっています。デフォルトでは全ての非同期処理が完了することを待って結果を返します。このプロパティをfalseにセットするとコールバックがコールされるとすぐに処理はフリーズされます。falseにしたときの動作はこれまでのNode.js 0.10のときと同様の挙動になります。
そして、callbackです。新たにサポートされるようになったオプションで返り値をここに定義します。コールバックが何も指定されていない場合はファンクションの結果としてはnullが返ります。コールバックのシンタックスは以下のようになります。
callback(Error error, Object result);
errorはLambdaファンクションの実行が失敗したときの結果を受け取るためのオプショナルパラメータです。ファンクションが成功した場合はnullになります。
resultはファンクションの実行が成功したときに返す結果になります。こちらもオプショナルなパラメータです。ここで返す結果はJSON.stringifyによるJSON表現と同様のものである必要があります。ファンクションの実行が失敗した場合は先述のerrorにその情報が格納され、このパラメータは無視されます。
コールバックを使って書くLambdaファンクションは以下のようになります。
exports.handler = function(event, context, callback) {
console.log('value1 =', event.key1);
callback(null, event.key1);
};
コールバックはオプショナルなので省略することも可能です。ただし、その場合はLambdaファンクションの実行結果としてはnullが返ることになります。もちろん上記のコードをアロー関数を使って書くことも可能です。その場合は以下のようになります。
'use strict';
exports.handler = (event, context, callback) => {
console.log('value1 =', event.key1);
callback(null, event.key1);
};
そして、最後に何度も言いますがこのコールバックがサポートされるのはNode.js 4.3.2を使用する場合だけです。Node.js 0.10を使用している場合はこれまでどおりcontextオブジェクトのメソッドを利用して値を返す必要があります。
互換性について
これまでに作成したNode.js 0.10のファンクションはランタイムとしてNode.js 4.3.2に変更しても基本的にはそのまま動きます。しかしNode.js 0.10からNode.js 4.3.2への変更は大きいため必ず事前に検証をすることをオススメします。また、コンパイルして静的にリンクしていたモジュールについても気をつけてください。
コメント