Serverless Express v5 がリリースされたので AWS Lambda で動かしてみた

Serverless Express v5 がリリースされたので AWS Lambda で動かしてみた

2026.04.21

こんにちは、製造ビジネステクノロジー部の若槻です。

Express をサーバーレス環境で実行できる Serverless Express で、昨年12月のベータ版リリースから約半年を経て、v5.0.0 が正式リリース(GA)されました。

https://github.com/CodeGenieApp/serverless-express/releases/tag/v5.0.0

以前、ベータ版がリリースされた際に Node.js 24 サポートを確認する記事を書きました。

https://dev.classmethod.jp/articles/serverless-express-v5-nodejs24-on-lambda/

今回は GA 版でも問題なく動作するか確認してみました。

やってみた

パッケージインストール

Express v5 をインストールします。

npm install express@latest @types/express

Serverless Express v5 をインストールします。GA リリースになったので @beta タグは不要です。

npm install @codegenie/serverless-express@5

ハンドラーコード

Serverless Express を Lambda 関数上で動かすハンドラーコード (TypeScript) です。ベータ版からコードの変更はありません。

handler.ts
import serverlessExpress from "@codegenie/serverless-express";
import express, { Request, Response } from "express";

const app = express();

app.get("/hello", async (_: Request, res: Response): Promise<void> => {
  res.status(200).send({ message: "Hello, world!" });
});

export const handler = serverlessExpress({ app });
Express は ESM 非対応なので、必要に応じて esModuleInterop を設定します。
tsconfig.json
{
  "compilerOptions": {
    "esModuleInterop": true
  }
}

CDK コード

API Gateway REST API の Lambda プロキシ統合のリソースは AWS CDK で実装します。

lib/sample-stack.ts
import * as cdk from "aws-cdk-lib";
import * as apigateway from "aws-cdk-lib/aws-apigateway";
import * as lambda from "aws-cdk-lib/aws-lambda";
import * as lambda_nodejs from "aws-cdk-lib/aws-lambda-nodejs";
import { Construct } from "constructs";

export class SampleStack extends cdk.Stack {
  constructor(scope: Construct, id: string) {
    super(scope, id);

    /**
     * Lambda Function
     */
    const handler = new lambda_nodejs.NodejsFunction(this, "Handler", {
      entry: "src/handler.ts",
      runtime: lambda.Runtime.NODEJS_24_X, // Node.js 24 ランタイムを指定
    });

    /**
     * API Gateway REST API
     */
    new apigateway.LambdaRestApi(this, "RestApi", {
      handler,
    });
  }
}

上記をデプロイしてリソースを作成します。

動作確認

API を呼び出すと、期待通りのレスポンスが返りました。問題なく動作しています。

$ REST_API_ID=xxxxxxxxxx
$ curl https://${REST_API_ID}.execute-api.ap-northeast-1.amazonaws.com/prod/hello
{"message":"Hello, world!"}

v4 → v5 の破壊的変更

ドキュメントを確認すると、v4 から v5 へのアップデートで破壊的変更がいくつかあります。

https://github.com/CodeGenieApp/serverless-express/blob/mainline/UPGRADE.md#from-4x-to-5x

Node.js の最小サポートバージョンが 24 に

v5 では Node.js 24 以上が必要になりました。Lambda ランタイムは NODEJS_24_X を指定しましょう。

コールバックベースのハンドラーが廃止

コールバック形式のハンドラーはサポートされなくなりました。async/Promise ベースのハンドラーを使う必要があります。

// ❌ v4 まで(コールバック形式)
exports.handler = serverlessExpress.proxy(server, event, context, 'CALLBACK')

// ✅ v5(async 形式)
export const handler = serverlessExpress({ app });

削除されたオプションとメソッド

削除されたもの 代替
resolutionMode オプション 不要(async のみ対応)
binaryMimeTypes オプション binarySettings.contentTypes
serverlessExpress.createServer() serverlessExpress({ app })
serverlessExpress.proxy() serverlessExpress({ app })
handler.handler() serverlessExpress({ app })
handler.proxy() serverlessExpress({ app })

v4 の最新の使い方(serverlessExpress({ app }) 形式)をしていれば、コードの変更はほぼ不要です。

おわりに

Serverless Express v5.0.0 が GA リリースされたので AWS Lambda で動かしてみました。ベータ版からのコードの変更は不要で、パッケージバージョンと Lambda ランタイムを更新するだけで対応できました。

v4 から v5 へのマイグレーションも、最新の使い方をしていれば比較的スムーズに行えそうです。

以上

この記事をシェアする

関連記事