🍃このブログは移転しました。
3秒後、自動的に移動します・・・。

AWSのLambdaのNodeのバージョンアップでハマったこと

だいぶ前ですが、Nodeのバージョンがv0.10.42からv4.3になりました。
現時点ではもうv0.xの関数は作れなくなってて、ほとんどの人は知る必要ないですが、今更移行して久しぶりにLambdaさわったらハマったというメモ。

コードベースが中途半端にES2015になる

中途半端に、というところが重要。

  • `Class`とか`Promise`は使える
  • Arrow functionも書ける
  • Destructuringはできない

みたいな。
詳細は、 http://kangax.github.io/compat-table/es2016plus/#node4

NodeのLTSでさえv6.xなので、はよバージョン上げて欲しい・・・

`context.succeed()`じゃなくなる

// いままで
exports.handler = function(event, context) {
  // do something...

  // OK
  context.succeed();
  // or
  context.done();

  // NG
  context.fail(err);
  // or
  context.done(err);
};

// これから
exports.handler = (event, context, callback) => {
  // do something...

  // OK
  callback();

  // NG
  callback(err);
};

https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/nodejs-prog-model-using-old-runtime.html#transition-to-new-nodejs-runtime

しばらくは古い記法でも動くっぽいけど、ハンドラの実行結果としてはfailしまくりに。

ちなみに1

移行ドキュメントにあるこの謎の1行。

context.callbackWaitsForEmptyEventLoop = false;
callback();

`callback()`でイベントループに貯まってる処理を待たずに即おしまい!ってしたい場合に、`false`にするんだそうな。

ちなみに2

API Gatewayとか使ってて、クライアント側で楽するために、

// OK
callback(null, { errorMessage: null })

として、fail時と同じようなインターフェースを返す、ただし`errorMessage`は`null`ってしようとしても、Lambdaのハンドラ的にfail扱いにされます。
これバグなのか仕様なのか謎です。解せぬ。

環境変数が使えるように

これは最近できるようになったらしい。
Lambdaのコンソールの画面にそれらしいフィールドが増えてて、keyとvalueを入れて保存すると使える。

Nodeのコードからは、このように。

// FOOって環境変数
process.env.FOO;