AWS LambdaのNode.jsランタイムでv8.10が公開された時に、喜び勇んでasync/awaitで書き換えて更新した時にハマった点。
tl;dr
TZ環境変数はコード側ではなくLambdaの環境変数に設定しよう
Dateのタイムゾーン(TZ)がUTCになる
v0.10の頃から更新してきた関数だったので、タイムゾーンを日本にするためにコードの先頭でこう書いていました。
process.env.TZ = "Asia/Tokyo";
これでDateを処理する時に日本時間でうまく動いていましたが、ランタイムをv8.10にするとUTCになってしまいました。
検証するために、こんな関数を作成したところレスポンスは 1525651200000
になりました。
このunixtime(ms)は日本時間だと 2018/05/07 09:00:00
となりUTCとして扱われてしまっています。
"use strict";
process.env.TZ = "Asia/Tokyo";
exports.handler = (event, context, callback) => {
const time = Date.parse('2018-05-07 00:00:00');
callback(null, time);
};
Lambda関数自体に環境変数を保存する機能が結構前からありますので、
そこに下記のように TZ Asia/Tokyo
を設定してあげると、正しいunixtime 1525618800000
が得られました。
念のため現在選択できるNode.jsランタイム 8.10, 6.10, 4.3 で上記コードで検証したところ
6.10, 4.3ではコード側の設定でも日本時間で動作しました。
- | v8.10 | v6.10 | v4.3 |
---|---|---|---|
Lambda環境変数のTZ指定あり | 1525618800000 | 1525618800000 | 1525618800000 |
Lambda環境変数のTZ指定なし | 1525651200000 (コードでの指定が効いていない) | 1525618800000 | 1525618800000 |
v6.10やv4.3の関数に設定しても問題ないので、環境変数を設定してからランタイム/コードをバージョンアップしましょう。