Firebaseをサーバーレス化–モバイルおよびWebアプリケーションを簡単に

公開: 2022-03-11

モバイルおよびWebアプリケーションには通常、バックエンドサーバーが必要です。 Webアプリケーションでは、コンテンツを配信するためにWebサーバーが必要です。 アプリケーションは、ユーザープロファイルと画像やビデオなどのメディアも保存する必要があります。 アプリケーションとサーバー間の通信は、多くの場合、API(通常はREST)を使用して行われます。

アプリケーションはさまざまな言語でコーディングされています。 iOSアプリケーションはSwiftまたはObjective-Cで書かれています。 AndroidアプリケーションはJavaまたはKotlinで記述されています。 Webアプリケーションは、HTML、CSS、JavaScript、および多くの場合、AngularやReactなどの複雑なフレームワークで記述されています。 フロントエンド開発者は、関連する言語とそれに関連する開発ツールを知っている必要があります。

バックエンドサーバーは、Go、Java、PHP、Pythonなどのさまざまな言語で記述されています。 これらの各言語には、複雑なアプリケーションの作成を容易にする独自のライブラリスイートがあります。

ほとんどの開発者は、自分自身をフロントエンドまたはバックエンドの開発者と見なしています。 両方の役割に精通しているフルスタック開発者は比較的まれです。

バックエンドサーバーの実行と保守には、独自の課題があります。 サーバーを構築、更新、およびバックアップする必要があります。 偶発的または悪意のあるデータの損失や機密データへのアクセスを防ぐために、サーバーも保護する必要があります。 さらに、サーバーに接続できるように、サーバーにはホスト名とIPアドレスを割り当てる必要があります。

Firebaseとは何ですか?

Firebaseは、Googleが買収したモバイルメッセージングアーキテクチャとして始まりました。 その後、GoogleCloudPlatformと相互運用する25を超えるコンポーネントのスイートに進化しました。

Firebaseはソフトウェア開発キット(SDK)で構成されており、モバイル開発者とWeb開発者がクラウド機能に簡単、安全、確実にアクセスできるようにします。 不十分なネットワーク接続を自動的に補正します。 コンポーネントを有効化、管理、保護するためのFirebaseWebコンソールがあります。 より詳細に使用するためのコマンドラインツールとRESTAPIもあります。

一部のFirebaseコンポーネントは、他のコンポーネントよりもよく知られています。 コンポーネント間にはほとんど依存関係がないため、機能を段階的に採用できます。 Firebaseの認証と分析が最も広く使用されています。

Firebaseは、モバイルおよびウェブのフロントエンド開発者がバックエンドサーバーを必要とせずに完全なアプリケーションを開発できるプラットフォームに進化しました。 最近の機能強化により、サーバーレスソリューションが大幅に促進され、クラウド仮想マシンサーバーソリューションに代わる、実行可能でスケーラブルで費用効果の高いソリューションが提供されます。

Firebaseの料金と請求のプラン

Sparkと呼ばれる基本的なFirebase課金プランは無料です。 クラウドリソースの使用には制限がありますが、かなり寛大です。 リーズナブルなサイズのアプリケーションを無料で実行できます。

Sparkプランでは、最大1GBのコンテンツと10GB/月未満の転送を含むWebサイトをホストできます。 Firestoreは、最大1GBのデータと最大10GB/月のネットワークトラフィックを許可します。 クラウドストレージの制限は、最大5GBのデータと最大1GB/日のダウンロードです。

アプリケーションがより多くのリソースを必要とする場合は、従量課金制などの有料課金プランが必要です。 Sparkプランの無料制限は引き続き適用されます。 請求可能な料金はかなり安いです。 価格はFirebaseの価格ページで確認できます。

クラウドで実行される仮想マシンは、使用されていない場合でも、実行中に料金が発生します。 Firebaseサーバーレスソリューションはゼロにスケーリングします。 これは、リソースが効果的に実行されているのは使用中のみであり、使用されていないときは料金が発生しないことを意味します。 これは、ホリデーレンタルなどの季節営業やコンサートなどの定期的なイベントのアプリケーションに最適です。 多くの活動があり、その後数ヶ月間活動がありません。

Firebaseを設定する方法

認証にはメールアカウントが必要です。 Googleメールアカウントをお勧めします。 それらはhttps://mail.google.comで作成できます。

Google Cloud Platform(GCP)アカウントも必要です。 無料トライアルはこちらからご利用いただけます。 これにより、1年間利用できる300ドルのクレジットが提供されます。 身分証明書としてクレジットカードが必要です。 Googleは$1を請求し、それを返金する場合があります。 請求が有効で、請求可能なリソースが使用されている場合、クレジットカードは毎月引き落とされます。 請求の仲介役を務めるGoogleプロバイダー企業もあります。 あなたはクラウドの使用に対してプロバイダーに支払います、そして彼らはグーグルに支払います。 彼らは独自の請求プランを持っており、無料トライアルを提供する場合があります。

使用状況を監視するには、クラウドコンソールの課金セクションを頻繁に監視することが重要です。 ストレージなどのリソースを不要なときにアクティブに保つのは簡単であり、時間の経過とともにかなりのコストがかかる可能性があります。

FirebaseプロジェクトはGCPプロジェクトでもあります。 GCPプロジェクトを作成してFirebaseにインポートするか、Firebaseプロジェクトを作成してGCPプロジェクトを作成することができます。 Firebaseコンソールはこちらです。

アプリケーションの種類ごとに異なる設定が必要です。 主なものはAndroid、iOS、およびWebアプリケーションです。 セットアップ手順は、公式のFirebaseガイドに記載されています。

一部の操作には、Firebaseコマンドラインインターフェース(CLI)ツールが必要です。 これらには、 Node.jsnpmツールがインストールされている必要があります。 macOSまたはLinuxで実行している場合、 npmコマンドはsudoを使用して実行する必要があります。

sudo npm install -g firebase-tools

認証と承認

Firebase認証は、おそらく最も広く使用されているFirebaseコンポーネントです。 ユーザーは、いくつかの認証メカニズムから1つ以上を選択できます。 これらは、メールアドレスとパスワード、電話番号、およびフェデレーションIDプロバイダーであるGoogle、Facebook、Twitter、およびGitHubです。 任意の数の認証メカニズムを有効にできます。

Firebase UIは、使用するメカニズムの入力をユーザーに求めます。

Firebase認証

Firebaseは、クライアント側の数行のコードから呼び出すことができる認証用のユーザーインターフェイスを提供します。 認証を手動で行うためのAPIもあります。 認証が成功すると、バックエンド検証に使用できるIDトークンが生成されます。

APIを使用すると、管理ユーザーはプログラムでユーザーを管理できます。 操作には次のものが含まれます。

  • ユーザーの作成、更新、および削除
  • メールアドレスや電話番号などの検索条件でユーザーを検索します
  • アカウント作成日時や最終ログイン日時などのアクセス情報
  • 既存のワークフローを使用せずに、電子メールアドレスと電話番号を検証します

ほとんどのモバイルおよびWebアプリケーションは、多数のユーザーがアプリケーションにサインインすることを望んでいます。 たとえば、Google Mailアカウントを持っている人は誰でも、Google認証を許可する任意のアプリケーションに対して自分自身を認証できます。 アプリケーションへのアクセスを特定のユーザーに制限するには、承認の形式が必要です。 これは、電子メールアドレスとアクセスロール間の関連付けをデータストレージに保存することで簡単に実行できます。 認証が成功すると、電子メールアドレスがデータストレージで検索されます。 ユーザーが正しい役割で存在する場合、アクセスが許可されます。 それ以外の場合、ユーザーは強制的にログアウトされます。

Firebaseホスティング

Firebaseホスティングを使用すると、JavaScriptを含む静的なウェブコンテンツを、ウェブサーバーを必要とせずにクラウドでホストできます。 コンテンツは、グローバルコンテンツ配信ネットワーク(CDN)のエッジにキャッシュされます。 これにより、世界中のどこからでもコンテンツにすばやくアクセスできます。

1つ以上のウェブサイトをFirebaseコンソールのFirebaseプロジェクトのホスティングセクションに追加することでホストできます。 コンテンツはSSLを介して配信され、[https://site-name.web.app]とhttps://site-name.firebaseapp.comの形式の2つのURLが与えられます。ここで、 site-nameはプロジェクト名またはユーザー指定のサイト名。

ドメインのDNSレコードを変更できれば、自分のドメイン名からサイトをホストするのは非常に簡単です。 ドメイン名をFirebaseConsoleのサイトに追加します。 次に、DNS TXTレコードが提供されます。このレコードをドメインのDNSに追加して、ドメインを所有していることをGoogleに証明する必要があります。 TXTレコードが表示されると、サイトのDNSAレコードを取得できます。 SSL証明書がサイトに自動的にプロビジョニングされます。 証明書がプロビジョニングされると、サイトはグローバルに利用可能になります。 原則として、DNSの更新と証明書のプロビジョニングには数時間かかる場合があります。 実際には、プロセスは20分で完了することができます。

ホスティングにコンテンツを追加するには、まず、サイトのディレクトリを作成し、コマンドラインからそのディレクトリにcdします。 次に、Firebaseにログインして、プロジェクトディレクトリを初期化します。

 firebase login firebase init

プロジェクトと必要なクライアントサービスを選択するように求められます。 サービスはいつでも後で追加でき、この段階で選択する必要はありません。

firebase.jsonというファイルを作成します。このファイルは、ウェブサイトのルートディレクトリと除外するファイルを定義します。 バージョン管理からファイルを除外するには、 .gitignoreファイルも必要です。

 { "hosting": { "public": "public", "ignore": [ "firebase.json", "**/.*", "**/node_modules/**" ] } }

次に、静的コンテンツをパブリックディレクトリにコピーします。 最後に、サイトをクラウドにデプロイします。

 firebase deploy

Webコンテンツを変更するには、コンテンツファイルを変更し、deployコマンドを発行するだけです。 各デプロイは、Firebaseコンソールにバージョンとして表示されます。 シングルクリックで以前のバージョンにロールバックできます。

Firebase Hostingは、URIをファイル、Cloud Functions、CloudRunに書き換えることもできます。 これらのサービスにドメインを割り当てる必要がないため、これにより作業が大幅に簡素化されます。 リライトは、firebase.jsonのホスティングセクションにリライトセクションを追加することで定義されます。 サービスが存在しない場合、ホスティング展開は失敗します。

 { "hosting": { "public": "public", "rewrites": [ { "source": "/xxx", "destination": "/profile.html" }, { "source": "/yyy", "function": "profile" }, { "source": "/api{,/**}", "run": { "serviceId": "cloud-api", "region": "europe-west1" } } ] } }

データストレージ

Firebaseは、クラウドベースのデータストレージにアクセスするためのクライアントAPIを提供します。 ストレージには次の3つのタイプがあります。

  • リアルタイムデータベース
  • CloudFirestore
  • クラウドストレージ

これにより、モバイルクライアントとWebクライアントは、サーバーを必要とせずにデータを保存および取得できます。

リアルタイムデータベース

Realtime Databaseは、クラウドでホストされるNoSQLデータベースです。 リアルタイムデータベースのデータは、接続されているすべてのデバイスにリアルタイムで自動的に同期されます。 Android、iOS、およびWebへのクロスプラットフォームで動作します。 データはJSONツリー構造として保存されます。 データへの読み取りおよび書き込みアクセスを制御するようにセキュリティルールを設定できます。

各デバイスは、データベースのローカルコピーを保持します。 これは、ネットワークに接続されていないときにデータが利用可能であることを意味します。 再接続時に、データのローカルコピーとクラウドベースのコピーが同期されます。

データは、リスナーを使用してアプリケーションによって読み取られます。 リスナーはJSONツリーのノードをリッスンします。 コンソール上または別のユーザーによってデータが変更されるたびに、リスナーコールバックが新しいデータ値で呼び出されます。 リアルタイムデータベースはクエリもサポートしています。 各クエリは、ノードとそのすべての子ノードを返します。

デフォルトでは、セキュリティルールはデータへのアクセスを許可していません。 ルールは、グローバルに追加することも、JSONオブジェクトの個々のノードに追加することもできます。 セキュリティルールは、データへの読み取りおよび書き込みアクセスを制御し、検証を実行できます。

Realtime Databaseは、深くネストされたデータ構造を必要としない小さなデータに最適です。 無料の制限は1GBのデータです。

CloudFirestore

Cloud Firestoreは、RealtimeDatabaseの代わりと見なされています。 リアルタイムデータベースの機能を拡張します。 データはJSONツリーではなく、ドキュメントの階層コレクションにあります。 各ドキュメントは、キーと値のペアのセットとオプションのサブドキュメントで構成されています。 クエリを使用すると、より複雑なフィルタリングと並べ替えが可能になり、完全なドキュメントのみが返されます。 クエリはサブドキュメントを返しません。

CloudFirestoreはまもなくCloudDatastoreに取って代わります。 データストアモードまたはネイティブモードで実行できます。 すべてのデータストアアプリケーションは自動的にCloudFirestoreに移行されます。

Cloud Firestoreは、比較的小さなデータに最適です。 深くネストされたデータ構造を持つことができます。 無料の制限は1GBのデータです。

クラウドストレージ

クラウドストレージは、画像やビデオクリップなどのファイルを保存するためのものです。 モバイルクライアントとウェブクライアントは、Firebaseを使用して、バックエンドサーバーを必要とせずに、クラウドとの間でファイルを直接アップロードおよびダウンロードできます。 無料の制限は5GBのデータです。

クラウド機能

Cloud Functionsは、サーバーレスアプリケーションを作成するための重要なテクノロジーです。 クラウド関数は、JavaScript、TypeScript、Python、またはGoで記述でき、Googleクラウドに直接デプロイされます。 関数は、HTTPリクエスト、またはCloudStorageへの書き込みなどのクラウド内のイベントによってトリガーされます。

クラウド関数は一度に1つのリクエストしか処理できませんが、クラウドは関数を複製することで関数を自動的にスケーリングします。 Pythonで記述されたCloudFunctionは、Flaskライブラリを使用してHTTPリクエストを処理します。 この関数は、リクエストオブジェクトをパラメータとして受け取り、レスポンスの本文を返します。

単純なPythonCloudFunctionには作業ディレクトリが必要であり、エントリポイントはファイルmain.pyにあります。

 def simple_cloud_function(request): return "It worked"

依存関係はpipによって管理され、 requirements.txtというファイルに入れられます。

 Flask==1.0.2

関数は、 gcloudコマンドラインツールを使用してデプロイされます。 関数名、言語、およびトリガーを指定します。

 gcloud functions deploy simple_cloud_function --runtime python37 \ --trigger-http

関数のURLはデプロイメント時に表示され、describeコマンドを実行することで見つけることができます。

 gcloud functions describe simple_cloud_function Url: https://europe-west1-project-id.cloudfunctions.net/simplecloud_function

Cloud Functionsは、GoogleCloudおよびFirebaseAPIを呼び出して、バックエンド機能を提供できます。 これらは、実行の開始と実行時間に関するログ情報を提供します。 追加のロギングは簡単に追加できます。 ログは、StackdriverLoggingUIおよびgcloudコマンドラインツールを介して表示できます。

 gcloud functions logs read simple_cloud_function

関数は、GoogleCloudConsoleで表示および削除できます。

Google Cloud Console:機能

Cloud Functionsは、比較的まれにしか発生しない操作に最適です。 使用例は、画像がCloudStorageにアップロードされるときにサムネイルを作成することです。 無料の制限は、1か月あたり125,000回の呼び出しです。

クラウドラン

Cloud Runは最近、サーバーレスアプリケーションを大幅に促進する機能が追加されました。 これにより、複雑なインフラストラクチャのセットアップを行うことなく、Dockerコンテナをクラウドで実行できます。 Kubernetes上に構築されたKnativeランタイムを使用するマネージドモードで実行できます。 また、Kubernetes上に構築されているAnthosで実行することもできますが、コンテナーをクラウド間で実行したり、独自のデータセンターで実行したりすることもできます。 Kubernetesクラスターはすべて自動的に実行されるため、セットアップして管理する必要はありません。

Dockerイメージに組み込むことができるすべてのアプリケーションは、CloudRunによって管理できます。 需要に基づいてコンテナの数を自動的にスケーリングします。 また、サービスが使用されていない場合はゼロにスケールダウンします。 未使用のサービスは無料です。

Dockerコンテナーは、HTTP要求に応答するために、Webサーバーを実行する必要があります。 PythonサービスはFlaskを使用します。 エントリポイントはapp.pyにあります。

 from flask import Flask, request app = Flask(__name__) @app.route('/api/profile') def profile(): page = ''' Page content ''' return page

アプリケーションには、イメージを作成するためのDockerfileが必要です。

 FROM python ENV APP_HOME /app WORKDIR $APP_HOME COPY . . ENV PORT 8080 RUN pip install Flask gunicorn firebase-admin CMD exec gunicorn --bind :$PORT --workers 1 --threads 8 app:app

Cloud Runコンテナーは、クラウドに直接デプロイされます。

 gcloud run deploy --image=image_name --platform=managed \ --region=europe-west1 --allow-unauthenticated

サービス名、プラットフォーム、リージョン、または認証されていないものを許可するかどうかがプロジェクト構成で定義されていないか、コマンドラインで指定されていない場合は、プロンプトが表示されます。 デプロイが完了すると、サービスのURLが表示されます。 URLは、gcloudコマンドを使用して取得することもできます。

 gcloud run services list SERVICE REGION URL LAST DEPLOYED BY LAST DEPLOYED AT cloud-api europe-west1 https://cloud-api-h42ifbxkyq-ew.a.run.app [email protected] 2020-02-05T10:53:30.006Z

URLには、管理が難しい乱数が含まれています。 ここで、FirebaseHostingの書き換えルールが最も役立ちます。

サービスは、GoogleCloudConsoleで表示および削除できます。

Google Cloud Console:サービス

Cloud Runは、RESTAPIのホスティングに最適です。 毎月の空き制限は、180,000 CPU秒、360,000 GB秒のメモリ、200万リクエスト、1GBのネットワーク出力です。 無料のネットワーク出力制限は、サービスが北米地域に展開されている場合にのみ適用されます。

認証

デフォルトでは、CloudFunctionsとCloudRunコンテナーはパブリックであり、インターネット上の誰でもアクセスできます。 クラウドコンソールでIAMルールを使用すると、サービスをプロジェクトメンバー、Googleグループ、および個々のメールアドレスに制限できます。

制限がある場合、不正アクセスは禁止されています。 アクセスを有効にするには、IDトークンをリクエストヘッダーに追加する必要があります。 IDトークンは、gcloudコマンドを使用するか、Firebase認証プロセス中に取得できます。

 gcloud auth print-identity-token

Authorizationヘッダーが必要です。

 Authorization: Bearer id-token

概要

Google Cloud PlatformとFirebaseは、モバイルアプリケーションとウェブアプリケーションの開発を大幅に促進するさまざまな製品を提供します。 クライアントがクラウド機能に直接アクセスできるようにするか、CloudFunctionsまたはCloudRunを使用してバックエンドコードをクラウドにデプロイすることで、バックエンドサーバーの必要性を完全に排除できます。

既存のアプリケーションは、サーバーレスに段階的に移行できます。 実際、テクノロジーの進化の仕方は、従来の仮想マシンベースのサーバーソリューションがもはや必要ないことを意味する可能性があります。