LLM の実行基盤を Vercel AI Gateway から AWS Bedrock(日本国内リージョン) へ移行し、観測は Langfuse Cloud で継続する。併せて、トピック分析 worker の実行基盤を Google Cloud Run Job から AWS ECS Fargate + EventBridge Scheduler へ移す。
PR #26 (VercelOidcStack)で Vercel → Bedrock の IAM ロールは用意済みだが、アプリ側は 1 行も Bedrock を向いていない 。本 Epic はそのアプリ側移行と、それに伴うインフラ・観測・運用の変更を扱う。
前提
本サービスはローンチ前であり、Bedrock 移行の完了後に稼働を開始する。 稼働中のトラフィックも利用者データも無い。したがって本 Epic では次の方針を取る。
Vercel AI Gateway との併存や段階移行は行わない。 アプリ全体を1プロバイダに固定する段階移行フラグ(LLM_PROVIDER 等)は設けず、一気に置き換えて AI_GATEWAY_API_KEY を撤去する。
移行前後の性能・品質の比較は行わない。 【検証】構造化出力15箇所の Bedrock 適合性検証とクォータ確認 #47 の検証は Bedrock 単独での絶対水準の合否判定として実施し、合格ラインを測定前に決める。結果はローンチ可否の判断材料になる。
後方互換の維持もデータ移行も不要。 全環境が新規構築であり、旧形式のモデルIDが DB に入っていることはない(interview_config.chat_model は DEFAULT NULL で seed も設定していない)。
決定済みの方針
論点
決定
リージョン
日本国内限定 (単一リージョンである必要はない)。Claude は jp. CRIS(東京+大阪)、gpt-oss は東京 In-Region。global.* は IAM で明示 Deny
モデル
Claude Sonnet 4.6 / Claude Haiku 4.5 / gpt-oss-120b。Nova は採用しない (Pro は東京未提供、Lite は max output 5K + 構造化出力非対応)
プロバイダ
本番は Bedrock 固定。テスト環境では OpenAI / Gemini 直も許可(許可リストで制御)
web_search
廃止 (Bedrock 経由の Claude は非対応)
worker 実行基盤
EventBridge Scheduler + ECS Fargate (確定。Vercel Cron は採用しない。理由は下記 ADR コメント参照)
Guardrail
適用する。streamProcessingMode は sync / async を環境変数で切替可能 にする(既定 sync)。実測してから運用で判断する
コスト検証
推定値のみになるため、AWS Cost Explorer の実請求額との月次突合 を運用に入れる
GCP
実装は残置(切り戻し用)。Cloud Scheduler は移行完了後に停止
方針の背景・代替案・トレードオフは本 Issue のコメントに ADR ドラフトとして記載 している。実装着手前に ADR を確定させる。
子Issue
フェーズ0: 前処理(他Issueの対象範囲を減らす)
フェーズ1: Bedrock 基盤
フェーズ2: 実行基盤の AWS 化
フェーズ3: 品質・運用
依存関係と進め方
#51 ─┐
#41 ─┼─→ #45 ─→ #42 ─→ #43 ─→ #47
#44 ─┘ │
└─→ #46
#48 ─→ #49
#43 ─→ #50
最優先で着手すべきもの
#49 はセキュリティ改善として独立した価値がある。 現状 admin は 長期の GCP サービスアカウント鍵(GCP_SA_KEY、JSON 丸ごと)を Vercel の環境変数に保持 している。ECS 移行によりこれを完全に廃止し、PR #26 の OIDC ロールに一本化できる。
ローンチ前に確認すること
Cloud Scheduler(毎朝 6:00 JST の --mode=analyze-all)と EventBridge Scheduler のどちらか一方だけが有効な状態にする。 現行の Cloud Scheduler は infra/cloud-run/provision.sh が作成しており、SCHEDULER_PAUSED=1 で停止できる。どの環境で有効になっているかを #48 の着手時に確認し、ローンチ前に片方に寄せる。
前提となる運用作業(コード外)
関連
LLM の実行基盤を Vercel AI Gateway から AWS Bedrock(日本国内リージョン) へ移行し、観測は Langfuse Cloud で継続する。併せて、トピック分析 worker の実行基盤を Google Cloud Run Job から AWS ECS Fargate + EventBridge Scheduler へ移す。
PR #26(
VercelOidcStack)で Vercel → Bedrock の IAM ロールは用意済みだが、アプリ側は 1 行も Bedrock を向いていない。本 Epic はそのアプリ側移行と、それに伴うインフラ・観測・運用の変更を扱う。前提
本サービスはローンチ前であり、Bedrock 移行の完了後に稼働を開始する。 稼働中のトラフィックも利用者データも無い。したがって本 Epic では次の方針を取る。
LLM_PROVIDER等)は設けず、一気に置き換えてAI_GATEWAY_API_KEYを撤去する。OPENAI_API_KEY/GOOGLE_GENERATIVE_AI_API_KEYが新たに必要になる(【基盤】AI SDK に provider registry を導入し、論理モデルID+プロバイダ許可リストで本番を Bedrock 固定にする #42)。AI_ALLOWED_PROVIDERS(許可リスト)が担う。本番はbedrockのみ、テスト環境はbedrock,openai,google。interview_config.chat_modelはDEFAULT NULLで seed も設定していない)。決定済みの方針
jp.CRIS(東京+大阪)、gpt-oss は東京 In-Region。global.*は IAM で明示 DenystreamProcessingModeはsync/asyncを環境変数で切替可能にする(既定sync)。実測してから運用で判断する方針の背景・代替案・トレードオフは本 Issue のコメントに ADR ドラフトとして記載している。実装着手前に ADR を確定させる。
子Issue
フェーズ0: 前処理(他Issueの対象範囲を減らす)
フェーズ1: Bedrock 基盤
フェーズ2: 実行基盤の AWS 化
フェーズ3: 品質・運用
依存関係と進め方
forceFlush()を呼んでいないためストリーミングのトレースを取りこぼしている可能性があり、この状態で Bedrock を調査すると「Bedrock が失敗した」のか「トレースが記録されなかっただけ」なのかを切り分けられない。Bedrock と独立していて小さいので先に片付ける。jp.に対応していないと 【基盤】AI SDK に provider registry を導入し、論理モデルID+プロバイダ許可リストで本番を Bedrock 固定にする #42 の疎通確認ができない(現状arn:aws:bedrock:ap-northeast-1::foundation-model/*のみで、大阪の foundation-model が許可されていない)。最優先で着手すべきもの
#49 はセキュリティ改善として独立した価値がある。 現状 admin は 長期の GCP サービスアカウント鍵(
GCP_SA_KEY、JSON 丸ごと)を Vercel の環境変数に保持している。ECS 移行によりこれを完全に廃止し、PR #26 の OIDC ロールに一本化できる。ローンチ前に確認すること
Cloud Scheduler(毎朝 6:00 JST の
--mode=analyze-all)と EventBridge Scheduler のどちらか一方だけが有効な状態にする。 現行の Cloud Scheduler はinfra/cloud-run/provision.shが作成しており、SCHEDULER_PAUSED=1で停止できる。どの環境で有効になっているかを #48 の着手時に確認し、ローンチ前に片方に寄せる。前提となる運用作業(コード外)
AWS_REGION=ap-northeast-1(Vercel が自動上書きするため明示必須)、AWS_ROLE_ARNAI_ALLOWED_PROVIDERS=bedrockAI_ALLOWED_PROVIDERS=bedrock,openai,google+OPENAI_API_KEY+GOOGLE_GENERATIVE_AI_API_KEYsts.amazonaws.comを Audiences に追加)関連
docs/20260609_1200_トピック分析CloudRun実行基盤設計.mddocs/20260809_1026_AWS_Bedrock_CDK基盤_運用開始までの作業手順.mddocs/20251007_2159_Langfuse導入設計.md