Skip to content
shimatora.dev
Go back

Lambda の関数 URL で Frontend SPA + Backend API

1 Lambda 関数の 関数 URL でどこまで戦えるか。

Motivation

エンタープライズな環境に身をおいていると、どうしても管理画面が必要になるときがあります(個人の感想です)。 でもひとたびこれを SPA にしてー、Cloudfront+S3でサーブしてー みたいなことをすると

みたいな追加課題が降ってきます。特に後者は WAF でやるくらいしか手がないので、ランニングコストにも少なからず影響します。

というわけで、1つの Lambda の関数 URL だけで Web アプリが成立するのであれば、使える局面があるのではないかと考えました。

前提条件

構成

app/backend , app/frontend の成果物を app/package.json の script で Lambda デプロイ用の zip でまとめる感じ。
Hono が API ルーティングと SPA の静的ファイル配信の両方を担当する。Lambda のハンドラも Hono の AWS Lambda アダプタで処理。

lambda-fullstack-app/
├── app/
│   ├── backend/            # Hono (API + 静的ファイル配信)
│   │   └── src/
│   │       └── index.ts
│   ├── frontend/           # Preact SPA
│   │   ├── src/
│   │   │   ├── main.tsx
│   │   │   └── app.tsx
│   │   ├── index.html
│   │   └── vite.config.ts
│   ├── package.json        # pnpm workspaces ルート + deploy スクリプト
│   └── pnpm-workspace.yaml
├── infra/                  # OpenTofu (Lambda + 関数 URL + IAM)
│   ├── main.tf
│   ├── variables.tf
│   ├── outputs.tf
│   ├── providers.tf
│   └── versions.tf
└── devbox.json             # 開発環境 (Node.js + pnpm + OpenTofu)

工夫

良かった点

制約

兎にも角にも、429 との戦い。Reserved Concurrency 増やせばいいことではある。