AWS Lambda(node.js v14)でES ModulesとTop Level awaitがサポート

AWS Lambda(node.js v14)でES ModulesとTop Level awaitがサポート

node.js v14でTop Level awaitがサポートされるようになりました。(EcmaScriptのみ)

現時点でnode.js v16が最新のようです。

npm initでtypeが選べない

defaultでtypeは省略されています。

npm initコマンドでインタラクティブにpackage.jsonを作成するけどtypeに関しての設定がありません。

[FEATURE] prompt for module type as part of npm init · npm rfcs · Discussion #75
What / Why As part of npm init, the script should prompt the user for a module type for the project's package.json, with a default value of commonjs if nothing ...
[RRFC] Add `type` to `npm init` · Issue #347 · npm/rfcs
Motivation ("The Why") The type field is used by many folks to be explicit about the how Node.js interprets the .js extension. It would be great if we could set...

その為、npm initコマンド実行した後に”type” : “module”を追加する必要があります。

※「npm initコマンドでpackage.jsonにデフォルトでtype:moduleを設定する方法

{
  "name": "test",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "",
  "type": "module", // 追加する
  "license": "ISC"
}

これでLambda(node.js)でTop Level Awaitが使えるようになります。

今後はLambda(node.js)ではEcmaScriptが主流になるかもしれない、そんな気がします。

handler外で初期処理を記述する

プロビジョニングを使用し、Top Level Awaitを使用すれば、handler外で重たい初期処理を記述することができ、これにより処理速度が向上するようです。(試していないです)

lambdaはこんなソースにしました。

import {setTimeout} from 'timers/promises'
console.log('test1')
await setTimeout(5000) // 重たい処理と仮定
console.log('test2')
export async function handler() {
  console.log('test3')
  // TODO implements
  const response = {
    statusCode: 200,
    body: JSON.stringify('Hello from Lambda!'),
  };
  return response;
};

AWS Lambda(node.js v14)でES ModulesとTop Level awaitがサポート

バージョン発行し、プロビジョニングされた同時実行を「2」にします。1~2分かかって準備完了になります。

AWS Lambda(node.js v14)でES ModulesとTop Level awaitがサポート

準備完了になった時点で、cloudwatch logsを見ると、handler外が実行されているのがわかります。

AWS Lambda(node.js v14)でES ModulesとTop Level awaitがサポート

これで初期処理が完了しているという感じでしょうか。だからLambda実行自体は早くなる、という事になります。(多分)

では、肝心のlambdaを実行します。「Test」ボタンを押してcloudwatch logsを見てみます。

AWS Lambda(node.js v14)でES ModulesとTop Level awaitがサポート

lambda実行時はhandler外は実行されず、handler内しか実行されていません。予想通りの動きですね。プロビジョニングすると金はかかりますが早くすることができるようです。

参考サイト

AWS Lambda が ES モジュールと Node.js 14 の Top-Level Await のサポートを開始

コメント

タイトルとURLをコピーしました