ããã«ã¡ã¯ãã¢ãžã£ã€ã«äºæ¥éšã®ã¿ã¡ã®ããã§ãã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 ããããã€ãããããšããèŠæããå§ãŸããŸããããã®èŠæãå®éã«èããããšãããæ¹ãå€ãã®ã§ã¯ãªãã§ããããã

åŸæ¥ã®ã¢ãããŒããšããŠã¯ãAPI Gateway ãšè€æ°ã® Lambda 颿°ãçµã¿åããããã€ã¯ããµãŒãã¹ãã¿ãŒã³ããããŸãããããã¯è²¬ä»»ã®åé¢ãšããç¹ã§ã¯åªããŠããŸãããåŸæ¥ã® Web ãã¬ãŒã ã¯ãŒã¯ã«æ £ããŠããããŒã ã«ãšã£ãŠã¯å°ãéåæããããããããŸãããã«ãŒãã£ã³ã°ããšããžåŽã«ãã£ãŠãããžãã¯ãè€æ°ã®é¢æ°ã«åæ£ããŠãããšããæ§æã§ããã
äžæ¹ã§ãæè¿å¢ããŠããã®ããLambdalithããã¿ãŒã³ã§ããããã¯åäžã® Lambda 颿°ãè€æ°ã®ã«ãŒãã管çãããšããæ§æã§ãLambda Function URLs ãšçµã¿åãããããšã§ããã«ã·ã³ãã«ãªæ§æãå®çŸã§ããŸãã

ã©ã¡ãã®ã¢ãããŒããéžã¶ãã¯ããŒã ã®å¢çç·ãã¹ã±ãŒãªã³ã°ã®ããŒãºã«ãããŸããããããã«ããŠããŸã 課é¡ããããŸãã
Lambda éçºã«ããã課é¡
Jo ããã¯ãLambda ã§ Web ã¢ããªãæ§ç¯ããéã«çŽé¢ãã3ã€ã®èª²é¡ãæããããŸããã
ãã³ãã©ãŒãšã€ãã³ãã®æ±ã
Lambda ã®ãã³ãã©ãŒãšã€ãã³ãã®åœ¢åŒã¯ãåŸæ¥ã® Web ãã¬ãŒã ã¯ãŒã¯ã§æ £ã芪ããã ãªã¯ãšã¹ã/ã¬ã¹ãã³ã¹ã¢ãã«ãšã¯ç°ãªããŸãããã®éããéçºäœéšãæããèŠå ã«ãªã£ãŠããŸãã
ã«ãŒãã£ã³ã°ãšæ¥çã³ãŒã
ã«ãŒãã£ã³ã°ããšã©ãŒãã³ããªã³ã°ãªã©ã®æ¥çã³ãŒããã銎æã¿ã®ãããã¬ãŒã ã¯ãŒã¯ãªãã§äžããæ§ç¯ããå¿ èŠããããŸããããã¯çµæ§å€§å€ã§ãããã
ãšã³ã·ã¹ãã ãšã®çžæ§
Lambda Powertools ã API Gateway ã®ãããªåªãããµãŒãã¹ã¯ãããŸãããLambda äžã§ Web ã¢ããªãæ§ç¯ããããšã¯ãã³ã³ããããŒã¹ã®ã¹ã¿ãã¯ãšæ¯ã¹ãŠãŸã äžè¬çã§ã¯ãããŸããããã®ãããæ¢åã® Web ããŒã«ãåå©çšãã«ãããšãã課é¡ããããŸãã

ãããã®èª²é¡ã«å¯Ÿãã解決çãšããŠç޹ä»ãããã®ãã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 ã 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 çæãšåä»ãã¯ã©ã€ã¢ã³ãã«ã€ããŠã¯ãåŸã»ã©è©³ãã玹ä»ããããŸããã

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 察å¿ã§ãããšããã®ã¯ãããªãéçºäœéšãè¯ãããã§ããã
ããããã®ãããžã§ã¯ãæ§æ
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 ã«æž¡ããŠã·ã³ãã«ãªããã³ããšã³ããçæããããšãã§ããããã§ããéèŠãªã®ã¯ãã¹ããŒããåžžã«ãµãŒããŒã®å®è£ ãšåæããŠãããšããç¹ã§ããã


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 ãã³ã³ãã€ã©ãééã£ããã¹ããªã¯ãšã¹ããã©ã¡ãŒã¿ããããã¯ãŒã¯åŒã³åºãã®åã«ãã£ããããŠãããŸããæ¥ã ã®éçºäœæ¥ã§ããã¯æ¬åœã«å©ãããŸããã


tRPC ã®ãããªéçºäœéšã TypeScript ãã¡ãŒã¹ãã§å®çŸã§ãããšããã®ã¯ã倧ããªé åã ãšæããŸããããã³ããšã³ããšããã¯ãšã³ãã®åãå®å šã«åæããã®ã¯çæ³çã§ãã
è»œéæ§ã®ç¶æ
ãããŸã§èŠãŠããæ©èœïŒExpress 颚ã®ã«ãŒãã£ã³ã°ãã©ã³ã¿ã€ã æœè±¡åãè±å¯ãªãšã³ã·ã¹ãã ïŒãæã¡ãªãããHono ã¯è»œéæ§ãç¶æããŠããŸãã
Jo ããã«ãããšããã³ãã«ãµã€ãºã¯ 12KB ä»¥äž ã§ãããã¡ãããå®éã®ãµã€ãºã¯èªåã®ã³ãŒããäŸåé¢ä¿ã«ãã£ãŠå€ãããŸãããããŒã¹ãšãªã Hono ããã±ãŒãžã¯çŽ10ãããã€ãã ããã§ãã

ããã«ãããã³ãŒã«ãã¹ã¿ãŒãã®åœ±é¿ãå°ããä¿ã€ããšãã§ããŸãã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 ã«ç°¡åã«ç§»è¡ã§ãããšããã®ãå®å¿ã§ãããã€ã³ãã§ããã

å人çã«ã¯ããã£ã2è¡ã®ã³ãŒã倿Žã§ Lambda 察å¿ã§ããæè»œããšããšã³ãããŒãšã³ãã®åå®å šæ§ãå®çŸã§ããç¹ãç¹ã«é åçã ãšæããŸãããLambda ã§ Web ã¢ããªãæ§ç¯ããéã®éžæè¢ãšããŠãããªãæåã ãšæããŸãã