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; }
- 基本的には以下のように書くとだいたい work する:
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));