v1
PoC / 開発計画

インフラ構成(AWS 統一案)

実査機能 新基盤のインフラ構成の AWS 統一案。コンピュート+データ永続=AWS 東京(単一クラウド・国内保管)/メディア・データ配信=LiveKit Cloud。要件(常駐最小・従量課金・国内レジデンシ・外部 SaaS 構成)は Cloudflare 軸と同一で、実現手段のみを AWS に置き換える。

1. 決定サマリ(案)

領域採用案備考
基盤コア API採用案 AWS Lambda(Node.js 22)+ API Gateway HTTP APIHono は 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 GatewayVPC 内 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 Hostinglk agent deploy。自前の Agent 基盤を持たない — 変更なし
文字起こし AI外部 Azure Speech / OpenAI Whisper / ElevenLabsStep Functions から REST 呼び出し・VTT 出力 — 変更なし
オブザーバビリティCloudWatch Logs + X-Ray(標準 OTel SDK / ADOT 使用可)+ @sentry/aws-serverlessTeam プラン外部集約先は導入しない(Cloudflare 軸と同方針)。Workers の「標準 OTel 非対応」制約が消える
IaC / デプロイ確定 Terraform(HCL)Lambda は esbuild でバンドル → zip を CI で生成し Terraform でデプロイ・terraform plan で変更プレビュー
minedia-www既存 現行インフラのまま(Rails)REST(ApiKey)で呼び出し・W1〜W6 受信。Phase 5 でレーンB改修 — 変更なし

2. 全体構成図

クリックで拡大 🔍
全体構成図(AWS 統一案・静的構造): コンポーネントと接続関係のみを示す。ブラウザ(全ロール)はルーム SPA へ HTTPS(静的アセット・CloudFront + S3)、API Gateway(HTTP API・REST 入口)へ HTTPS(REST)、LiveKit Cloud へ WebRTC / WSS で接続。AWS 東京ゾーン内に VPC があり、VPC は3つのサブネットに分かれる: プライベートサブネットに基盤コア Lambda(Hono + zod-openapi + Prisma 7・1 コードベース=API / SQS / Cron / SFn ハンドラ)、パブリックサブネットに NAT Gateway(外向き通信の出口)、別のプライベートサブネットに RDS for PostgreSQL(db.t4g.micro・非公開)。API Gateway は VPC 外から Lambda を invoke。VPC 外に SQS(W1〜W6 + DLQ)、EventBridge Scheduler、Step Functions、管理画面(Refine SPA・CloudFront + S3 + Lambda@Edge 認可)、Cognito(IdP・Hosted UI・Google SSO。管理画面との間で認証リダイレクト / JWT)、S3(東京・ゲートウェイエンドポイント接続で NAT 迂回)。API Gateway は /internal/admin ルートを JWT オーソライザー(Cognito 発行分)で検証。基盤コア Lambda から SQS / Scheduler / Step Functions へはイベント連携、RDS へは PostgreSQL(TLS・プライベート接続)、NAT Gateway 経由で LiveKit Server API / STT / Sentry へ外向き HTTPS。LiveKit Cloud から API Gateway へ HTTPS Webhook、S3(東京)へ HTTPS(S3 API・録画直書き)。minedia-www(Rails・既存)は API Gateway へ HTTPS(REST・ApiKey)で接続し、SQS + 配信 Lambda から HTTPS(Webhook・HMAC 署名)を受信、S3 へ HTTPS(presigned GET)。管理画面から API Gateway へ HTTPS(/internal/admin・OIDC)

主要フロー

  1. 入室: ブラウザ → SPA(CloudFront)→ 基盤コア(API Gateway → Lambda・参加 JWT 検証 → RoomPolicy → LiveKit トークン発行)→ LiveKit へメディア直結。映像・音声は AWS を通らない
  2. チャット/ルームイベント(サーバー権威型): 送信=ブラウザ → コア Lambda の HTTP ingest(RoomPolicy 認可 → RDS 永続化 → 宛先算出)→ RoomServiceClient.sendData → LiveKit データチャネルで配信。受信=DataReceived。クライアント直送は不可(canPublishData 全ロール false)。後入室・リロード時は履歴 API(GET /rooms/{id}/chat-messages)で補完 — Cloudflare 軸と同一
  3. 録画: LiveKit Egress → S3 東京へ直書き → webhook(API Gateway)→ Step Functions が文字起こしをステップ実行 → W6 配信
  4. W1〜W6: 基盤コア → SQS(リトライ・DLQ)→ 配信 Lambda → minedia-www へ署名付き配信
  5. DB: コア Lambda(VPC 内)→ RDS プライベートエンドポイント。同一リージョン内で RTT 最小(Smart Placement 相当の考慮が不要)
  6. 外向き通信: コア Lambda → NAT Gateway → LiveKit Server API / STT / Sentry。S3 のみゲートウェイエンドポイントで NAT を迂回(無料)
  7. 録画視聴: download-url API で presigned URL を発行し S3 から直接配信

3. 技術スタック

3-1. デプロイ単位

Workers の「1 Worker=4 ハンドラ同居」に対し、Lambda は関数単位のデプロイになる。ただしコードベースは 1 つで、API / SQS consumer / cron / Step Functions ステップの各ハンドラを Terraform が個別関数として束ねる。同じ Prisma スキーマ・RoomPolicy を共有する構造は変わらない。

単位中身備考
① 基盤コアapps/coreAPI 関数(Hono)+ SQS consumer 関数 + Scheduler 関数 + SFn ステップ関数 + 内部プロキシ /internal/admin全関数を VPC アタッチ(RDS プライベート接続)。同一コードベースから Terraform で個別デプロイ
② ルーム SPAapps/interview-roomCloudFront + S3(静的配信・OAC)UI は API と独立したデプロイ頻度。配信はエッジ最寄り
③ 管理画面apps/adminCloudFront + 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 をマウント — 変更なし
ORMprisma 7 + @prisma/adapter-pgRDS 直結(Hyperdrive 不要)。prisma migrate はマイグレーション専用 Lambda を CI から invoke(RDS 非公開のため)
JWTjoseEdDSA 署名・/.well-known/jwks.json 公開 — 変更なし
LiveKitlivekit-server-sdkNode 標準環境で動作。Workers 互換の P0 スパイクが不要になる
S3@aws-sdk/client-s3 + @aws-sdk/s3-request-presignerNode では公式 SDK が素直(aws4fetch は Workers 向けの軽量化策で不要に)
ApiKey 照合bcryptjs + node:crypto timingSafeEqualtruffle-survey-v2 と同系
バリデーションzodpackages/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/CDGitHub Actions(OIDC フェデレーション・アクセスキー非保持): typecheck / lint / test / prisma generate / esbuild → zip / migrate(専用 Lambda invoke)/ terraform planapply
ローカル開発@hono/node-server で素の Node サーバとして起動(Lambda 模倣不要・アダプタが差分吸収)
OpenAPI生成 yaml を redocly lint、UI 配信は Scalar、@stoplight/prism-cli モック(レーンB の G2 前先行着手用)— 変更なし
LintESLint(no-floating-promises 必須)+ Prettier — 変更なし

3-6. minedia-www 側(レーンB・Phase 5)

変更なし。Core::ApiClientfaraday + 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~$0W1〜W6 月数千メッセージ・パイプライン月200実行×十数ステップは無料枠内
CloudFront + S3(SPA 配信)~$2〜5ルーム SPA・管理画面の静的アセット(日本向け転送 ~$0.114/GB)
NAT Gateway~$47730h×$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~$25db.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~$26Team プラン(確定)。traces / logs は CloudWatch + X-Ray で完結し、外部集約先(Grafana Cloud 等)は導入しない
~$26CloudWatch / 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 軸)を参照してください。