Serverless Express v5 がリリースされたので AWS Lambda で動かしてみた
こんにちは、製造ビジネステクノロジー部の若槻です。
Express をサーバーレス環境で実行できる Serverless Express で、昨年12月のベータ版リリースから約半年を経て、v5.0.0 が正式リリース(GA)されました。
以前、ベータ版がリリースされた際に Node.js 24 サポートを確認する記事を書きました。
今回は GA 版でも問題なく動作するか確認してみました。
やってみた
パッケージインストール
Express v5 をインストールします。
npm install express@latest @types/express
Serverless Express v5 をインストールします。GA リリースになったので @beta タグは不要です。
npm install @codegenie/serverless-express@5
ハンドラーコード
Serverless Express を Lambda 関数上で動かすハンドラーコード (TypeScript) です。ベータ版からコードの変更はありません。
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 を設定します。
{
"compilerOptions": {
"esModuleInterop": true
}
}
CDK コード
API Gateway REST API の Lambda プロキシ統合のリソースは AWS CDK で実装します。
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 へのアップデートで破壊的変更がいくつかあります。
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 へのマイグレーションも、最新の使い方をしていれば比較的スムーズに行えそうです。
以上







