【GCPマン向けのFirebase 入門】Firebase/ Google Cloudの七不思議

# はじめに
この記事は[SB-AI Advent Calendar 2019](https://adventar.org/calendars/4324)の19日目です。某社で問題解決型(読み：なんでもやる)エンジニアをしていて、泥臭いデータ前処理からMLモデルの実装、デプロイまでやっています。TDD信者で、バイブルは[Clean Code] (https://www.amazon.co.jp/Clean-Code-%E3%82%A2%E3%82%B8%E3%83%A3%E3%82%A4%E3%83%AB%E3%82%BD%E3%83%95%E3%83%88%E3%82%A6%E3%82%A7%E3%82%A2%E9%81%94%E4%BA%BA%E3%81%AE%E6%8A%80-Robert-C-Martin/dp/4048930591)とか[The Phoenix Project （邦題：The DevOps 逆転だ!）](https://www.amazon.co.jp/DevOps-%E9%80%86%E8%BB%A2%E3%81%A0-%E3%82%B8%E3%83%BC%E3%83%B3%E3%83%BB%E3%82%AD%E3%83%A0/dp/4822285359)とかです。

# Firebase/ Google Cloudの七不思議
FirebaseとGCPは仕事で大変お世話になっており、そのおかげで暗黒のオンプレ運用とは無縁な生活を送れ、開発に集中できています。**あいにく、お二人は仲が悪いというか、いまいち友達以上恋人未満の関係でいます**。けれども、独立して開発しつつ、Firestore (DB)やFirebase Extensionsなど、両方の強みを生かしたプロダクトも最近見られるようになりました。この不思議でしょうがない関係を自分なりにまとめ、その変化を追ってみたいと思います。

また、Web/アプリ開発者ではない限り、mBaaS (mobile Backend as a Service)として知られている[Firebase](https://www.firebase.com)に触れる機会は少ないかな？と思い、布教のためにも記事を執筆したいと思いました。Firebaseはいいぞ。

今から、七不思議を順に説明していきます。

## 1. FirebaseとGoogle Cloudは、別会社
Firebaseは元々別会社で、2014年にGoogleに買収されたサービスです。まあ、Keyhole(現Google Maps)やUrchin(現Google Analytics)をはじめ、Googleが買収したサービスは多数あるので、驚くことはないでしょう。

ドメインこそ `firebase.google.com` となっていますが、現在の運営母体は `Firebase Inc.`であり、GoogleやGoogle Cloud (`cloud.google.com`) と厳密には異なります。開発チームがそれぞれ違うのも納得しますね。


## 2. Google Cloud NextでFirebaseの話は一切出ない

1の表れとして、Google Cloudの一大イベントとして、Google Cloud Nextというのがありますが、3日間でFirebaseの話は一切されませんでした。2019年にSFで[100以上の発表があった](https://cloud.google.com/blog/ja/products/gcp/100-plus-announcements-from-google-cloud-next19-2019-04)ようですが、検索したところFirebaseは一件もヒットしませんでした。(間違っていたら教えてください。) 

同じくクラウド系のグループ会社なのに、もう少し交流があってもいいかなとも思うのですが...、分野やターゲット層が違うということでしょうか。[Google I/O](https://events.google.com/io/)ならちゃんとGCPもFirebaseも出ています。

一方、Firebaseの本命は[Firebase Summit](https://firebase.google.com/summit)というお祭りです。しかもSFではなく毎年ヨーロッパのどこかで1日間のみ(2019年はマドリッド)開催されます。今年発表されたFirestore Extensionsについては後述します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/343755/f4d31b15-ba3c-fb2a-4224-08285e792bdf.png)
(Firebase Summit 2019の風景。[公式ページ](https://firebase.google.com/summit)より)


ちなみに、[Google Cloud Certified Professional Cloud Architect](https://cloud.google.com/certification/cloud-architect?hl=ja) というGCPの資格を持っていて、GCP周りのサービスは一通り知っているつもりですが、びっくりするぐらいFirebaseのことは試験でスルーされました。本当に、同じGoogle Cloudファミリーでしょうか...


## 3. 料金体系も別だが、課金すればFirebaseとGCP両方利用できる
FirebaseにはSpark Plan (無料), Flame Plan (定額), Blaze Plan(従量課金)の3つのプランがあります。無料のSparkでも、サービスごとに無料枠があり、小さいアプリであればそれで事足りることもあるでしょう。Hostingだって無料でできます。しかし、Google Cloudより安い代わりに、Sparkだと機能が一部制限されてしまいます。
<img width="792" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/343755/282ed170-d4bd-5fba-6bb4-b4dd4b0db3c0.png">
(スクリーンショットはFirebaseコンソールより。詳しくは[公式ページ](https://firebase.google.com/pricing?hl=ja)まで)

GCPはStorage, Compute, App Engineと様々なサービスがあり、料金体系はどちらかというとBlaze Plan (従量課金)に近いかと思います。ちなみにFirebaseのBlaze Planだと、billing/IAMはGCPと一緒になり、GCPのコンソールで管理されます。

## 4. Cloud FunctionsはGCP版とFirebase版あり
みんな大好きなサーバレス。しかし、**GCPのノリでFirebaseでCloud Functionsを使ってはいけません**。基本Cloud ○○のサービスはGCP系ですが、Firebase向けのCloud Functions (Cloud Functions for Firebase)というものもあります。ややこしいのは、GCP版のCloud FunctionsでもFirebaseのdatabaseなどに対して操作できたりしますが、自由度が減ることです。

[公式ドキュメンテーション](https://cloud.google.com/functions/docs/concepts/functions-and-firebase?hl=ja)もありますが、結構分かりにくいので以下の簡単な比較表が参考になればと思います。

|                  | Cloud Functions (GCP)                                                                                                                                                            | Cloud Functions for Firebase                                                                                                                                                                     |
|------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| ユースケース     | GCPメインで使っている人、アプリ開発よくわからん人                                                                                                                                 | Firebaseメインで使っている人、アプリ開発やっている人[^1] 、お金かけたくない人 |
| CLI              | `gcloud functions deploy`                                                                                                                                                        | `firebase deploy --only functions`                                                                                                                                                               |
| UIからのデプロイ | 可                                                                                                                                                                               | 不可                                                                                                                                                                                             |
| 管理画面         | GCP -> Cloud Functions                                                                                                                                                           | Firebase -> Functions                                                                                                                                                                            |
| トリガー         |  - 【ベータ版】Cloud Firestore, Firebase Analytics, Firebase Auth, Firebase Realtime Database, Firebase Remote Config - その他GCPサービス: HTTP, Cloud Pub/Sub, Cloud Storage... | Cloud Firestore, Firebase Analytics, Firebase Auth, Firebase Realtime Database, Firebase Remote Configなど全サポート                                                                             |
| ランタイム       | Node.js, Python, Go                                                                                                                                               | Node.js のみ                                                                                                                                                                              |

Cloud Functions for FirebaseはFirebase内のサービスを最大に制御できる代わりに、Node.jsでしか書けないので要注意です。(Node.jsで書くのが王道だとは思っていますが、GCPのCloud FunctionsならGo/Pythonで書けちゃいます。）

[^1]: ユーザが登録されたらメールを送るようにするなど、Firebase Cloud Messaging (FCM)との組み合わせが可能になり、めっちゃ便利
参考資料
- [Google Cloud Platformのドキュメンテーション] (https://cloud.google.com/functions/docs/writing/)
- [Firebaseのドキュメンテーション] (https://firebase.google.com/docs/functions/manage-functions)

## 5. Cloud FirestoreはGCPとFirebaseのマリアージュ
前述したように、基本Cloud ○○のサービスはGCP系ですが、**Cloud FirestoreにはCloudもFireもあって、GCPとFirebaseの子供のようなものです。**

GCPには元々Cloud Datastore[^2]、Firebaseには元々Realtime Databaseという、それぞれのNoSQLデータベースが存在しましたが、端的にいうとCloud FirestoreはRealtime DatabaseとCloud Datastoreの進化形です。

> Cloud Firestore は、Cloud Datastore のリブランディングとなる次期メジャー バージョンです。Cloud Datastore と Firebase Realtime Database を最大限に活用し、自動スケーリングと高パフォーマンスを実現し、アプリケーション開発をより快適にするように構築された NoSQL ドキュメント データベースです。
([GCPドキュメント](https://cloud.google.com/datastore/docs/firestore-or-datastore)より)

FirebaseとGCPの古いバージョンのDBがまだサポートされていますが、新たにプロジェクトを作成する場合、Firebaseでは[Cloud Firestoreの利用が推奨されます](https://firebase.google.com/docs/database/rtdb-vs-firestore)[^3]。GCPの方では、サーバープロジェクトの場合はDatastore modeを、モバイルアプリやウェブアプリはNative mode (要は普通のFirestore)を、という位置付けをしています。


[^2]: GCPでは他にSpanner, BigTable, BigQueryなどがありますが、ここでは割愛します。

[^3]: 余談ですが、Cloud Functions for Firebaseを書くとき、Realtime DBのメソッドとFirestoreのメソッドは非常に似ていながらも異なる箇所が多いので、Firestore向けにコードを適宜修正する必要があります。(つらい


## 6. GCPのAPIをワンクリックで使えちゃうFirebase Extensions
5の**Cloud Firestoreはスターウォーズでいうとカイロ・レンのような強者ですが、今年のFirebase Summitで発表された[Firebase Extensions](https://firebase.google.com/products/extensions)はライトセーバーのようなものです。** 現在ベータ版ですが、正しく使っていくとめちゃくちゃ強い。

Firebase Extensionsのおかげで、アプリでよく使われる機能をワンクリックでデプロイできてしまいます。具体的には、イメージのresizeとか文書の翻訳とかです。中身はCloud Functions for Firebaseだと思います。

詳しくはこちらのQiita記事をご覧ください。[Firebase Extensionsをサクッと試してみた　〜Firebase Extensions機能一覧、Translate Textの使い方〜](https://qiita.com/ryo2132/items/5e102136a1d7ad5d5e43)

個人的には翻訳のextension(要はGCPのTranslation API)しか試せていないですが、10秒ぐらいで設定できました。トリガーにwildcardの設定を可能にするとか、さらなる機能向上を期待していますが、**アプリ開発者がアプリのコアに集中できるようにsnippets/モジュールの形で機能面でサポートしていくビジョンには大変共感しました。** 


## 7. FirebaseのML KitはGCPのAI/MLなんとかサービスと別
sb-ai部のAdvent Calendarなので、AIの話も少しします。

GCPといえば、現AI Platform (旧ML Engine)やAutoMLが有名でしょう。ここでは詳しく紹介しませんが、Jupyter Notebookを立ち上げてトレーニングジョブを走らせたり、MLモデルのエンドポイントを作ったりすることができます。

バカでかい(読み：強力な)100層もあるMLモデルをどうやって、レイテンシーを低く保ちながらデプロイするのは非常に難しい問題です。ML Kitのおかげで我々エンジニアは早く家に帰れます。

### ML Kit for Firebaseで楽々オンデバイスMLを
[ML Kit](https://firebase.google.com/docs/ml-kit) は現在ベータ版ですが、**これはガチモデルをゼロから作るためのものよりも、あくまでモバイル（Android/ iOS)でMLモデルをデプロイするためのSDKです。**デフォルトで、学習済みモデルのGoogleのモデルで顔検出とかテキスト認識、翻訳ができてしまいます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/343755/49630757-218a-aeb9-fbdc-bf0982730192.png)
([ML Kit公式ページ](https://firebase.google.com/docs/ml-kit) より)

まあ、ここまでだと単にモバイルでGoogleのAPIをラップして使いやすくした感じで、あんまり感動しないかもしれませんが、**ML Kitを用いた[カスタムモデルのデプロイ](https://firebase.google.com/docs/ml-kit/use-custom-models)が圧倒的に強い**です。まだベータ版なので色々安定しませんが、TensorFlowで作成したモデルをTensorFlow Liteに変換した上で、ML Kitを使えばオンデバイスでの推論が可能になるわけです。Onlineモデルとofflineモデル両方提供するのですが、onlineモデルであればFirebase側で簡単に更新できます。

実装の詳細に関しては、Cookpadの@farmanlabさんの資料（[『MLKitでカスタムモデルを使う』](https://speakerdeck.com/farmanlab/mlkitdekasutamumoderuwoshi-u-1)）がオススメです。(気持ちを代弁してくださってありがとうございます...!) 決して使いやすいものではまだないのですが、非常にポテンシャルを感じさせるサービスです。

iOSでも[Core ML](https://developer.apple.com/documentation/coreml)などがありますが、iOS限定でAndroidだと使えないので、platform-agnosticなML Kitには負けるかと思っています。

### AutoMLも今後Firebaseでできてしまう
研究ではAutoML(自動機械学習)は最近ホットな分野であり、Googleに限った話ではないのですが、Googleの学習済みモデル(Vision / Video Intelligence / Natural Language / Translation / Tables)を手軽にカスタマイズできるのが魅力的です。

GCPのCloud AutoMLを知らない人は、以下のコピペした文章を読んでみてください。
> AutoML を利用すると、機械学習の専門知識が限られていても、ビジネスニーズに合った高品質のモデルをトレーニングできます。 Cloud AutoML は、Google の最先端の転移学習とニューラル アーキテクチャ検索テクノロジーを活用するプロダクトです。
([Cloud AutoML公式ページ](https://cloud.google.com/automl/)より)

AI/MLの民主化そのものです。

Firebaseでも、今年[ML Kit for Firebase AutoML Vision Edge](https://firebase.google.com/docs/ml-kit/automl-image-labeling?hl=JA) (スタバのドリンク名と同じぐらい長い..)が発表され、画像分類のモデルをエッジ x AutoMLでカスタマイズできるようになりました。まだ試したことはないのですが、今後はVisionだけでなくNLP系も追加されるのではないかと期待しております。

# 最後に

記事を書いているうちに、Googleのエコシステムがあらゆる場面に浸透していること (omni-presence) を改めて実感させられました。

モバイル(Firebaseを始め、Android / Pixel / Play Store)やクラウドだけでなく、ウェブ (Chrome)、オフィス (G Suite)、広告 (Analytics / Ads)、日常生活 (Maps, Calendar, Google Assistant)と、**onlineからofflineまでGoogleです。** その裏にある要素技術 (TensorFlow, Kubernetes,...)もまた、Googleです。さらにいうと、自動車向けの[Android Auto](https://www.android.com/auto/)や携帯電話の通信プランを提供する[Google Fi](https://fi.google.com/about/)があるように、それらをベースに様々な業界に進出してきています。

今まで疎結合だったFirebaseとGoogle Cloudも、今後のGoogle Worldの実現に向けて、どんどん手を組んでいきGoogleのサービス展開を手助けするのではないでしょうか。

(それは望ましい世界かどうか、というのは別の議論です。今度機会があれば、AI Ethicsについて書きます！)


ぜひFirebaseを使ってみてください！