AWS Lambda Node.js

Page content

AWS Lambda - Node.js 編

Lambda x Node.js 特有のTipsをば。

async/await を使って脱 callback 地獄!

Lambda は 非同期で何かすると、先にハンドラが終了をしてしまい、その何かが完了しない。 そのため、大概は同期的に書く必要がある。 (複数 api call を並行して全てが完了したら終了、という意味の非同期はあるかもしれないが)

callbackは可読性が辛い。 Promiseも見づらい。 そこで async/await のペアを使う。(async/await は Promise の sugar == wrapper) AWS SDK ももちろんこの async/await に対応している!

  • 主な事例は https://qiita.com/m__ike_/items/fbecc84658212653f309 にとてもわかり易くまとまっている。
    • 基本的には以下のように書くとだいたい work する:
      try {
          let data = await <sdk のメソッド>.promise()
          return data;
      }
      catch (error) {
          return error;
      }
      

Lambda では非同期で何かをやりっぱなしにすると完了しない

先に handler が終了を告げてしまう。そうすると Lambda の関数プロセス自体が強制終了してしまい、非同期にした何かは実行されることすらなく終わってしまう。

custom metrics の put は適当に非同期でやりつつ、やりたいことをどんどん進めていくスタイルにしようとしたら、一向に metrics が更新されず判明した。

  • 宿題:
    • なぜ?をちゃんとテクニカルに説明したいし、
    • こんなに非同期がいらないように見えるのになぜ node.js 全 FaaS で早々に再余殃されるのかが要確認

Node.js 10.x 以降のログ出力のベストプラクティス (2019/09/13時点)

jsonは改行を入れない。勝手に prettify される. "\n" は同じログエントリの中での改行となるので大丈夫。

  • それを考慮して見た目キレイかつログエントリを意味ごとに1つにしたい場合の解:

    console.log("putCustomMetric success: \n", JSON.stringify(params), "\n", JSON.stringify(data));
    
  • CloudWatchLogs や Insights での JSON 形式のログの検索性を重視するなら、 JSON obj ごとにログエントリを分けたほうが良いかもしれない。

    console.log("putCustomMetric success:");
    console.log(JSON.stringify(params));
    console.log(JSON.stringify(data));