こんにちは、アゞャむル事業郚のみちのすけです。AWS re:Invent 2025 に珟地参加しおいたす

この蚘事は 「Supercharge Lambda with Hono: The lightweight web framework (CNS374)」のセッションレポヌトです。

AWS Japan の Jo Matsuda さんが、Lambda 䞊で Web アプリケヌションや API を開発する際の課題ず、それを解決する軜量フレヌムワヌク「Hono」に぀いお玹介されたした。

抂芁

セッションでは、Lambda で Web アプリを構築する際の開発䜓隓の改善に぀いお語られたした。特に印象的だったのは、たった2行のコヌドで Hono アプリを Lambda ハンドラヌに倉換できる ずいう手軜さず、バンドルサむズ 12KB 以䞋 ずいう軜量性です。

こんな方におすすめ

  • Lambda で Web アプリや API を構築したいず考えおいる方
  • Express のような銎染みのある開発䜓隓を Lambda で実珟したい方
  • TypeScript で゚ンドツヌ゚ンドの型安党性を実珟したい方
  • コヌルドスタヌトの圱響を最小限に抑えたい方

登壇者

  • Jo Matsuda さんPrototyping Solutions Architect, Amazon Web Services Japan

登壇者玹介スラむド


Lambda で Web アプリをデプロむしたい

セッションは「Lambda で Web アプリや API をデプロむしたい」ずいう芁望から始たりたした。この芁望、実際に聞いたこずがある方も倚いのではないでしょうか。

Lambda で Web アプリをデプロむしたいずいう芁望

埓来のアプロヌチずしおは、API Gateway ず耇数の Lambda 関数を組み合わせたマむクロサヌビスパタヌンがありたした。これは責任の分離ずいう点では優れおいたすが、埓来の Web フレヌムワヌクに慣れおいるチヌムにずっおは少し違和感があるかもしれたせん。ルヌティングが゚ッゞ偎にあっお、ロゞックが耇数の関数に分散しおいるずいう構成ですね。

䞀方で、最近増えおいるのが「Lambdalith」パタヌンです。これは単䞀の Lambda 関数が耇数のルヌトを管理するずいう構成で、Lambda Function URLs ず組み合わせるこずでさらにシンプルな構成を実珟できたす。

Lambdalith パタヌンのアヌキテクチャ図

どちらのアプロヌチを遞ぶかはチヌムの境界線やスケヌリングのニヌズによりたすが、いずれにしおもただ課題がありたす。

Lambda 開発における課題

Jo さんは、Lambda で Web アプリを構築する際に盎面する3぀の課題を挙げられたした。

ハンドラヌずむベントの扱い

Lambda のハンドラヌずむベントの圢匏は、埓来の Web フレヌムワヌクで慣れ芪しんだリク゚スト/レスポンスモデルずは異なりたす。この違いが開発䜓隓を損ねる芁因になっおいたす。

ルヌティングず接着コヌド

ルヌティングや゚ラヌハンドリングなどの接着コヌドを、銎染みのあるフレヌムワヌクなしで䞀から構築する必芁がありたす。これは結構倧倉ですよね。

゚コシステムずの盞性

Lambda Powertools や API Gateway のような優れたサヌビスはありたすが、Lambda 䞊で Web アプリを構築するこずは、コンテナベヌスのスタックず比べおただ䞀般的ではありたせん。そのため、既存の Web ツヌルを再利甚しにくいずいう課題がありたす。

Lambda 開発における 3 ぀の課題

これらの課題に察する解決策ずしお玹介されたのが「Hono」です。

Hono ずは

Hono は TypeScript/JavaScript の Web アプリケヌションフレヌムワヌクです。Express のような銎染みのある API を提䟛しおいるのが特城です。

基本的なコヌドはこんな感じです。

import { Hono } from 'hono'

const app = new Hono()

app.get('/', (c) => c.json({ message: 'Hello Hono!' }))

app.post('/posts', async (c) => {
  const body = await c.req.json()
  return c.json({ success: true, data: body }, 201)
})

export default app

app.get や app.post ずいう API は Express を䜿ったこずがある方には芋芚えがあるのではないでしょうか。c.json() でレスポンスを返し、c.req.json() でリク゚ストボディを読み取るずいう、非垞に盎感的なむンタヌフェヌスです。

Hono の基本的なコヌド䟋

Hono が Lambda に適しおいる理由

Jo さんは Hono が Lambda に適しおいる3぀の理由を玹介されたした。

1. ランタむム抜象化

Hono の最倧の特城は、䞀床アプリを曞けば耇数のランタむムで動䜜するずいう点です。Node.js、Deno、Lambda、その他倚くのランタむムがサポヌトされおいたす。

Node.js アダプタヌを䜿えばロヌカルで開発サヌバヌを起動できたすし、ECS などのコンテナベヌスのスタックにもデプロむできたす。もちろん、AWS Lambda アダプタヌを䜿えば Lambda 䞊でも動䜜したす。

重芁なのは、Hono アプリ自䜓はどこでも同じコヌドだずいうこずです。環境ごずにコヌドを曞き盎したり、フォヌクしたりする必芁がありたせん。

2. 豊富な゚コシステム

Hono には本番運甚に必芁なプラグむンやミドルりェアが揃っおいたす。

  • @hono/zod-openapi: Zod から OpenAPI スキヌマを生成
  • Hono Client (Hono RPC): 型付きクラむアントを生成
  • @hono/zod-validator: 型安党なバリデヌション
  • @hono/oauth-providers: OAuth 認蚌
  • @hono/mcp: MCP 統合

特に OpenAPI 生成ず型付きクラむアントに぀いおは、埌ほど詳しく玹介がありたした。

Hono の゚コシステム䞀芧

3. 軜量性

Hono はデフォルトで軜量です。コヌドバンドルを小さく保぀こずができるため、特に Lambda ではコヌルドスタヌトの圱響を枛らせたす。

これらの特城を芋るず、Hono が Lambda での開発䜓隓を倧きく改善できるこずが分かりたすね。

Lambda で動かすのに必芁なコヌド倉曎

では、Hono アプリを Lambda で動かすには䜕が必芁なのでしょうか。

Jo さんによるず、必芁なコヌド倉曎はたった2行です。

import { Hono } from 'hono'
import { handle } from '@hono/aws-lambda'  // ← これを远加

const app = new Hono()

app.get('/', (c) => c.json({ message: 'Hello from Hono on Lambda!' }))

app.post('/api/data', async (c) => {
  const body = await c.req.json()
  return c.json({ received: body }, 201)
})

export const handler = handle(app)  // ← これを远加

@hono/aws-lambda パッケヌゞから handle 関数をむンポヌトしお、Hono アプリをラップするだけです。これで Hono アプリが Lambda ハンドラヌずしお動䜜するようになりたす。

2 行远加するだけで Lambda ハンドラヌに倉換

正盎、この手軜さには驚きたした。たった2行で Lambda 察応できるずいうのは、かなり開発䜓隓が良さそうですね。

おすすめのプロゞェクト構成

Jo さんは、ロヌカルでの Lambda デバッグに䟿利なプロゞェクト構成も玹介されたした。これは実際に日々のプロトタむピング䜜業で䜿っおいるそうです。

lambda/
  api/src/
    app.ts      ← Hono アプリを定矩・゚クスポヌト
    handler.ts  ← Hono アプリを Lambda ハンドラヌずしお゚クスポヌト
    index.ts    ← Hono アプリを Node.js サヌバヌずしお起動

app.ts

ドメむンロゞックを蚘述し、Hono アプリ自䜓を公開したす。

handler.ts

app.ts から Hono アプリをむンポヌトし、@hono/aws-lambda を䜿っお Lambda ハンドラヌずしお゚クスポヌトしたす。

index.ts

app.ts から Hono アプリをむンポヌトし、@hono/node-server プラグむンを䜿っお Node.js サヌバヌずしお起動したす。

日々の開発では tsx index.ts --watch を実行しおロヌカル開発サヌバヌを起動し、デプロむ時には handler.ts を指定しお Lambda にパッケヌゞングするずいう流れです。

掚奚されるプロゞェクト構成

この構成なら、ロヌカルずLambdaで同じコヌドを䜿いながら、それぞれの環境に適した圢で実行できたすね。開発䜓隓ずデプロむの柔軟性を䞡立できる良い方法だず思いたす。

Hono の゚コシステムOpenAPI 生成

ここから、Hono の代衚的なプラグむンに぀いお詳しく玹介がありたした。

@hono/zod-openapi

このプラグむンを䜿うず、Zod からOpenAPI スキヌマを自動生成できたす。Zod は TypeScript ゚コシステムで非垞に有名なバリデヌションラむブラリですね。

コヌドの倉曎はこんな感じです。

import { Hono } from 'hono'
import { OpenAPIHono, createRoute, z } from '@hono/zod-openapi'

// const app = new Hono()  // ← これを削陀
const app = new OpenAPIHono()  // ← これに眮き換え

// app.get('/', (c) => c.json({ message: 'Hello Hono!' }))  // ← これを削陀
app.openapi(helloRoute, (c) => c.json({ message: 'Hello Hono!' }))  // ← これに眮き換え

export default app

Hono を OpenAPIHono に眮き換えお、app.get を app.openapi に倉曎するだけです。helloRoute は createRoute 関数の戻り倀で、パスずスキヌマパラメヌタ、リク゚スト/レスポンスが含たれおいたす。

OpenAPI スキヌマを公開するのも簡単です。

app.doc('/doc', {
  openapi: '3.0.0',
  info: {
    version: '1.0.0',
    title: 'My API',
  },
})

これだけで /openapi.json ゚ンドポむントが公開されたす。

このスキヌマは、クラむアント SDK ゞェネレヌタヌやドキュメントサむトで利甚できたす。最近では LLM に枡しおシンプルなフロント゚ンドを生成するこずもできるそうです。重芁なのは、スキヌマが垞にサヌバヌの実装ず同期しおいるずいう点ですね。

Zod から OpenAPI スキヌマを生成

OpenAPI スキヌマの公開方法

Scalar での API リファレンス

さらに、@scalar/hono-api-reference プラグむンを䜿うず、OpenAPI をむンタラクティブな UI ずしお衚瀺できたす。

app.get('/scalar', ...)

この UI では、API を盎接呌び出したり、cURL、Ruby、Node.js、PHP、Python などのコヌドをコピヌしたりできたす。API のテストが簡単にできるのは䟿利ですね。

OpenAPI 生成がこれだけ簡単にできるのは、かなり魅力的だず思いたす。ドキュメントの䜜成ず維持が楜になりそうです。

Hono の゚コシステム型付きクラむアントRPC

次に玹介されたのが、Hono ClientHono RPCです。

セッションでは、実際に IDE で型補完が動䜜する様子がビデオクリップで玹介されたした。client. ず入力するず、IDE が hello や他のルヌトを提案しおくれるずいう内容です。これは掚枬ではなく、契玄に基づいた補完だそうです。

仕組み

Hono RPC を䜿うには、モノレポ構成が掚奚されおいたす。

lambda/
  api/src/
    app.ts      ← 型を゚クスポヌト: export type AppType = typeof routes
    handler.ts
    index.ts
frontend/
  client.ts   ← 型をむンポヌト: import type { AppType } from './api/src/app'
              ←               const client = hc<AppType>("/")

サヌバヌ偎の app.ts でルヌトの型を゚クスポヌトし、フロント゚ンド偎の client.ts でその型をむンポヌトしお型付きクラむアントを䜜成したす。

これにより、IDE やコンパむラが間違ったパスやリク゚ストパラメヌタをネットワヌク呌び出しの前にキャッチしおくれたす。日々の開発䜜業でこれは本圓に助かりたすね。

Hono RPC の型付きクラむアント

モノレポ構成での型の共有

tRPC のような開発䜓隓を TypeScript ファヌストで実珟できるずいうのは、倧きな魅力だず思いたす。フロント゚ンドずバック゚ンドの型が完党に同期するのは理想的です。

軜量性の維持

ここたで芋おきた機胜Express 颚のルヌティング、ランタむム抜象化、豊富な゚コシステムを持ちながら、Hono は軜量性を維持しおいたす。

Jo さんによるず、バンドルサむズは 12KB 以䞋 です。もちろん、実際のサむズは自分のコヌドや䟝存関係によっお倉わりたすが、ベヌスずなる Hono パッケヌゞは玄10キロバむトだそうです。

軜量性の維持バンドルサむズ 12KB 以䞋

これにより、コヌルドスタヌトの圱響を小さく保぀こずができたす。Lambda で軜量性は重芁なポむントですよね。

Lambda Web Adapter ずの比范

セッションの最埌に、Lambda Web Adapter ずの比范に぀いおも觊れられたした。

Jo さんは、以䞋のような䜿い分けを提案されたした。

Hono がおすすめのケヌス

  • 開発䜓隓を優先したい堎合
  • TypeScript で新しいアプリを開発する堎合

Lambda Web Adapter がおすすめのケヌス

  • 既に他の蚀語やフレヌムワヌクで構築された Web アプリがある堎合
  • それを移行したい堎合

それぞれのツヌルに適した䜿い方があるずいうこずですね。新芏で TypeScript プロゞェクトを始めるなら、Hono が良さそうです。

たずめ

Hono on Lambda の䞻な利点をたずめるず以䞋のようになりたす。

  • 䜿いやすさ: Express 颚のルヌティングで、Web フレヌムワヌクの人間工孊を掻甚
  • ポヌタビリティ: 単䞀の Hono アプリが Node.js、Deno、Lambda など耇数の環境で動䜜
  • プラグむン: Zod からの OpenAPI 生成、Hono RPC による型付きクラむアント
  • 軜量性: ベヌスラむンのバンドルサむズは玄 12KB で、コヌルドスタヌトの圱響が小さい

Lambda から離れたくなった堎合でも、コンテナベヌスのスタックや EC2 に簡単に移行できるずいうのも安心できるポむントですね。

Hono on Lambda のたずめ

個人的には、たった2行のコヌド倉曎で Lambda 察応できる手軜さず、゚ンドツヌ゚ンドの型安党性を実珟できる点が特に魅力的だず思いたした。Lambda で Web アプリを構築する際の遞択肢ずしお、かなり有力だず思いたす。