#firebase (3)
問題
GCP の App Engine を停止(disable)すると、それに紐づくデフォルト Firestore データベース (default) も一緒に無効化される。これは GCP の仕様。
原因
デフォルト Firestore データベースは歴史的に App Engine と紐づけられている設計のため、App Engine のライフサイクルと連動している。
対処法
Firestore を生かしたままにしたい場合:
- App Engine を再有効化する必要がある
- トラフィックを止めたいだけなら、DNS を別のサービスに向けて App Engine にアクセスが来ないようにする(停止ではなく放置)
重要: トラフィック遮断と リソース無効化を混同しないこと。DNS 切り替えで十分な場合がほとんど。
背景
Enterprise フレームワークからエッジコンピューティングへの移行時、既存の Firebase Cloud Functions の必要性を再評価。
発見
Firebase Cloud Functions で実装していた sendMail の実体は単なる Slack Incoming Webhook への POST。
// Firebase Cloud Functions の実体
export const sendMail = httpsCallable(async (data) => {
return fetch('https://hooks.slack.com/services/...', {
method: 'POST',
body: JSON.stringify({ text: message })
});
});
問題点
- GCP インスタンス起動、スケーリング、ホスト、監視の複雑さ
- コールドスタート遅延
- 固定コスト(Active プロジェクト課金)
- 学習コスト・運用オーバーヘッド
解決策
エッジ関数(CF Pages Functions)で同じ処理を 1 行で実装。
// CF Pages Functions (functions/contact.ts)
export const onRequest: PagesFunction = async (context) => {
const { name, email, message } = await context.request.json();
await fetch('https://hooks.slack.com/services/...', {
method: 'POST',
body: JSON.stringify({ text: `${name}: ${message}` })
});
return new Response('OK');
};
学び
インフラの複雑さは必要性から逆算すべき。 単純な webhook 処理には GCP VM より CF Functions の方が適切。デプロイも自動。
移行メリット
- デプロイが簡単(
functions/に置くだけ) - コールドスタートなし
- 従量課金(Free 10万req/日)
- 監視・スケーリング不要
概要
Firebase Cloud Functions のシークレット(API キー、Webhook URL など)は Google Cloud Secret Manager で一元管理する。
登録方法
# シークレットを登録
firebase functions:secrets:set SECRET_NAME
# ユーザー入力を促される(パスト可能)
# または CI/CD で:
firebase functions:secrets:set SECRET_NAME --data "secret-value"
関数での使用
// functions/src/index.ts
import * as functions from 'firebase-functions/v2';
export const sendMail = functions.https.onCall(
{
secrets: ['SLACK_WEBHOOK_URL', 'SENDGRID_API_KEY']
},
async (request, context) => {
const webhookUrl = process.env.SLACK_WEBHOOK_URL;
const apiKey = process.env.SENDGRID_API_KEY;
// 処理...
}
);
取得方法
デプロイ後、シークレット値を確認する場合:
firebase functions:secrets:access SECRET_NAME
ベストプラクティス
- secrets 配列に列挙する → 必要な値のみロード、セキュリティ向上
- Git リポジトリにはコミットしない → Secret Manager で一元管理
- 環境別に別々のシークレット → dev / prod で切り分け
注意
Astro + CF Functions へ移行する場合は wrangler secrets に移行する。