インフラ構成(AWS 統一案)
実査機能 新基盤のインフラ構成の AWS 統一案。コンピュート+データ永続=AWS 東京(単一クラウド・国内保管)/メディア・データ配信=LiveKit Cloud。要件(常駐最小・従量課金・国内レジデンシ・外部 SaaS 構成)は Cloudflare 軸と同一で、実現手段のみを AWS に置き換える。
1. 決定サマリ(案)
| 領域 | 採用案 | 備考 |
|---|---|---|
| 基盤コア API | 採用案 AWS Lambda(Node.js 22)+ API Gateway HTTP API | Hono は hono/aws-lambda アダプタで稼働。API Gateway は {proxy+} 全流しでルーティングを Hono に委譲(OpenAPI 単一ソースを維持) |
| DB | 変更なし AWS RDS for PostgreSQL(db.t4g.micro・東京) | Single-AZ 常時稼働(Cloudflare 軸と共通) |
| DB 接続 | 採用案 VPC 内プライベート接続(Lambda → RDS 直結) | Hyperdrive・公開エンドポイント・SG の公開 IP レンジ許可が不要になる。接続数は予約同時実行数 + Prisma connection_limit で制御(枯渇時は RDS Proxy を後付け) |
| オブジェクトストレージ | 変更なし AWS S3(東京) | 録画・handout。VPC ゲートウェイエンドポイント経由(無料・NAT 迂回) |
| W1〜W6 配信 | 確定 SQS + DLQ + 配信 Lambda | リトライ・DLQ 組み込み |
| 録画→文字起こし | 採用案 AWS Step Functions(Standard) | redrive で失敗ステップから再開・実行履歴の可視化。長時間ステップは Fargate RunTask (.sync) へ退避可 |
| 定期実行 | 採用案 EventBridge Scheduler | リコンサイルバッチ・プレウォーム |
| チャット | 変更なし LiveKit データチャネル再利用(サーバー権威型) | 不使用 独自 WS サーバー・API Gateway WebSocket |
| ルーム SPA | 採用案 Vite + React SPA + CloudFront + S3 配信 | SSR 不要(フレームワーク構成は Cloudflare 軸と同一・配信方法のみ変更) |
| 管理画面(開発者向け) | 確定 Refine SPA + CloudFront + Lambda@Edge 認可(Cognito / OIDC) | 内部プロキシ /internal/admin 経由・ApiKey 非露出は維持。入口制御は Cognito(Hosted UI + Lambda@Edge + API Gateway JWT オーソライザー)で確定 |
| 外向き通信 | 確定 NAT Gateway | VPC 内 Lambda → LiveKit Server API / STT / Sentry の出口(マネージド NAT Gateway) |
| レート制限 / WAF | 採用案 API Gateway スロットリング(ステージ / ルート単位) | 追加費用なし。AWS WAF は HTTP API に関連付け不可(対応は REST API / ALB / CloudFront 等)。マネージドルールが必要になった場合は CloudFront を API 前段に置き WAF を付与して後付けする |
| メディア | 外部 LiveKit Cloud(SFU + Egress・Ship プラン) | 録画は video composite(合成1本)・Egress は S3 東京へ直書き — 変更なし |
| AI モデレーター | 外部 LiveKit Managed Agent Hosting | lk agent deploy。自前の Agent 基盤を持たない — 変更なし |
| 文字起こし AI | 外部 Azure Speech / OpenAI Whisper / ElevenLabs | Step Functions から REST 呼び出し・VTT 出力 — 変更なし |
| オブザーバビリティ | CloudWatch Logs + X-Ray(標準 OTel SDK / ADOT 使用可)+ @sentry/aws-serverless(Team プラン) | 外部集約先は導入しない(Cloudflare 軸と同方針)。Workers の「標準 OTel 非対応」制約が消える |
| IaC / デプロイ | 確定 Terraform(HCL) | Lambda は esbuild でバンドル → zip を CI で生成し Terraform でデプロイ・terraform plan で変更プレビュー |
| minedia-www | 既存 現行インフラのまま(Rails) | REST(ApiKey)で呼び出し・W1〜W6 受信。Phase 5 でレーンB改修 — 変更なし |
2. 全体構成図
主要フロー
- 入室: ブラウザ → SPA(CloudFront)→ 基盤コア(API Gateway → Lambda・参加 JWT 検証 → RoomPolicy → LiveKit トークン発行)→ LiveKit へメディア直結。映像・音声は AWS を通らない
- チャット/ルームイベント(サーバー権威型): 送信=ブラウザ → コア Lambda の HTTP ingest(RoomPolicy 認可 → RDS 永続化 → 宛先算出)→
RoomServiceClient.sendData→ LiveKit データチャネルで配信。受信=DataReceived。クライアント直送は不可(canPublishData全ロール false)。後入室・リロード時は履歴 API(GET /rooms/{id}/chat-messages)で補完 — Cloudflare 軸と同一 - 録画: LiveKit Egress → S3 東京へ直書き → webhook(API Gateway)→ Step Functions が文字起こしをステップ実行 → W6 配信
- W1〜W6: 基盤コア → SQS(リトライ・DLQ)→ 配信 Lambda → minedia-www へ署名付き配信
- DB: コア Lambda(VPC 内)→ RDS プライベートエンドポイント。同一リージョン内で RTT 最小(Smart Placement 相当の考慮が不要)
- 外向き通信: コア Lambda → NAT Gateway → LiveKit Server API / STT / Sentry。S3 のみゲートウェイエンドポイントで NAT を迂回(無料)
- 録画視聴:
download-urlAPI で presigned URL を発行し S3 から直接配信
3. 技術スタック
3-1. デプロイ単位
Workers の「1 Worker=4 ハンドラ同居」に対し、Lambda は関数単位のデプロイになる。ただしコードベースは 1 つで、API / SQS consumer / cron / Step Functions ステップの各ハンドラを Terraform が個別関数として束ねる。同じ Prisma スキーマ・RoomPolicy を共有する構造は変わらない。
| 単位 | 中身 | 備考 |
|---|---|---|
① 基盤コア(apps/core) | API 関数(Hono)+ SQS consumer 関数 + Scheduler 関数 + SFn ステップ関数 + 内部プロキシ /internal/admin | 全関数を VPC アタッチ(RDS プライベート接続)。同一コードベースから Terraform で個別デプロイ |
② ルーム SPA(apps/interview-room) | CloudFront + S3(静的配信・OAC) | UI は API と独立したデプロイ頻度。配信はエッジ最寄り |
③ 管理画面(apps/admin) | CloudFront + S3(Refine SPA)+ Lambda@Edge 認可 | 認可を被せる境界を公開物と分離 |
ドメインは単位ごとに割り当て(例: api.* → API Gateway、room.* → CloudFront ②、admin.* → CloudFront ③)。
Service Bindings 相当は存在しない: AWS には Worker 間直結(Service Bindings)に相当する仕組みがないため、管理画面 → コアは API Gateway の /internal/admin ルートを OIDC JWT(Cognito)検証で保護する方式を採る。入口は公開インターネット上に残るが、認可層で遮断する。完全非公開化(内部 ALB 等)は固定費が増えるため採らない。
apps/core/ ← 基盤コア
terraform/ ← インフラ定義(API Gateway / Lambda / SQS / SFn / Scheduler / VPC)
src/lambda.ts ← export const handler = handle(app)(hono/aws-lambda)
src/api/ ← Hono(@hono/zod-openapi ルート定義・ミドルウェア)
src/queue/ src/workflows/ src/cron/ src/lib/
prisma/schema.prisma
apps/interview-room/ ← ルーム SPA
apps/admin/ ← 管理画面(Refine)
packages/contracts/ ← zod スキーマ・生成 openapi.yaml・API 型(全アプリで共有)
3-2. 基盤コア(apps/core)
| 領域 | 採用 | 備考 |
|---|---|---|
| HTTP / 契約 | hono + @hono/zod-openapi + hono/aws-lambda | ルート定義=zod スキーマ=OpenAPI の単一ソース(G1 の実体)。アダプタはエントリポイント 1 ファイルの差分のみ |
| OpenAPI UI | @scalar/hono-api-reference | コアの /docs ルートに Scalar UI をマウント — 変更なし |
| ORM | prisma 7 + @prisma/adapter-pg | RDS 直結(Hyperdrive 不要)。prisma migrate はマイグレーション専用 Lambda を CI から invoke(RDS 非公開のため) |
| JWT | jose | EdDSA 署名・/.well-known/jwks.json 公開 — 変更なし |
| LiveKit | livekit-server-sdk | Node 標準環境で動作。Workers 互換の P0 スパイクが不要になる |
| S3 | @aws-sdk/client-s3 + @aws-sdk/s3-request-presigner | Node では公式 SDK が素直(aws4fetch は Workers 向けの軽量化策で不要に) |
| ApiKey 照合 | bcryptjs + node:crypto timingSafeEqual | truffle-survey-v2 と同系 |
| バリデーション | zod(packages/contracts で共有) | |
| ログ / 監視 | 構造化 console(JSON → CloudWatch Logs)、X-Ray または ADOT(OTel)、@sentry/aws-serverless | 標準 OTel SDK がそのまま動く(Workers の tracing API ベータ依存が消える) |
| テスト | vitest(素の Node 実行)、convention test | @cloudflare/vitest-pool-workers 不要。convention は truffle 移植(エンベロープ形式 / 全ルート認証必須 / ルート網羅 / no-floating-promises)— 変更なし |
3-3. ルーム SPA(apps/interview-room)
ライブラリ構成は Cloudflare 軸と同一(livekit-client / @livekit/components-react / ConnectionCheck / openapi-typescript + openapi-fetch / @tanstack/react-query / zustand / Tailwind CSS / @sentry/react)。変更は配信方法のみ(Workers Assets → CloudFront + S3・OAC)。
3-4. 管理画面(apps/admin)
Refine(React)+ Vite を CloudFront + S3 で配信し、CloudFront + Lambda@Edge(Cognito / OIDC)でゲート。データ取得は基盤コアの内部プロキシ /internal/admin 経由(OIDC JWT 検証・テナント ApiKey 非露出)。API クライアントは SPA と同じ openapi-fetch を共有 — 設計は Cloudflare 軸を維持し、ゲートの実装だけが Access → Lambda@Edge に変わる。Cognito の無料枠は直接サインインで 10,000 MAU だが、SAML / OIDC フェデレーション利用時は 50 MAU まで(Google Workspace 連携にする場合の確認ポイント。社内数名なら枠内)。
3-5. 開発ツールチェーン
| 領域 | 採用 |
|---|---|
| モノレポ | pnpm workspace(apps 3つ + packages/contracts) |
| IaC / デプロイ | Terraform(HCL)。Lambda は esbuild バンドル(ESM + minify + sourcemap)→ zip を CI で生成してデプロイ・terraform plan で変更プレビュー・dev / stg / prd は環境別ステート分割。シークレットは Secrets Manager / SSM Parameter Store |
| CI/CD | GitHub Actions(OIDC フェデレーション・アクセスキー非保持): typecheck / lint / test / prisma generate / esbuild → zip / migrate(専用 Lambda invoke)/ terraform plan → apply |
| ローカル開発 | @hono/node-server で素の Node サーバとして起動(Lambda 模倣不要・アダプタが差分吸収) |
| OpenAPI | 生成 yaml を redocly lint、UI 配信は Scalar、@stoplight/prism-cli モック(レーンB の G2 前先行着手用)— 変更なし |
| Lint | ESLint(no-floating-promises 必須)+ Prettier — 変更なし |
3-6. minedia-www 側(レーンB・Phase 5)
変更なし。Core::ApiClient(faraday + faraday-retry)・契約テスト(committee)・W1〜W6 受信(OpenSSL::HMAC 署名検証・イベント id dedup)— Cloudflare 軸 §3-6 と同一。
4. 月額コスト試算
規模前提(Medium): 月200インタビュー×60分・全件録画60分・180日保管(定常在庫 ~1.2TB)・視聴転送 ~400GB/月・AI モデレーター比率 30%。LiveKit 費は #5317 の既存試算を使用。オーダー把握用であり、規模実値の確定後に精緻化する。
AWS 各単価は東京リージョンの概算。採用判断前に AWS Pricing Calculator で再計算する。
5-1. ホスティング層(クラウド請求額)
| 項目 | 月額 | 算定前提 |
|---|---|---|
| Lambda + API Gateway | ~$1 | 動的リクエスト実勢 月5〜10万件(チャット ingest 含む)は Lambda 無料枠(1M req + 400k GB-s)にほぼ包含。API Gateway HTTP API ~$1.29/M req |
| SQS / Step Functions / EventBridge | ~$0 | W1〜W6 月数千メッセージ・パイプライン月200実行×十数ステップは無料枠内 |
| CloudFront + S3(SPA 配信) | ~$2〜5 | ルーム SPA・管理画面の静的アセット(日本向け転送 ~$0.114/GB) |
| NAT Gateway | ~$47 | 730h×$0.062 + 処理 GB。最大の固定費(マネージド NAT Gateway で確定) |
| CloudWatch Logs / X-Ray | ~$3〜5 | 取り込み $0.76/GB + 保存 $0.033/GB-月(保持期間設定で制御) |
| Secrets Manager / その他 | ~$1 | $0.40/シークレット。SSM Parameter Store(無料枠)併用で圧縮可 |
| (任意)Provisioned Concurrency | ~$3〜4 | 営業時間帯のみ 1 面ウォーム保持(0.5GB×12h×30日の確保料 x86 $3.49・arm64 $2.79。PC 有効関数は Lambda 無料枠対象外)。プレウォーム Cron で代替なら $0 |
| AWS コンピュート小計 | ~$55〜60 | |
| RDS for PostgreSQL | ~$25 | db.t4g.micro(Single-AZ)$0.025/h×730h ≈ $18 + storage gp3 50GB×$0.138 ≈ $7 — Cloudflare 軸と共通 |
| S3 保管 | ~$45 | 実測: 在庫 ~8.7TB=Glacier IR 8.6TB×$0.005 + Standard 0.1TB×$0.025(90日で Glacier IR 移行・削除なし=累積型) |
| S3 視聴転送 | ~$6 | 実測: 直近6ヶ月平均(月 0〜211GB×$0.114/GB・ピーク月 ~$24。月次変動大のバースト型) |
| ホスティング計 | ~$130〜135 |
5-2. 監視
| 項目 | 月額 | 備考 |
|---|---|---|
| Sentry | ~$26 | Team プラン(確定)。traces / logs は CloudWatch + X-Ray で完結し、外部集約先(Grafana Cloud 等)は導入しない |
| 計 | ~$26 | CloudWatch / X-Ray は 5-1 に計上済み |
5-3. 外部 SaaS(クラウド選定と独立・参考)
| 項目 | 月額 | 備考 |
|---|---|---|
| LiveKit Cloud(Ship・録画込) | ~$507(≈¥81,200) | 基本 $50 + 下り転送 (2,160GB−250GB)×$0.12 ≈ $229 + 合成録画 (12,000分−600分)×$0.02 ≈ $228。接続分 84,000 分は無料枠 150,000 分内で $0(#5317 試算)— 変更なし |
| AI(OpenAI Realtime 30% + STT) | 未定 | 現行の実利用量を調査後に反映 |
| 計 | ~$507 + AI(未定) |
5-4. 総計・感度
| 月額 | |
|---|---|
| ホスティング + 監視 | ~$156〜161 |
| 外部 SaaS 込み総計(確定分) | ~$660〜670 + AI(未定) |
本ページは実査機能 新基盤インフラの AWS 統一案(検討ドラフト)です。確定版はインフラ構成(Cloudflare 軸)を参照してください。