AWS LambdaでNode.js v6.10がサポートされました

AmazonLambda

大栗です。

本日LambdaのNode.jsでv6.10がサポートされましたのでレポートしてみます。

LambdaのNode.jsサポート

Lambdaは今までNode.jsを以下のバージョンでサポートしてきました。

バージョン Lambdaサポート日(現地時刻) 備考
Node.js v0.10 2014/11/15 新規作成はできない。2017年4月末に起動もできなくなる。
Node.js v4.3 2016/04/07 現在の主流。
Node.js v6.10 2017/03/22 New!

Node.js自身のサポート状況は以下のようになっています。v4系(v4.3)はあと1年程度でNode.js自体のメンテナンスが終了するので、今後はv6.10を使うようにしましょう。

LTS Status Release Codename Active LTS Start Maintenance Start Maintenance End
End-of-Life v0.10 - 2015-10-01 2016-10-31
End-of-Life v0.12 - 2016-04-01 2016-12-31
Active v4 Argon 2015-10-01 2017-04-01 2018-04-01
No LTS v5 N/A N/A N/A
Active v6 Boron 2016-10-18 2018-04-18 2019-04-18
No LTS v7 N/A N/A N/A

https://github.com/nodejs/LTS

Node.js v6

Node.jsを書いていないので公式ページを見ると、v6の特徴としてES2015を93%サポート(こちらのページによるとv6.10では99%サポート!となっています)している事が大きいです。

試してみた

ここではブループリントのhello-worldを試してみます。

ブループリントは既にv6.10対応のようです。

lambda-hello-world

ランタイムでNode.js 6.10が出てくるので選択します。

Lambda_Management_Console

コードはこんな感じでv4.3の時と変わっていないようです。

'use strict';

console.log('Loading function');

exports.handler = (event, context, callback) => {
    //console.log('Received event:', JSON.stringify(event, null, 2));
    console.log('value1 =', event.key1);
    console.log('value2 =', event.key2);
    console.log('value3 =', event.key3);
    callback(null, event.key1);  // Echo back the first key value
    //callback('Something went wrong');
};

テストをしてみます。イベントはデフォルトで以下の内容です。

{
  "key3": "value3",
  "key2": "value2",
  "key1": "value1"
}

結果は以下のようになり正常終了します。Lambdaとしては何も変わっていません。

START RequestId: 1a2b3c4d-5e6f-7g8h-9i0j-1k2l3m4n5o6p Version: $LATEST
2017-03-23T07:07:08.452Z	1a2b3c4d-5e6f-7g8h-9i0j-1k2l3m4n5o6p	value1 = value1
2017-03-23T07:07:08.452Z	1a2b3c4d-5e6f-7g8h-9i0j-1k2l3m4n5o6p	value2 = value2
2017-03-23T07:07:08.453Z	1a2b3c4d-5e6f-7g8h-9i0j-1k2l3m4n5o6p	value3 = value3
END RequestId: 1a2b3c4d-5e6f-7g8h-9i0j-1k2l3m4n5o6p
REPORT RequestId: 1a2b3c4d-5e6f-7g8h-9i0j-1k2l3m4n5o6p	Duration: 30.34 ms	Billed Duration: 100 ms 	Memory Size: 128 MB	Max Memory Used: 16 MB	

次に古いプログラミングモデルの動作も確認してみます。この様にハンドラーがexports.handler = function (event, context)となっている古いスタイルで書いてみます。

'use strict';

console.log('Loading function');

exports.handler = function (event, context) {

    //console.log('Received event:', JSON.stringify(event, null, 2));
    console.log('value1 =', event.key1);
    console.log('value2 =', event.key2);
    console.log('value3 =', event.key3);

    context.done(null, event.key1);
};

正常に実行できます。古いプログラミングモデルでも動作する模様です。

START RequestId: 1a2b3c4d-5e6f-7g8h-9i0j-1k2l3m4n5o6p Version: $LATEST
2017-03-23T07:15:26.933Z	1a2b3c4d-5e6f-7g8h-9i0j-1k2l3m4n5o6p	value1 = value1
2017-03-23T07:15:26.933Z	1a2b3c4d-5e6f-7g8h-9i0j-1k2l3m4n5o6p	value2 = value2
2017-03-23T07:15:26.933Z	1a2b3c4d-5e6f-7g8h-9i0j-1k2l3m4n5o6p	value3 = value3
END RequestId: 1a2b3c4d-5e6f-7g8h-9i0j-1k2l3m4n5o6p
REPORT RequestId: 1a2b3c4d-5e6f-7g8h-9i0j-1k2l3m4n5o6p	Duration: 16.16 ms	Billed Duration: 100 ms 	Memory Size: 128 MB	Max Memory Used: 15 MB	

ドキュメントでは、古いプログラミングモデルについて以下のような記述があります。つまり下位互換性のためにのv6.10でもdone(),、succeed()fail()の各メソッドがあると言うことです。あくまで下位互換性のためなので、新規の場合には必ず現在のモデルで作成しましょう。バージョンアップの場合も、できれば新しいモデルに修正したいところです。

The context object supports the done(), succeed(), and fail() methods that you can use to terminate your Lambda function. These methods are also present in runtimes v4.3 and v6.10 for backward compatibility.

The Context Methods in Node.js Runtime v0.10.42

さいごに

Node.jsは開発が活発であるため、一定期間でバージョンがどんどん上がっていきます。現在のところ古いプログラミングモデルも動作するようです。Node.js v0.10が2017年4月末に終了するので、この機会にv4.3を飛ばしてv6.10にするのも良いかと思います。(十分なテストは必要ですよ!)