GAになった Lambda Web Functions を東京リージョンで試してみた

GAになった Lambda Web Functions を東京リージョンで試してみた

東京リージョンを含む 5 リージョンで利用可能になった AWS Lambda Web Functions で、Express アプリをデプロイしました。1 コマンドで公開 URL を取得でき、SSE のイベントは約 1 秒間隔で逐次届きました。
2026.10.13

はじめに

2026 年 10 月 12 日、AWS Lambda Web Functions が GA(一般提供)になりました。

https://aws.amazon.com/jp/about-aws/whats-new/2026/10/aws-lambda-web-functions/

https://aws.amazon.com/blogs/aws/announcing-aws-lambda-web-functions-for-fast-consistent-web-app-performance-anywhere/

10 月 1 日に SDK や CLI へ追加されていた仕組みが、今回正式公開となりました。先行して追加されていた内容については、以下の記事で解説しています。

https://dev.classmethod.jp/articles/aws-lambda-web-functions-source-analysis/

今回は、東京リージョン(ap-northeast-1)に Lambda Web Functions をデプロイして試してみました。

Lambda Web Functions とは

Lambda Web Functions は、アプリのコードが HTTP リクエストを直接受け取って処理する、新しいタイプの Lambda 関数です。Express や Hono などのフレームワークを、AWS Lambda Web Adapter のような変換用のアダプターを使わずに動かせます。対応するランタイムは Node.js 24(nodejs24.x)です。提供リージョンは米国東部(バージニア北部、オハイオ)、米国西部(オレゴン)、アジアパシフィック(東京)、欧州(アイルランド)の 5 つです。

課金の対象は、リクエスト数、アクティブな CPU 時間、実行環境が動いている間のメモリ、標準のデータ転送量です。料金は 1 ms 単位で計算されます。データベースや他のサービスの応答を待っている間は、CPU 時間は課金されません。

リクエストの料金は、東京とバージニア北部のどちらも 100 万リクエストあたり $0.30 です。vCPU とメモリの単価は次のとおりです。

項目 アジアパシフィック(東京) 米国東部(バージニア北部)
アクティブ vCPU $0.0000322421 / vCPU-秒 $0.0000276944 / vCPU-秒
メモリ $0.0000042688 / GB-秒 $0.0000036667 / GB-秒

https://aws.amazon.com/lambda/pricing/

従来の Lambda との比較

バージニア北部の単価で、従来の Lambda(Event Functions、Arm)と比較すると次のとおりです。

項目 Web Functions 従来の Lambda(Event Functions)
リクエスト $0.30 / 100万 $0.20 / 100万
メモリ $0.0000036667 / GB-秒 $0.0000133334 / GB-秒
CPU $0.0000276944 / vCPU-秒(アクティブな時間だけ) メモリ料金に含まれる

--hello-world のサンプルアプリをデプロイする

deploy コマンドに --hello-world を付けると、サンプルアプリの生成からデプロイまでが 1 コマンドで完了します。

aws lambda-web deploy --name ga-hello --hello-world --create --region ap-northeast-1
Creating starter application in ./ga-hello ...
Creating deployment package ...
Preparing Amazon S3 bucket ...
Preparing AWS IAM execution role ...
Uploading deployment package ...
Creating Lambda Web Function ...
https://xxxxxxxxxxxxxxxx.xxx.lambda-web.ap-northeast-1.on.aws

実行には約 26 秒かかりました。表示された URL に curl でアクセスしました。

curl -sS -i https://xxxxxxxxxxxxxxxx.xxx.lambda-web.ap-northeast-1.on.aws/
HTTP/1.1 200 OK
Content-Type: application/json
lambda-web-logstream: 2026/10/12/ga-hello[rev-xxxxx]xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
lambda-web-request-id: XXXXXXXXXXXXXXXXXXXXXXXXXX

{"message":"Hello from Lambda Web!","path":"/"}

生成された server.ts は次のとおりです。

// Minimal AWS Lambda Web Function HTTP server.
//
// You can replace this with any code or framework that starts an HTTP server.
import http from 'node:http';

// Lambda sends requests to port 3000. Set LOCAL_PORT for local development.
const port = Number(process.env.LOCAL_PORT ?? 3000);

const server = http.createServer((req, res) => {
  res.writeHead(200, { 'content-type': 'application/json' });
  res.end(JSON.stringify({ message: 'Hello from Lambda Web!', path: req.url }));
});

server.listen(port, () => {
  console.log(`listening on port ${port}`);
});

Express アプリをデプロイする

自分のコードをデプロイするときは、--hello-world の代わりに --code でディレクトリを指定します。deploy は依存パッケージを解決しないので、node_modules を先に用意しておきます。

npm install express@5.3.0

アプリのコードと package.json は次のとおりです。

index.js と package.json
const express = require('express');
const app = express();
const [host, port] = (process.env.AWS_LAMBDA_HTTP_ENDPOINT || 'localhost:3000').split(':');

const startedAt = Date.now();

// 環境情報
app.get('/', (request, response) => {
  response.json({
    pid: process.pid,
    node: process.version,
    region: process.env.AWS_REGION,
    httpEndpoint: process.env.AWS_LAMBDA_HTTP_ENDPOINT,
    uptimeMs: Date.now() - startedAt,
    requestId: request.get('lambda-web-request-id')
  });
});

// 公式サンプルの SSE(1秒ごと)
app.get('/events', (request, response) => {
  response.setHeader('Content-Type', 'text/event-stream');
  response.setHeader('Cache-Control', 'no-cache');
  response.flushHeaders();

  const interval = setInterval(() => {
    response.write(`data: ${JSON.stringify({ time: Date.now() })}\n\n`);
  }, 1000);

  response.on('close', () => {
    clearInterval(interval);
  });
});

app.listen(Number(port), host, () => {
  console.log(`listening on ${host}:${port}`);
});
{
  "name": "ga-express",
  "version": "1.0.0",
  "private": true,
  "main": "index.js",
  "dependencies": {
    "express": "5.3.0"
  }
}

node_modules を用意したディレクトリで、次のコマンドを実行しました。

aws lambda-web deploy --name ga-express --code . --create --region ap-northeast-1
Creating deployment package ...
Preparing Amazon S3 bucket ...
Preparing AWS IAM execution role ...
Uploading deployment package ...
Creating Lambda Web Function ...
https://xxxxxxxxxxxxxxxx.xxx.lambda-web.ap-northeast-1.on.aws

約 24 秒で公開 URL が表示されました。この URL の / に curl でアクセスすると、Express が応答しました。

curl -sS -i https://xxxxxxxxxxxxxxxx.xxx.lambda-web.ap-northeast-1.on.aws/
HTTP/1.1 200 OK
Content-Type: application/json; charset=utf-8
X-Powered-By: Express

{"pid":2,"node":"v24.21.0","region":"ap-northeast-1","httpEndpoint":"0.0.0.0:3000","uptimeMs":31,"requestId":"XXXXXXXXXXXXXXXXXXXXXXXXXX"}

SSE でレスポンスをストリーミングする

SSE を返す /events に curl で 6 秒間接続しました。

timeout 6 curl -sS -N -i <URL>/events

応答の Content-Type は text/event-stream で、アプリが 1 秒ごとに送るイベントが curl に 5 件届きました。受信間隔は 993〜1002 ms でした。

まとめ

GA となった Lambda Web Functions では、AWS Lambda Web Adapter などを使わずに HTTP サーバーを Lambda で動かせます。

従来の Lambda と比べて、1 つの実行環境で多数のリクエストを受け付けられるため、実行環境の利用効率の改善が期待できます。また、リクエスト単価は上がりますが、アクティブな CPU 時間に応じて課金されるため、外部 API の待ち時間が長くなりがちなワークロードでは、費用を抑えられる可能性があります。

一方で、メモリは実行環境が稼働している間ずっと課金されます。アクセス頻度が少なく、コールドスタートが問題にならないワークロードでは、従来の Lambda のほうが費用対効果が良いケースもありそうです。

東京リージョンでも、Node.js ランタイムで Lambda Web Functions を利用できます。Web アプリの新しい選択肢の一つとして、お試しください。

この記事をシェアする

AWSのお困り事はクラスメソッドへ

関連記事