第20章:総合演習:ON/OFFで挙動差を観察して、運用手順まで完成🏁👀
この最終章は、“守りを入れたらアプリが動かなくなった😇” を わざと起こして、ちゃんと復旧できるようになる回です💪🔥 最後に 運用手順書(チェックリスト) まで作って、もう迷子にならない状態にします🧭✨
この章のゴール🎯✨
- App Check OFF / ON(強制)/ Debug を切り替えて、挙動差を説明できる🙂
- Firestore / Storage / Functions / AI Logic の全部で、守りが効いているのを確認できる🛡️
- 事故らないための 運用手順書(10〜15項目) が完成している🧾✅
- AI(Antigravity / Gemini CLI / Firebase Studio / Gemini in Firebase)を使って、実装・レビュー・運用文書づくりまで加速できる🚀🤖
まず読む📚(超重要ポイントだけ)
1) “クライアントに入れただけ”では、基本まだ死なない🙂
Web で App Check を初期化すると、リクエストにトークンが付き始めます。でも Firebase 側で enforcement(強制)をONにするまでは、基本「必須」にはならない です。つまり、最初は「メトリクス観察」から入れるのが安全👌 (※ドキュメントにも「強制をONにするまで必須にならない」流れが明記されています)(Firebase)
2) 自動更新は “明示ON” が前提✅
Web の initializeAppCheck は、isTokenAutoRefreshEnabled: true を自分で入れるのが基本です。入れないと更新されません😇(Firebase)
3) ローカルは Debug Provider が命綱🧪
Debug token を Firebase Console に登録(safelist)しておくと、ローカルでも強制ON環境を通せます。 ただし このトークンは超危険(漏れたら守りが崩れる)ので、扱いはパスワード級に🔐(Firebase)
4) Functions は enforceAppCheck が直球の守り☎️
Callable Functions は enforceAppCheck: true で「トークン無い/無効なら拒否」にできます。さらに リプレイ対策(beta) として consumeAppCheckToken: true もあります(Node のみ)♻️🚫(Firebase)
5) AI Logic は “早めに App Check が強く推奨”🤖🧿
Firebase AI Logic は App Check 連携で AI API を守るゲートウェイになっていて、enforcement をONにすると未検証は拒否されます。早期導入が強く推奨されています🛡️(Firebase) さらに AI はコスト事故しやすいので、per-user rate limit も必ず見る! デフォルトは 100 RPM と高めなので、必要に応じて下げるの推奨です💸(Firebase)
手を動かす🛠️(“ON/OFFで壊す→直す”をやる)
Step 0:切り替えスイッチを作る🎛️(これが最終章の核)

「本番」「ローカル」「わざとOFFで壊す」を コード1箇所で切り替え できるようにします。
例:src/services/firebase.ts に集約📦
-
VITE_APPCHECK_MODEを使ってoff(App Check 初期化しない=壊す用💥)recaptcha(本番想定🧿)debug(ローカル救済🧪) を切り替えます。
import { initializeApp } from "firebase/app";
import {
initializeAppCheck,
ReCaptchaV3Provider,
} from "firebase/app-check";
const firebaseConfig = {
// あなたの設定
};
export const app = initializeApp(firebaseConfig);
export function initAppCheck() {
const mode = import.meta.env.VITE_APPCHECK_MODE as
| "off"
| "recaptcha"
| "debug"
| undefined;
if (mode === "off") {
// わざと壊す(強制ON時に落ちるのを確認する用)
return;
}
if (mode === "debug") {
// Debug Provider(このブラウザ・この端末に token を保存するモード)
// 別ブラウザ/別PCで使う場合は true ではなく token 文字列を入れる(後述)
(self as any).FIREBASE_APPCHECK_DEBUG_TOKEN = true;
}
if (mode === "recaptcha") {
const siteKey = import.meta.env.VITE_RECAPTCHA_V3_SITE_KEY as string;
initializeAppCheck(app, {
provider: new ReCaptchaV3Provider(siteKey),
isTokenAutoRefreshEnabled: true,
});
return;
}
// debug のとき:provider を渡さなくても debug token が使われる想定で初期化
initializeAppCheck(app, {
isTokenAutoRefreshEnabled: true,
});
}
ポイント👀
initializeAppCheckのisTokenAutoRefreshEnabled: trueは必須寄り✅(Firebase)- Debug token を “別ブラウザ/別PC” で使うなら、
trueではなく token文字列を直接セットします🧪(Firebase)
Step 1:Debug token を登録して「ローカル救済ルート」を作る🧪🔐

- ローカルで
VITE_APPCHECK_MODE=debugで起動 - コンソールに AppCheck debug token が出る
- Firebase Console → App Check → Manage debug tokens で登録(safelist)
- 以後そのブラウザでは通る✅
- 漏れたら即 revoke(取り消し)!🚨(Firebase)
Step 2:Functions を“確実に落ちる場所”として用意する☎️💥

最終章は、落ち方が分かりやすい Callable Function を1個置くのが最高です😆
Functions(Node/TS)側:App Check 強制 ON
import { onCall, HttpsError } from "firebase-functions/v2/https";
import { logger } from "firebase-functions";
export const adminOnlyCleanup = onCall(
{
enforceAppCheck: true, // App Check 無い/無効なら拒否🧿
// 超重要な処理なら replay 対策(beta / Nodeのみ)も検討👇
// consumeAppCheckToken: true,
},
async (request) => {
logger.info("called", { app: request.app });
// ここでは例として簡単に
if (!request.auth) {
throw new HttpsError("unauthenticated", "ログインしてね🙂");
}
return { ok: true };
}
);
enforceAppCheck: trueは公式のやり方そのままです✅(Firebase)consumeAppCheckToken: trueは リプレイ対策(beta)。ネットワーク往復が増えて遅くなるので「本当に重要なAPIだけ」に絞るのが普通です♻️🚫(Firebase)
Step 3:AI Logic の “コスト事故防止” を仕上げる🤖💸

AI は「守れないと破産する」タイプなので、最後にここを締めます😇
✅ App Check(AI Logic)
AI Logic は App Check 連携で AI API を守れます。enforcement をONにすると未検証は拒否、という筋がはっきり書かれています🛡️(Firebase)
✅ per-user rate limit(AI Logic)
- Firebase AI Logic API の “per-user” レート制限は デフォルト 100 RPM(高い)
- 実アプリに合わせて下げるのが推奨です💡(Firebase)
- しかも 2026-02-05 更新のページに、モデルや制限の変更・注意が載っています(例:Gemini 2.0 Flash / Flash-Lite が 2026-03-31 で retired など)ので、運用手順書にも「定期点検」を入れておくのが安全です📅(Firebase)
Step 4:いよいよ “強制ON” を段階的にやる🎛️🧿
ここからは 必ず「メトリクス見ながら」。 しきい値を上げる時は「一時的に unenforce して影響を避けつつ監視」みたいな注意も公式にあります⚠️(Firebase)
おすすめ順番(事故りにくい)👇
- Functions(上で作った Callable が分かりやすい)
- AI Logic(コスト守り)
- Firestore
- Storage(アップロードは事故りやすいので最後寄り)
ここが本番:テストシナリオ表(3モード×4サービス)👀✅

あなたは今から、同じ操作を 3つのモード で試します。
モードA:off(わざと壊す💥)
- 期待:強制ONしているサービスが落ちる
- 目的:「守りが効いてる」証明
モードB:recaptcha(正規ルート🧿)
- 期待:全部動く
- 目的:本番の正常系
モードC:debug(ローカル救済🧪)
- 期待:ローカルでも動く
- 目的:開発で詰まらない
チェック対象👇
- Firestore:メモ作成/更新📝
- Storage:画像アップロード📷
- Functions:Callable 実行☎️
- AI Logic:整形ボタン実行🤖
失敗時UXを“最終版”にする🙂🧯
強制ONでありがちな事故はこれ👇
- ユーザー側:「何も起きない…壊れた?」😇
- 開発側:「ログどこ…」😇
最低限これを入れると、運用が一気に楽になります✨
-
App Check っぽい拒否のとき:
- 「再読み込み」ボタン🔁
- 「時間を置いて再試行」🕒
- 「サポート導線」📩
-
画面には “技術用語を出さない” 🙅(ユーザーは App Check を知らない)
(強制ONで未検証が拒否されるのは前提なので、UXが無いと辛い…という話は Functions の enforcement の文脈でも自然に繋がります)(Firebase)
最終成果物:運用手順書(Runbook)テンプレ🧾✅

この章のゴールはここです。これがある人が勝ちます🏆✨
✅ 運用チェックリスト(例:12項目)
- App Check のメトリクスで「未検証率」を確認👀(Firebase)
- 強制ONする対象(Firestore/Storage/Functions/AI)を明文化📝
- ローカル用 Debug token が safelist 済みか確認🔐(Firebase)
- Debug token の漏えい対策(gitに入れない/共有禁止)✅(Firebase)
VITE_APPCHECK_MODEの切り替え手順(off/debug/recaptcha)を1行で書く🎛️- Functions は
enforceAppCheckを入れて deploy 済みか確認☎️(Firebase) - (重要APIのみ)リプレイ対策
consumeAppCheckTokenを使うか判断♻️(Firebase) - AI Logic の per-user rate limit を見直し(デフォ 100 RPM から調整)💸(Firebase)
- AI のモデル変更/retired 情報の点検日を入れる📅(例:2026-03-31 retired 注意)(Firebase)
- 失敗時UX(再試行/導線)が入っている🙂
- ロールバック手順(unenforce に戻す場所/手順)を明記🧯(Firebase)
- リリース後30分はメトリクス監視(増加があれば即対応)📈(Firebase)
AIで“最終章”を爆速に仕上げる🚀🤖

Antigravity:ミッション化して、抜け漏れ0へ🧩
Antigravity は Mission Control で、エージェントが 計画→実装→検証→Web調査 までやる思想の開発プラットフォームです(Windows でもOK)🚀(Google Codelabs) 👉 ここでは「Runbookを作る」「切替スイッチを導入」「E2E観点チェック」みたいにミッション化すると強いです💪
Gemini CLI:リポジトリ全体レビュー係にする🔎
Gemini CLI はターミナルで使える オープンソースAIエージェント。ReAct ループでツールも使いながら進めます🧠⚙️(Google Cloud Documentation) 公式ブログでも「リサーチやタスク管理にも使える」系で紹介されています🧰(Google Cloud)
Gemini CLI に頼むなら、こういう依頼が刺さります👇
- 「App Check 初期化漏れ箇所を探して」
- 「直Firestore/直Storageアクセスを一覧化して」
- 「強制ON時に落ちる導線と、UX不足箇所を指摘して」
Firebase Studio:環境の再現性を“最終形”に🧪
Firebase Studio は workspace を Nix で定義でき、.idx/dev.nix にツール類も書けます🧰
「この章の演習環境」を丸ごと再現しやすいのが強みです✨(Firebase)
ミニ課題🎒✨(これで卒業🎓)
- あなたのアプリの Runbook を 12〜15項目 に増やして完成させる🧾✅
off / recaptcha / debugの3モードで、4サービス全部の結果をスクショ or メモで残す📸📝- “事故った時の戻し方” を 30秒で実行できる手順 にする🧯
チェック✅(ここが言えたら勝ち🏆)
- 「App Check を入れた=即ブロック」ではなく、enforcement がスイッチだと説明できる🙂(Firebase)
- ローカルは Debug token safelist で救える🧪(Firebase)
- Functions は
enforceAppCheck、重要ならconsumeAppCheckTokenも検討できる☎️♻️(Firebase) - AI Logic は App Check+rate limit(デフォ 100RPM)で “破産を防ぐ” 発想になっている💸(Firebase)
ここまでできたら、もう「守りを入れたら怖い😱」じゃなくて、 「守りを入れても 運用でコントロールできる😎」になります🎉🧿✨