Cloud Service
Firebase Cloud Messaging (FCM)
アプリへのプッシュ通知をサーバーや自前のソケット管理なしで送れるフルマネージドな配信基盤。Android・iOS・Web へ同一 API で届く FCM。AWS の Amazon SNS モバイルプッシュや Pinpoint に相当。
- 1.Android・iOS・Web へプッシュ通知を無料で送れるフルマネージド配信基盤。
- 2.宛先はトークン単位・トピック購読・条件式で指定し、同報も可能。
- 3.通知メッセージとデータメッセージがあり、確実な配信は前提にせず冪等に設計する。
解決する課題
モバイルやウェブのアプリへプッシュ通知を届けたいとき、各プラットフォームの配信網(Android の通知系・Apple の APNs・ブラウザの Web Push)を個別に実装し、常時接続や再送、デバイス管理まで自前で抱えるのは大きな負担です。FCM はこれらを 1 本の API の裏側に隠し、通知の送信だけに集中できるようにします。
- 端末ごとに異なる通知経路(Android/iOS/Web)を1 つの送信 APIでまとめたい
- サーバーと端末の常時接続やソケットの維持を自前で持ちたくない
- 1 通を多数のユーザーへ同報したい(お知らせ・速報・キャンペーンなど)
- 「スポーツの特定チームを購読した人だけ」のように興味ごとに配信したい
- アプリが裏で動いていない(バックグラウンド)ときでも通知を出したい
対応する AWS のサービスは Amazon SNS のモバイルプッシュや Amazon Pinpoint です。FCM は Firebase の一機能ですが、Google Cloud 上のバックエンドからサーバー側 API(HTTP v1)で送信するのが一般的な使い方です。
主要概念と用語
- 登録トークン(Registration Token): アプリのインスタンス(端末+アプリの組)を一意に表す宛先 ID。クライアント SDK が取得し、自前のサーバーへ保存して送信先に使う。再インストールや更新で変わり得るため失効管理が要る
- 通知メッセージ(Notification message): タイトルや本文を含み、アプリがバックグラウンドのとき OS が自動で通知を表示する形式
- データメッセージ(Data message): 任意のキーと値だけを運ぶ形式。表示はアプリのコードが自分で制御する。通知とデータを併用することもできる
- トピック(Topic): 「news」「team-abc」のような購読チャネル。クライアントが購読すると、そのトピック宛ての 1 通が購読者全員へファンアウトされる
- 条件(Condition): 複数トピックを論理式で組み合わせた宛先指定(例: トピック A を購読しトピック B は購読していない人)
- デバイスグループ: 同一ユーザーの複数端末をまとめて 1 宛先として扱う仕組み
- APNs: Apple のプッシュ通知サービス。FCM は iOS 配信時に内部で APNs を利用するため、Apple の証明書または認証キーの設定が必要
- HTTP v1 API: 現行のサーバー送信 API。OAuth2 のアクセストークンで認証する。古いレガシー API は非推奨
仕様・制限・クォータ
- 配信はベストエフォート。確実な到達や順序は保証されないため、重要な処理は通知の到達に依存させず、アプリ起動時に正の情報源(自前 API)と同期する設計にする
- データメッセージのペイロードは小さい(おおむね数 KB 程度の上限)。大きなデータは本体に載せず、ID だけ送ってアプリ側で取得する
- **TTL(Time To Live)を指定でき、端末がオフラインの間は保持し、期限切れで破棄される。長期オフライン端末向けの折りたたみ(collapse key)**で古い通知を新しい通知へ置き換えられる
- トピック購読の反映には遅延が生じ得る。購読直後の即時配信は前提にしない
- iOS 配信には APNs の認証情報(認証キーまたは証明書)が必須。設定不備は iOS だけ届かない典型原因
- **高優先度(high priority)**メッセージは即時配信を狙うが、端末の省電力制御(Doze など)の影響を受けることがある
- 具体的なペイロード上限・レート・スループットの数値は変動するため、本番設計では公式ドキュメントで最新値を確認すること
登録トークンは再インストール・データ消去・期限経過などで失効・変化します。送信時に無効トークンのエラーが返ったら、自前のデータベースから該当トークンを削除して送信先を最新に保ってください。古いトークンへ送り続けると無駄な失敗が積み上がります。
内部の仕組み
クライアントの SDK が起動時に FCM へ登録して登録トークンを取得し、それを自前のサーバーへ送って保存します。送信側はそのトークン(またはトピック・条件)を宛先に指定して FCM の HTTP v1 API を呼び、FCM が各プラットフォームの配信網へ橋渡しします。
- アプリが SDK で FCM に登録し、登録トークンを取得してサーバーへ預ける
- サーバーが宛先(トークン/トピック/条件)と内容を指定してFCM へ送信
- FCM が宛先に応じて配信先を解決し、Android はインターネット経由の接続、iOS は APNs 経由、Web は Web Push 経由で端末へ届ける
- 端末がオフラインならTTL の範囲で保持し、再接続時に配信(期限切れは破棄)
- アプリが通知メッセージなら OS が表示、データメッセージなら自前コードが処理する
トピック宛ての送信は、FCM 側がそのトピックの購読者リストへファンアウトするため、送信側は 1 回呼ぶだけで多数の端末へ届けられます。
バックグラウンドでも確実に表示したい告知は通知メッセージ、アプリ独自の画面更新や同期を促したいならデータメッセージが向きます。表示も挙動も細かく制御したい場合は、通知とデータを併用して送る選択肢もあります。
設計パターン / ベストプラクティス
- トークンは自前サーバーで一元管理: 取得・更新・失効を記録し、無効トークンは送信エラーを機に削除して常に最新に保つ
- 同報はトピックで: 「全ユーザー」「特定カテゴリ」などはトピック購読にし、個別トークンの大量ループ送信を避ける
- 通知は引き金、真実はサーバー: 通知の到達を業務処理の正にしない。端末側はアプリ起動時に自前 API と同期し、取りこぼしを吸収する
- ペイロードは軽く: 本文を詰め込まず ID や種別だけ送り、詳細はアプリが API で取得する
- TTL と折りたたみキーを設定: 鮮度が大事な通知は短い TTL と collapse key で、古い通知を新しい通知へ置き換える
- プラットフォーム別の上書き: 共通本文に加え、Android/iOS(APNs)/Web ごとの細かな表示設定を必要な分だけ個別指定する
- 送信側はサービスアカウントで認証: HTTP v1 API は OAuth2 トークンで呼ぶ。鍵のハードコードを避ける
運用・監視
- Firebase コンソールの配信レポートで、送信数・受信(到達)・表示・開封などの傾向を確認できる
- 送信 API のレスポンスを必ず確認し、無効トークンや APNs 設定エラーなどの失敗を分類して対処する
- iOS が届かないときは、まず APNs 認証情報(認証キー/証明書)の有効期限と設定を疑う(最頻出の原因)
- 大量同報時のスループットを監視し、必要ならトピック配信へ寄せて個別送信の失敗・遅延を減らす
- TTL の効きすぎ・効かなさ(届かない/古い通知が残る)を、collapse key と TTL の設定で調整する
- BigQuery への配信データのエクスポートを有効化すると、配信ログを詳細に分析できる
コスト
FCM のメッセージ送信自体は無料で利用できるのが大きな特徴です。Android・iOS・Web へのプッシュ通知の配信に対して、通常は FCM 側の従量課金は発生しません。一方で、周辺サービスを使う部分にはコストが生じます。
| コスト要素 | 課金の考え方 | 節約・注意点 |
|---|---|---|
| プッシュ通知の送信 | FCM の送信は無料 | 通知配信のために FCM 直接の課金は基本なし |
| 配信ログのエクスポート | BigQuery など連携先の料金 | 保持期間と分析範囲を絞る |
| 送信元バックエンド | 実行基盤(Cloud Run 等)の料金 | 送信処理をまとめて呼び出し回数を抑える |
| SMS やメール等の別チャネル | FCM 外の各サービス料金 | プッシュで足りる通知はプッシュに寄せる |
FCM の送信は無料でも、配信ログを BigQuery に流して分析したり、送信元のバックエンドを動かす計算リソースには費用がかかります。料金体系は変わり得るため、設計時は公式の料金ページで最新を確認してください。
セキュリティ
- 送信は信頼できるサーバーから: HTTP v1 API はサービスアカウントの OAuth2 トークンで認証する。クライアントに送信用の権限を持たせない
- 登録トークンを秘密として扱う: トークンは宛先 ID であり、漏えいすると第三者が通知を送れる恐れがある。安全な経路でサーバーへ送り、保護して保管する
- ペイロードに機密を載せない: 通知本文やデータに個人情報や秘密を含めず、ID だけ送って詳細は認証付き API で取得する
- iOS の認証情報を保護: APNs 認証キー/証明書を安全に管理し、期限切れを監視して更新する
- 最小権限: 送信に使うサービスアカウントには必要な権限のみ付与し、鍵をコードへ埋め込まない
通知のペイロードにパスワードや個人情報などの機密を直接入れて送るのは危険です。プッシュは経路上で各プラットフォームを経由し、端末のロック画面にも表示され得ます。本文には識別子や種別だけを載せ、実データは認証済みの API 経由で取得してください。
関連サービス・比較
関連が深いのは、Google Cloud のメッセージング基盤である Pub/Sub です。両者は名前が似ていますが対象が異なり、Pub/Sub はサーバー間(バックエンド同士)の非同期連携、FCM はサーバーからエンドユーザーの端末への通知に向きます。
| 観点 | FCM | Pub/Sub |
|---|---|---|
| 主な宛先 | エンドユーザーの端末アプリ | バックエンドのサービス |
| 用途 | プッシュ通知の配信 | サービス間の非同期連携 |
| 宛先指定 | トークン・トピック・条件 | トピックとサブスクリプション |
| 配信保証 | ベストエフォート | 少なくとも1回(冪等前提) |
| 対応プラットフォーム | Android・iOS・Web | サーバー・各種クライアントライブラリ |
| 料金 | 送信は無料 | スループット量に応じた従量 |
Pub/Sub はバックエンド同士をつなぐ非同期基盤、FCM はエンドユーザーの端末へ通知を届ける配信基盤です。両者を組み合わせ、内部イベントを Pub/Sub で処理し、最終的なユーザー通知だけを FCM で送る、という構成もよく取られます。
ハンズオン / CLI例
FCM の送信は通常 HTTP v1 API(サービスアカウント認証)で行います。下記は、送信に使うサービスアカウントを用意し、必要な API を有効化するまでの gcloud 例です。
# プロジェクトで Firebase Cloud Messaging API を有効化
gcloud services enable fcm.googleapis.com --project=my-project
# 送信用のサービスアカウントを作成
gcloud iam service-accounts create fcm-sender \
--display-name="FCM message sender" \
--project=my-project
# メッセージ送信に必要なロールを付与(最小権限の例)
gcloud projects add-iam-policy-binding my-project \
--member="serviceAccount:fcm-sender@my-project.iam.gserviceaccount.com" \
--role="roles/firebasecloudmessaging.admin"
# サーバーが OAuth2 トークン取得に使う鍵を発行(安全に保管すること)
gcloud iam service-accounts keys create fcm-sender-key.json \
--iam-account=fcm-sender@my-project.iam.gserviceaccount.com
Google Cloud Service
Firebase Cloud Messaging (FCM)を実務で読む
TL;DRは入口です。実際に選ぶ・使う段階では、何を解決するか、何と比較するか、導入後にどこで詰まるかまで見る必要があります。
解決すること
エンドユーザー / VDI
比較で見る軸
クラウド: Google Cloud / カテゴリ: エンドユーザー / VDI / 難易度: basic
導入後に効く点
宛先はトークン単位・トピック購読・条件式で指定し、同報も可能。
先に潰すリスク
サービス単体ではなく、権限、ネットワーク、監視、課金、バックアップを含めて設計する必要がある。
- クラウド
- Google Cloud
- カテゴリ
- エンドユーザー / VDI
- 難易度
- basic
- 関連資格
- —
- 設計柱
- operational / cost / reliability
判断チェックリスト
- 自社の用途が「エンドユーザー / VDI / operational」に近いか確認する。
- 強みである「Android・iOS・Web へプッシュ通知を無料で送れるフルマネージド配信基盤。」が本当に評価軸になるか確認する。
- 注意点の「サービス単体ではなく、権限、ネットワーク、監視、課金、バックアップを含めて設計する必要がある。」を運用で吸収できるか確認する。
- 公開値や仕様値は、対象プラン・対象機種・対象リージョンまで確認する。
- 既存システム、ID、ネットワーク、監視、バックアップとの接続方法を先に洗い出す。
- 小さく試してから、本番移行、権限設計、障害時手順、コスト監視を決める。