Cloud 上に Web アプリ、Web サービス を デプロイ する際に、 AWS, Azure, GCP といった各種 クラウドサービス が選択肢に挙がってきます。今回はその中でも、 Google が提供している 以下のサービス について 比較 しながら 整理 していきます。
- Firebase / Cloud Functions for Firebase
- GCP / Cloud Functions
- GCP / Cloud Run
- GCP / App Engine
Google が提供するサービスには 「いわゆる Google Cloud Platform (GCP) 」だけでなく「 モバイル 向けのソリューションでもある Firebase 」 も含まれています。 Firebase は別会社で開発されていたサービスを Google が買収して自社サービスに取り入れた経緯もあることから、少し GCP と Firebase の棲み分けが分かりづらい部分もあります。今回は、 GCP, Firebase の差分を整理しつつ、それぞれの サービスの違い などを見ていきます。
GCP, Firebase の関係
Firebase now integrates with various other Google services, including Google Cloud Platform, AdMob, and Google Ads to offer broader products and scale for developers.
https://en.wikipedia.org/wiki/Firebase
GCP と Firebase の関係ですが、公式ドキュメントなどを眺めていてもどうも腑に落ちる表現をしているものが少ないと感じてしまいます。個人的には「 Google が提供する Cloud Platform には 2つあり、 1つは モバイルアプリ開発に特化した Firebase であり、もう1つは汎用的な Google Cloud Platform である」 という理解をしています。実際、GCP に限らず、AWS や Azure などでも、プロジェクトという単位で物事を進めていきますが、 GCP のプロジェクトと Firebase のプロジェクトは 相互に連携し、データベースなどを共有化できるものの、プロジェクトそのものは別で作成する必要があります。
Firebase 公式サイトにも「併用すれば、さらに効果的」という文言とともに、以下のような図が紹介されています。
引用元: https://firebase.google.com/firebase-and-gcp
それでは、各サービスの詳細を見る前に、今回取り上げる各サービスについてざっくり比較するところから始めていきます。
Firebase と GCP の各種サービス ざっくり比較
Google Cloud Tech の YouTube チャネルに、関連の高い動画( Choosing the right compute option in GCP: a decision tree )がありましたので、この内容を基にざっくり下表にまとめてみました。 (動画内の登場順に上から記載しています)
サービスオプション | 概要 |
---|---|
Firebase | 「デバイス間同期」「デバイスへの通知」といったモバイル開発向けの機能が備わっている。「データベース」や「ストレージ」、「アプリ実行環境」に加え「ホスティング環境」といった環境が一式揃っている。各種ライブラリはあらかじめ提供されているものだけが利用可能。 |
GCP / Cloud Functions | プログラムソースコードをデプロイするだけで稼働可能。加えて、イベント・ドリブンでのアプリ実行が可能。各種ライブラリはあらかじめ提供されているものだけが利用可能。 |
GCP / App Engine | 仮想マシン実行環境。複雑なアプリ実行や、古いレガシーコードを稼働させることが可能となるなど、最もカスタマイズ性が高い。 |
GCP / Cloud Run | コンテナでの実行環境で、最も新しいサービス。自前のライブラリを用いることができるなど、 Cloud Function よりもカスタマイズ性が高い |
これらのサービスはいずれも、いわゆる サーバーレス・コンピューティング の Platform となり、サーバーそのものの管理を低い管理コストで Web アプリ / Web サービス を稼働させることが可能になります。使用可能な言語や、各種ライブラリといったカスタマイズ性が低いほど、インフラ関連の管理コストは低くなる傾向となります。下図でいう、右に行くほど管理コストは低くなる傾向になります。
引用元: https://youtu.be/2tLXKCgqwLY?t=26 (赤字は当ブログにて加筆。以降同様)
なお、 GCP の YouTube 動画をベースに整理したため、 GCP については細かくサービス別に説明されていますが、 Firebase については、Firebase そのものの説明になっています。以降では、粒度を揃える意味で Cloud Functions for Firebase として扱っていきます。
それでは、それぞれのサービス毎に少し掘り下げていきます。サーバレス・コンピューティングの流れがわかるように、カスタマイズ性が低い方から順に整理していきます。
Firebase / Cloud Functions for Firebase
概要・特徴
Firebase は 2011年9月にサービススタートし、 Platform for creating Mobile and Web と位置づけられています。Cloud Functions for Firebase は JavaScript または TypeScript コードで開発することができ、イベント・ドリブンでの実行が可能な サーバーレス 環境です。
特徴として、モバイル開発用の SDK と ウェブ SDK が提供されている点が挙げられます。特に モバイル SDK を用いることで、 モバイルアプリ のプログラムコードから関数を呼び出す様にして、 Fireabase にアクセスすることが可能になります。
参考 (GitHub) : Firebase SDK for Cloud Functions
また、「アプリ用ストレージ」「デバイスへの通知」「デバイス間同期」といったモバイルアプリ固有の機能を利用することができます。
料金プラン
料金プランとしては、Cloud Functions for Firebase 単体ではなく Firebase 全体として設定されています。以下の 2種類 が用意されています。
- Spark プラン (無料)
- Blaze プラン (従量制)
詳細は、 Firebase Pricing を確認するようにしてください。
メリット
- Serverless 環境のため、インフラやミドルの管理をする必要がない
- iOS, Android 開発用の SDK が提供されている
- イベント・ドリブンでのプログラム実行が可能 ( API として動作させる等 )
- JDK のインストールが必要になるが、 ローカルでの統合的なテスト環境 ( Firebase Emulator Suite ) が提供されている
- デプロイ 先として Firebase Hosting が提供されている
デメリット
- 開発言語は JavaScript, TypeScript のみ
- リソースに関する制限あり
用途
モバイル向けのみならず、 Serverless 環境を構築しようと思った際には、ファーストチョイスとして考えたいサービスです。関連の高い動画( Choosing the right compute option in GCP: a decision tree )では、以下のようなものが Firebase 向きであると紹介されています。
- iOS アプリや Android アプリ
- アプリケーションでのロジックが少ない、単純なバックエンドサービス等
- HTML, CSS, JS といった 静的ファイルのみで構成されているアプリケーション
なお、名称からも分かる通り、 後述する GCP の Cloud Functions の Firebase 版でもあります。大きな差分としては SDK の利用可否と、 開発可能な言語の選択肢の幅です。Firebase では JavaScript, TypeScript のみですが、 GCP ではそれに加え、 Python, Java, Go が利用可能になっています。 一方で、リソースに関する上限が設定されていますので、ある程度の規模のアプリケーションなどでは、 GCP の Cloud Functions や App Engine が選択肢になってきます。
Cloud Functions における GCP と Firebase の差分については こちらの記事 も参考にしてください。
GCP / Cloud Functions
概要・特徴
2017年10月にサービススタートした Cloud Functions は “Functions as a Service (FaaS)” と位置づけられています。
Cloud Functions for Firebase と同等の機能を有していますが、主に以下のような差分があります。
- 対応する開発言語が多い ( JavaScript, TypeScript に加え Python, Java, Go )
- モバイル SDK が存在しない。
Cloud Functions における GCP と Firebase の差分については こちらの記事 も参考にしてください。
料金プラン
料金は、主に以下を基にした、従量課金制になっています。
- 呼び出し回数
- 実行時間
- メモリ割り当て量 (デプロイ時にメモリ量を選択する)
後発のサービスということもあり、この手の料金プランとしては比較的シンプルな体系になっている印象です。呼出し回数に関しては、最初の 200 万回については無料になっているようです。
詳細は Pricing | Cloud Functions を確認するようにしてください。
メリット
- Serverless 環境のため、インフラやミドルの管理をする必要がない
- Cloud Functions for Firebase に比べ Python など対応言語が多い
- イベント・ドリブンでのプログラム実行が可能 ( API として動作させる等 )
- 負荷に応じた、自動スケーリング
デメリット
- モバイル SDK が提供されていない
- 自前のライブラリを用いることができない
用途
Cloud Functions for Firebase で不足している以下が必要な場合は GCP の Cloud Functions が選択肢になってきます。
- Python, Go, Java といった開発言語
- 柔軟なリソーススケーリング
一方で、モバイル SDK が提供されていないのは モバイルアプリ開発としては見逃せない点です。更に、自前のライブラリを用いることができないので、例えば Vue.js において Vue CLI をそのままデプロイすることができないなど、用途を選ぶ部分があります。
なお、後者についてのソリューションが、 Cloud Run ということになります。
GCP / App Engine
概要・特徴
2009年4月にサービススタートした App Engine は “fully managed serverless platform” と位置づけられています。
Node.js、Java、Ruby、C#、Go、Python、PHP でアプリケーションを構築でき、独自の言語ランタイムを使用することも可能です。
https://cloud.google.com/appengine#section-2
上述の通り、幅広い言語でアプリケーションを稼働させることができ、プリセットされたライブラリ以外に独自のランタイムも利用可能になります。インフラストラクチャは フルマネージド で管理されます。
料金プラン
料金プランとしては、以下の 2つの環境 別に設定されています。スタンダード環境には、無料枠が付随し、更に選択したインスタンス毎に時間単価が異なってきます。
- スタンダード環境 (インスタンス毎の料金設定)
- フレキシブル環境
詳細については Pricing | App Engine を確認するようにしてください。
メリット
- Serverless 環境のため、インフラやミドルの管理をする必要がない
- 一般的な開発言語を広くカバーしている
デメリット
- スタンダード環境 or フレキシブル環境 を最初に選択する必要があり、それぞれ「できること」「できないこと」が異なるため学習コストが高め
- インスタンスクラス(サーバリソース量)毎に料金設定が異なるので、適切なものを選択する必要がある
用途
App Engine は、Serverless Computing 環境でありながら、一般的な開発言語を広くカバーしていることが一番大きな特徴といえます。既存のレガシーコードを移植する場合などでは、重宝するはずです。ただし、関連の高い動画( Choosing the right compute option in GCP: a decision tree )で紹介されているように、まずは Firebase, Cloud Functions で検討し、うまく合致しない場合に App Engine を用いるというのがよさそうです。
GCP / Cloud Run
概要・特徴
2019年9月にサービススタートした Cloud Run は “managed compute platform” と位置づけられています。2021年時点で最も後発のサービスということになります。
Kubernates によるコンテナ技術を使っていることもあり、 Docker イメージとしてアプリケーションをデプロイするかたちになります。ですので、 アプリケーションの Docker イメージが手元にあれば、即デプロイすることができるということになります。
なお、同様の Kubernates サービスである Google Kubernates Engine とは、以下のような差分があります。
- クラスタ構成
- モニタリング
ざっくり言ってしまえば、 Kubernates の機能をフルで活用するのが Kubernates Engine で、可能な限り削ぎ落としたものが Cloud Run という棲み分けということになりそうです。
Kubernates Engine と Cloud Run の使い分けについては、以下の GCP 公式 ブログ を確認してください。
料金プラン
料金は、主に以下の使用量を基にした、従量課金制になっています。
- CPU
- メモリ
- リクエスト
- ネットワーキング
それぞれのリソースに対して、無料枠が設定されているようです。
詳細は Pricing | Cloud Run を確認するようにしてください。
メリット
- Serverless 環境のため、インフラやミドルの管理をする必要がない
- 特に制限なく、様々な言語でコードを作成可能 ( Ruby, Node.js も可能 )
デメリット
- Docker イメージを作成する必要がある
- クラスタ構成が組めない等 Kubernates の機能は限定される
用途
Ruby や Node.js で作成したアプリをデプロイしようとする場合には、 Cloud Run が最適になります。ただし、Kubernates の機能は限定されていますので、大規模なアプリの場合は、開発用等に用途を限定し、本番用途には Serverless Computing サービスではなくなってしまいますが、 Kubernates Engine や Compute Engine を検討するのがよさそうです。
まとめ
最初に App Engine が登場してから 10 年ほどで それぞれの弱点を補うように、 4 つの Serverless Computing サービスが提供されるようになりました。”Functions”, “Run” などの名称からでは見えてきづらいサービス毎の違いを整理してきました。最後にそれぞれ1行でまとめてみます。
- モバイルアプリ開発なら、Firebase
- Python, Java, Go で開発するなら、 Cloud Functions
- Node.js, Ruby, C#, PHP で開発するなら、App Engine
- Docker イメージでデプロイするなら、 Cloud Run
Serverless Computing サービス 比較一覧表
対応言語 | 開発者で用意 | リソース | 備考 | |
---|---|---|---|---|
Firebase / Cloud Function for Firebase | JS, TS のみ | ソースコード | 可変 *上限あり | – イベント・ドリブン – モバイルアプリ用 SDK あり |
GCP / Cloud Functions | JS, TS, Python, Java, Go | ソースコード | 可変 | – イベント・ドリブン |
GCP / App Engine | Node.js, Python, Java, Ruby, C#, Go, PHP | ソースコード, 自前ライブラリ | 固定 or 可変 | |
GCP / Cloud Run | 特に制限なし | Docker イメージ | 固定 | – Docker イメージでデプロイ |
補足: Cloud Run と Cloud Functions の違い (任意のツール、 システム ライブラリ の使用)
上述の表に加え、 サービス 選定において重要な差分となる本件について少し補足します。
Cloud Run は、アプリケーションからの任意のツールまたはシステム ライブラリの使用もサポートします。Cloud Functions は、カスタム実行可能ファイルを使用できません。
https://cloud.google.com/blog/ja/topics/developers-practitioners/cloud-run-story-serverless-containers
システム パッケージのチュートリアルを使用する に詳細説明がありますが、 以下の graphviz の例のように、 apt-get で install するような ツール, ライブラリ が必要な場合は Cloud Functions では対応できないため、 Cloud Run を用いることになります。
RUN apt-get update -y && apt-get install -y \ graphviz \ && apt-get clean