[アップデート] AWS Lambdaが Node.js 16をサポートしました

Lambdaがサポートするランタイムに Node.js 16 加わりました
2022.05.13

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

そろそろNode.js 16使いたいな

こんにちは、のんピ(@non____97)です。

皆さんはそろそろNode.js 16使いたいなと思ったことはありますか? 私はあります。

AWS Lambdaがサポートしている昨日までのNode.jsの最新バージョンはv14です。

Node.js 14のサポート終了は2023/4/30です。あと1年切っていますね。

そんな折、AWS Lambdaが Node.js 16をサポートしました。

AWS公式ブログも投稿されていますね。

Node.js 16はNode.jsの最新のLTSリリースであり、2024年4月までセキュリティ&バグフィックスがサポートされます。

Node.js 16ではV8エンジンがv9.0にアップデートされています。

以下コードでNode.js 14で使うV8エンジンのバージョンを確認するとv8.4でした。

exports.handler = async (event) => {
    console.log(process.version);
    console.log(process.versions.v8);
    
    const response = {
        statusCode: 200,
        body: JSON.stringify('Hello from Lambda!'),
    };
    return response;
};
START RequestId: 6f8617f4-3bbb-42df-8781-02e434e13f55 Version: $LATEST
2022-05-13T05:36:35.007Z	6f8617f4-3bbb-42df-8781-02e434e13f55	INFO	v14.19.1
2022-05-13T05:36:35.007Z	6f8617f4-3bbb-42df-8781-02e434e13f55	INFO	8.4.371.23-node.85
END RequestId: 6f8617f4-3bbb-42df-8781-02e434e13f55
REPORT RequestId: 6f8617f4-3bbb-42df-8781-02e434e13f55	Duration: 5.00 ms	Billed Duration: 5 ms	Memory Size: 128 MB	Max Memory Used: 56 MB	Init Duration: 142.69 ms

そのため、V8エンジンのv8.5〜9.0の様々な新機能が利用できそうですね。

マネージメントコンソールから確認してみた

早速マネージメントコンソールから確認します。

Node.js 16.xというランタイムが光輝いています。ランタイムをNode.js 16.x、アーキテクチャをarm64(なんとなく)を選択して、Lambda関数を作成します。

Node.js 16のLambda関数の作成

以下コードでNode.jsとV8エンジンのバージョンを確認してみます。

exports.handler = async (event) => {
    console.log(process.version);
    console.log(process.versions.v8);
    
    const response = {
        statusCode: 200,
        body: JSON.stringify('Hello from Lambda!'),
    };
    return response;
};

実行すると、Node.jsのバージョンは16.14.0で、V8エンジンのバージョンは9.4.146.24であることが分かりました。

START RequestId: 81bd7614-e6c4-493e-894a-d841a92ef236 Version: $LATEST
2022-05-13T05:43:46.978Z	81bd7614-e6c4-493e-894a-d841a92ef236	INFO	v16.14.0
2022-05-13T05:43:46.980Z	81bd7614-e6c4-493e-894a-d841a92ef236	INFO	9.4.146.24-node.20
END RequestId: 81bd7614-e6c4-493e-894a-d841a92ef236
REPORT RequestId: 81bd7614-e6c4-493e-894a-d841a92ef236	Duration: 5.70 ms	Billed Duration: 6 ms	Memory Size: 128 MB	Max Memory Used: 54 MB	Init Duration: 133.79 ms

AWS CDKでデプロイしてみた

Node.js 16のLambda関数のデプロイはマネージメントコンソールからだけではなく、早速AWS SAM、CloudFormation、AWS CDKからもできるようになっていました。

今回はAWS CDKでデプロイします。

準備したコードは以下リポジトリに格納してあります。

実行するLambda関数はtimers promises APIsetTimeoutを使って、数秒間待機するといったシンプルなものです。なんとなくtop-level awaitも使いたくなったのでハンドラーの外、内どちらもtimers promises APIsetTimeoutを使用します。

実際のコードは以下の通りです。

./src/lambda/handlers/node-js-16-handler.ts

import { setTimeout } from "timers/promises";

console.log(`Start setTimeout outside of handler : ${new Date()}`);
await setTimeout(2000);
console.log(`End setTimeout outside of handler : ${new Date()}`);

export const handler = async (): Promise<void | Error> => {
  console.log(`Start setTimeout inside of handler : ${new Date()}`);
  await setTimeout(3000);
  console.log(`End setTimeout inside of handler : ${new Date()}`);

  return;
};

npx cdk deployでこちらのLambda関数をデプロイします。

デプロイ後、Lambda関数を確認すると、確かにランタイムがNode.js 16.xになっていることが分かりました。

ランタイムの確認

こちらのLambda関数を実行すると、順番通りに指定した秒数待機したことが分かります。

START RequestId: 6ea8f038-6942-4899-b0f8-6a169978b391 Version: $LATEST
2022-05-13T09:18:24.775Z	undefined	INFO	Start setTimeout outside of handler : Fri May 13 2022 09:18:24 GMT+0000 (Coordinated Universal Time)
2022-05-13T09:18:26.778Z	undefined	INFO	End setTimeout outside of handler : Fri May 13 2022 09:18:26 GMT+0000 (Coordinated Universal Time)
2022-05-13T09:18:26.783Z	6ea8f038-6942-4899-b0f8-6a169978b391	INFO	Start setTimeout inside of handler : Fri May 13 2022 09:18:26 GMT+0000 (Coordinated Universal Time)
2022-05-13T09:18:29.792Z	6ea8f038-6942-4899-b0f8-6a169978b391	INFO	End setTimeout inside of handler : Fri May 13 2022 09:18:29 GMT+0000 (Coordinated Universal Time)
END RequestId: 6ea8f038-6942-4899-b0f8-6a169978b391
REPORT RequestId: 6ea8f038-6942-4899-b0f8-6a169978b391	Duration: 3012.82 ms	Billed Duration: 3013 ms	Memory Size: 128 MB	Max Memory Used: 56 MB	Init Duration: 2138.21 ms	
XRAY TraceId: 1-627e2260-1e0600086a26883d7263773a	SegmentId: 7feaf48d24403cd6	Sampled: true

Node.js 16に乗り換えていく

AWS Lambdaが Node.js 16をサポートしたアップデートを紹介しました。

新しいバージョンがサポートされるということは古いバージョンはサポートされなくなる時期が近づいてきているということです。もし、ランタイムに古いバージョンのNode.jsを使用されている方はそろそろ更新を検討されてはいかがでしょうか。

この記事が誰かの助けになれば幸いです。

以上、AWS事業本部 コンサルティング部の のんピ(@non____97)でした!