Cloud Run と Firebase Hosting を組み合わせれば、動的コンテンツを生成して配信できるほか、REST API をマイクロサービスとしてビルドすることもできます。
Cloud Run を使用すると、コンテナ イメージにパッケージ化されたアプリケーションをデプロイできます。その後、Firebase Hosting を使用して HTTPS リクエストをリダイレクトすることで、リクエストに応じてコンテナ化アプリをトリガーできます。
- Cloud Run は Go、Node.js、Python、Java などの複数の言語をサポートしているため、プログラミング言語とフレームワークを柔軟に選ぶことができます。
- 受信リクエストに合わせて、コンテナ イメージが自動的に水平方向にスケールされます。需要が減少した場合はスケールダウンします。
- 料金は、リクエスト処理中に使用した CPU、メモリ、ネットワークに対してのみ発生します。
Cloud Run と Firebase Hosting の統合のユースケースとサンプルについては、サーバーレスの概要をご覧ください。
このガイドでは、以下の方法について説明します。
- シンプルな Hello World アプリケーションを記述する
- アプリをコンテナ化して Container Registry にアップロードする
- コンテナ イメージを Cloud Run にデプロイする
- コンテナ化されたアプリに Hosting リクエストをリダイレクトする
動的コンテンツの配信パフォーマンスを向上させるために、必要に応じてキャッシュ設定を調整できます。
始める前に
Cloud Run を使用する前に、Cloud 請求先アカウントの設定、Cloud Run API の有効化、gcloud
コマンドライン ツールのインストールなど、いくつかの準備を行う必要があります。
プロジェクトの請求先を設定する
Cloud Run では無料の使用量割り当てが提供されていますが、それでも Cloud Run を使用または試用するには Firebase プロジェクトに関連付けられた Cloud 請求先アカウントが必要です。
API を有効にして SDK をインストールする
Google API Console で Cloud Run API を有効にします。
Google API Console で Cloud Run API ページを開きます。
プロンプトが表示されたら、Firebase プロジェクトを選択します。
Cloud Run API ページで [有効にする] をクリックします。
Cloud SDK をインストールして初期化します。
正しいプロジェクトに
gcloud
ツールが構成されていることを確認します。gcloud config list
ステップ 1: サンプル アプリケーションを記述する
Cloud Run は、以下のサンプルに示す言語以外にも多くの言語をサポートしています。
Go
helloworld-go
という名前の新しいディレクトリを作成し、そのディレクトリに移動します。mkdir helloworld-go
cd helloworld-go
helloworld.go
という名前の新しいファイルを作成し、次のコードを追加します。このコードは、
PORT
環境変数で定義されたポートをリッスンする基本的なウェブサーバーを作成します。
これでアプリは完成しました。このアプリをコンテナ化し、Container Registry にアップロードします。
Node.js
helloworld-nodejs
という名前の新しいディレクトリを作成し、そのディレクトリに移動します。mkdir helloworld-nodejs
cd helloworld-nodejs
package.json
ファイルを作成し、次の内容を追加します。index.js
という名前の新しいファイルを作成し、次のコードを追加します。このコードは、
PORT
環境変数で定義されたポートをリッスンする基本的なウェブサーバーを作成します。
これでアプリは完成しました。このアプリをコンテナ化し、Container Registry にアップロードします。
Python
helloworld-python
という名前の新しいディレクトリを作成し、そのディレクトリに移動します。mkdir helloworld-python
cd helloworld-python
app.py
という名前の新しいファイルを作成し、次のコードを追加します。このコードは、
PORT
環境変数で定義されたポートをリッスンする基本的なウェブサーバーを作成します。
これでアプリは完成しました。このアプリをコンテナ化し、Container Registry にアップロードします。
Java
Java SE 8 以降の JDK と CURL をインストールします。
これは、次のステップで新しいウェブ プロジェクトを作成するためだけに行います。後述する Dockerfile により、すべての依存関係がコンテナに読み込まれます。
コンソールから cURL を使用して新しい空のウェブ プロジェクトを作成し、コマンドを解凍します。
curl https://start.spring.io/starter.zip \ -d dependencies=web \ -d name=helloworld \ -d artifactId=helloworld \ -o helloworld.zip
unzip helloworld.zip
これで SpringBoot プロジェクトが作成されます。
src/main/java/com/example/helloworld/HelloworldApplication.java
にあるSpringBootApplication
クラスで、/
マッピングを処理する@RestController
と、TARGET
環境変数を提供する@Value
フィールドを追加します。このコードは、
PORT
環境変数で定義されたポートをリッスンする基本的なウェブサーバーを作成します。
これでアプリは完成しました。このアプリをコンテナ化し、Container Registry にアップロードします。
ステップ 2: アプリをコンテナ化して Container Registry にアップロードする
ソースファイルと同じディレクトリに
Dockerfile
という名前の新しいファイルを作成することで、サンプルアプリをコンテナ化します。次の内容をファイルにコピーします。Go
Node.js
Python
Java
Dockerfile を含むディレクトリから次のコマンドを実行し、Cloud Build を使用してコンテナ イメージをビルドします。
gcloud builds submit --tag gcr.io/PROJECT_ID/helloworld
ビルドが成功すると、イメージ名(
gcr.io/PROJECT_ID/helloworld
)を含む SUCCESS メッセージが表示されます。
これでコンテナ イメージが Container Registry に保存されました。このイメージは必要に応じて再利用できます。
Cloud Build の代わりに、Docker のローカルにインストールされたバージョンを使用してコンテナをローカルにビルドすることもできます。
ステップ 3: コンテナ イメージを Cloud Run にデプロイする
次のコマンドを使用してデプロイします。
gcloud run deploy --image gcr.io/PROJECT_ID/helloworld
プロンプトが表示されたら、次の操作を行います。
- リージョンを選択します。例:
us-central1
- サービス名を確認します。例:
helloworld
- 未承認の呼び出しの許可を求めるメッセージに対して「
Y
」としてこれを許可します。
- リージョンを選択します。例:
最高のパフォーマンスを得るには、次のリージョンを使用して、Cloud Run サービスを Hosting と同じ場所に配置します。
us-west1
us-central1
us-east1
europe-west1
asia-east1
Hosting から Cloud Run への書き換えは、次のリージョンでサポートされています
asia-east1
asia-east2
asia-northeast1
asia-northeast2
asia-northeast3
asia-south1
asia-south2
asia-southeast1
asia-southeast2
australia-southeast1
australia-southeast2
europe-central2
europe-north1
europe-southwest1
europe-west1
europe-west12
europe-west2
europe-west3
europe-west4
europe-west6
europe-west8
europe-west9
me-central1
me-west1
northamerica-northeast1
northamerica-northeast2
southamerica-east1
southamerica-west1
us-central1
us-east1
us-east4
us-east5
us-south1
us-west1
us-west2
us-west3
us-west4
us-west1
us-central1
us-east1
europe-west1
asia-east1
デプロイが完了するまでしばらく待ちます。成功すると、コマンドラインにサービス URL が表示されます。次に例を示します。
https://helloworld-RANDOM_HASH-us-central1.a.run.app ウェブブラウザでこのサービス URL を開き、デプロイしたコンテナにアクセスします。
次のステップでは、このコンテナ化されたアプリに Firebase Hosting URL からアクセスする方法を示します。これにより、Firebase でホストされているサイトの動的コンテンツを生成できます。
ステップ 4: コンテナ化されたアプリに Hosting リクエストをリダイレクトする
リライトルールを使用して、特定のパターンに一致するリクエストを単一の宛先に向けることができます。
次の例は、Hosting サイトのページ /helloworld
からのすべてのリクエストを送信し、helloworld
コンテナ インスタンスの起動と実行をトリガーする方法を示します。
以下のことを確認します。
最新バージョンの Firebase CLI がインストールされていること。
Firebase Hosting の初期化が完了していること。
CLI のインストールと Hosting の初期化の詳細については、Hosting のスタートガイドをご覧ください。
firebase.json
ファイルを開きます。hosting
セクションに次のrewrite
構成を追加します。"hosting": { // ... // Add the "rewrites" attribute within "hosting" "rewrites": [ { "source": "/helloworld", "run": { "serviceId": "helloworld", // "service name" (from when you deployed the container image) "region": "us-central1", // optional (if omitted, default is us-central1) "pinTag": true // optional (see note below) } } ] }
プロジェクト ディレクトリのルートから次のコマンドを実行して、ホスティング構成をサイトにデプロイします。
firebase deploy --only hosting
次の URL でコンテナに接続できるようになりました。
Firebase のサブドメイン:
PROJECT_ID.web.app/
とPROJECT_ID.firebaseapp.com/
接続されたカスタム ドメイン:
CUSTOM_DOMAIN/
リライトルールの詳細については、Hosting 構成ページをご覧ください。さまざまな Hosting 構成のレスポンスの優先順位についても記載されています。
ローカルでテストする
開発中に、コンテナ イメージをローカルで実行してテストできます。詳しい手順については、Cloud Run のドキュメントをご覧ください。
次のステップ
グローバル CDN 上の動的コンテンツのキャッシュを設定する。
Firebase Admin SDK を使用して他の Firebase サービスを利用する。
コンテナのセットアップ、管理、構成などの方法を示す詳しい入門ガイドで Cloud Run について学ぶ。