「Crieit Advent Calendar 2018」の記事です。2018年は、業務で「Firebase Realtime Database」を使った1年でした。
https://firebase.google.com/docs/database/?hl=ja
Realtime Databaseは、 数ミリ秒で各クライアントへデータを同期 します。はじめて使ったときは、とても感動しました。開発したシステムでは、リアルタイムのデータ表示が必要な、特定機能に限定してRealtime Databaseを投入しています。
色々と工夫した点がありますので、今回はその辺りの知見を共有します。
「Firebase Realtime Database」は、データベースとして単体で使うわけではなく、 PostgreSQLと併用して運用 しています。
それには、いくつかの理由があります。
棲み分けとしては、リアルタイム表示が必要なデータをRealtime Databaseに投入し、それ以外はRDB(PostgreSQL)に保存しています。
また、Firebase Console上の誤操作で、データを上書きしたり消失できてしまう可能性があります。そこで、復旧スクリプトも用意しました。
具体的には、PostgreSQLにあるマスターデータを元にして、API経由でデータを再セットするスクリプトです。ただ、一度も出番はなかったです。
また、PostgreSQLを併用しているもうひとつの理由に、セキュアなデータを置きたくなかった点があります。
後述するセキュリティルールを工夫すれば対策も可能ですが、保険をかけて、セキュアなデータはサーバーサイドのRDBに暗号化して保存してします。
セキュリティルールは、基本的に以下の設定で運用しています。私の場合、 書き込みは許可せず運用する ことにしました。
また、リアルタイムのデータ表示に必要な特定のテーブルに絞って、読み込みを開放しています。
{
"rules": {
".read": false,
".write": false,
"sampletable": {
".read": "auth != null",
".write": false
}
}
}
書き込みを拒否した理由は、主に以下の3点です。
なお、書き込みを許可しなかったとしても、 Admin用のライブラリを使えば書き込みは可能 です。PHPには公式のAdmin SDKがなかったので、OSSを利用しました。
GitHub - kreait/firebase-php: Unofficial Firebase Admin SDK for PHP
読み込み側の権限は「auth != null」にしています。念のため、Firebase Authenticationの匿名認証を挟んで運用している形です。
Firebaseのプロジェクトを開設すると、 GCP(Google Cloud Platform)のConsoleでもアクセスできる ようになります。この点はかなり重要です。
私が技術書典4で頒布した「Realtime Database x React本」でも、注意事項を書いてます。抜粋して掲載します。
「APIとサービス」の認証情報を確認すると、Firebaseが自動で作成したキーがあることが分かります。そして、APIキーにおける警告マークは、APIキーが無制限であることを示しています。実運用で使用される場合は、設定は必須であると言えます。開発段階でも、可能な限り制限を設定することが望ましいでしょう。
WEBサービスであればリファラで、モバイルアプリであればバンドルIDなどでAPIキーを制限するのが基本形です。これを設定しておかないと、 Firebase用のアクセスAPIキーが無制限状態で運用 されてしまいます。
少し内容が古くなってしまいましたが、技術書典4で頒布した本にもFirebaseの概要を書いてます。無料でダウンロードできます。
Firebase Realtime Database と React.js で始めるリアルタイム アプリケーション入門 - このすみ堂 - BOOTH
私がプロジェクトで採用した構成は、 「PHPカンファレンス2017のメルカリチャンネル」 をベースにしています。
PHPカンファレンス2017でFirebase Realtime Databaseについて登壇してきました #phpcon2017 | メルカリエンジニアリング
会場でメルカリの@sota1235さんに質問して、 「半年ほど運用しているが、一度もダウンしたことはない」 という返答をもらったのが、採用の決め手になりました。
メルカリチャンネルにおけるRealtime Databaseの知見は、他の記事でも共有されています。ぜひ参考にしましょう!
メルカリチャンネルにおけるFirebaseの利用例 | メルカリエンジニアリング
Realtime Databaseの対抗馬として、Cloud Firestoreがあります。
Firestore | Firebase
個人的には、以下のような印象を持っています。
Cloud Firestoreの特徴である 「クエリ処理の機能性、効率性、柔軟性」 は、とても魅力的です。
リアルタイムのデータ表示が必要な、特定機能に限定してRealtime Databaseを投入しました。感触はとても良いです。
また、オフライン対応があるのも魅力的です。もしデータ同期に失敗しても、クライアントがオンラインになったら、自動的に同期を再開します。これを自前のWebSocketで実装するとしたら、相応の苦労が必要なことは間違いありません。
巨人の肩の上にのることのメリットを、改めて実感した1年でした。
Crieitは誰でも投稿できるサービスです。 是非記事の投稿をお願いします。どんな軽い内容でも投稿できます。
また、「こんな記事が読みたいけど見つからない!」という方は是非記事投稿リクエストボードへ!
こじんまりと作業ログやメモ、進捗を書き残しておきたい方はボード機能をご利用ください。
ボードとは?
コメント