【AWS Lambda Tips】Node.js 18から22へのバージョンアップ手順まとめ

# はじめに
Lambda関数のランタイムに設定しているNode.jsのバージョンアップ方法を紹介する。本記事では、例としてNode.js 18以前からNode.js 22への変換のポイントについても併せて紹介する。

## 【参考】Node.jsのサポート期間

Node.js 18以前のバージョンは、2025年4月でサポート切れとなっている。AWSのLambda関数のランタイムとしてもセキュリティサポートの対象外となるので対応を推奨する。

https://nodejs.org/ja/about/previous-releases

# 動作確認環境
* バージョンアップ前
  * Node.js 14、16、18
* バージョンアップ後
  * Node.js 22  

# 方法

AWSのコンソールを使用する方法を紹介する。

## 特定のランタイムのLambda関数を抽出

検索欄のフィルタで、ランタイムを特定できる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/638977/62f640e4-9de3-465c-bdb8-11baed0a3e71.png)

今回は、Node.js 14、16、18をランタイムとして利用している関数を抽出するので、以下のように設定する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/638977/ae417e4e-fa9e-48da-9186-ecc939f7d0bf.png)

## Lambda関数のコードの修正

変更したいLambda関数を選択して、「コード」のタブを押す。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/638977/e31b6077-cb70-4689-b812-9eecff5aca6a.png)

「コードソース」からコードを修正する。

:::note warn
コードを修正する前に、バージョンを発行しておくことを推奨する。バージョン発行については[こちらの記事](https://zenn.dev/amarelo_n24/articles/158a166d832487)を参照。
:::

Node.js 14、16からNode.js 22に変更する際のポイントとして以下がある。

* CommonJSからECMAScript(ES Module, ES2015)に変更
* AWS CDKをv3にバージョンアップ


### CommonJSからECMAScript(ES Module, ES2015)に変更

Nodeのバージョン18以上のLambdaでは、デフォルトファイルの拡張子がmjsに変更されている。そのため、モジュールのインポート方法を変更し、```index.js```ファイルのファイル名を```index.mjs```に変更する。詳細は、[こちらの記事](https://qiita.com/taisei-ide-lyd/items/f3673e913e8b658946a6)を参照。

以下にコード修正の例を示す。

```js: CommonJSを使う例（Node.js 14/16）
// index.js
const AWS = require('aws-sdk');

exports.handler = async (event) => {
  const s3 = new AWS.S3();
  const result = await s3.listBuckets().promise();
  
  return {
    statusCode: 200,
    body: JSON.stringify(result.Buckets),
  };
};
```
上記のコードをNode.js 22で動作するように、ES Moduleスタイルに変更する。
コード修正が完了したら、```index.js```のファイル名を```index.mjs```に変更する。

```js: ES Moduleを使う例（Node.js 22）
// index.mjs
import { S3 } from 'aws-sdk';

export const handler = async (event) => {
  const s3 = new S3();
  const result = await s3.listBuckets().promise();
  
  return {
    statusCode: 200,
    body: JSON.stringify(result.Buckets),
  };
};
```


変更前

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/638977/7c52eb42-4dc1-450b-9663-32830a32036f.png)

変更後

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/638977/c6dfd91f-de71-4467-b4a2-e58e9421ba40.png)

最後に、Deployボタンを押して、コードの修正を反映する。

### Lambda関数のランタイムを修正

コードの修正が完了したら、ランタイムを修正する。

変更したいLambda関数「コード」のタブの下の方にある、「ランタイム設定」の「編集」ボタンを押す。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/638977/82668f9b-d9fb-4552-9fe9-8b3c31696144.png)


Node.js 22を選択して、保存ボタンを押して完了。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/638977/0005eecc-8353-4ad9-957d-76a222d6c8b1.png)

テストなどを実施して正しく動作すれば成功。動作しない場合は、CloudWatchのログを確認すると良い。

「モニタリング」タブから、「CloudWatchログを表示」ボタンを押すとCloudWatchのログを確認できる。詳細は[こちらの記事](https://qiita.com/hirune/items/8c49cf70cb3d5338bec2)を参照。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/638977/1c6adf16-cdce-4cf5-8072-9befb37ffb69.png)


# まとめ

Lambda関数のランタイムに設定しているNode.jsのバージョンアップ方法を紹介した。例としてNode.js 18以前からNode.js 22への変換のポイントについても併せて紹介した。Node.jsのサポート切れでバージョンアップする際に参考にしてほしい。

# 参考

https://qiita.com/taisei-ide-lyd/items/f3673e913e8b658946a6

https://qiita.com/hirune/items/8c49cf70cb3d5338bec2