Cloud Run は、スケーラビリティに優れた Google のインフラストラクチャ上でコード、関数、コンテナを実行できるフルマネージド アプリケーション プラットフォームです。
つまり、Cloud Run を使用すると、Cloud Run サービスの運用、構成、スケーリングに必要な時間がほとんどなくなるため、デベロッパーはコードの作成に時間を費やすことができます。クラスタの作成やインフラストラクチャの管理をすることなく Cloud Run で生産性を向上できます。
サービスとジョブ
Cloud Run では、コードはサービスまたはジョブとして実行できます。
次の表に、各 Cloud Run リソースタイプで提供されるオプションの概要を示します。
| リソース | 説明 |
|---|---|
| サービス | 一意の安定したエンドポイントに送信された HTTP リクエストに応答します。さまざまな主要指標に基づいて自動スケーリングされる、ステートレスなインスタンスを使用し、イベントと関数にも応答します。 |
| ジョブ | 手動またはスケジュールに基づいて実行され、完了まで実行される並列化可能なタスクを実行します。 |
Cloud Run サービス
Cloud Run サービスでは、信頼性の高い HTTPS エンドポイントを実行するために必要なインフラストラクチャが提供されます。コードが TCP ポートでリッスンし、HTTP リクエストを処理することを確認するのは、お客様の責任となります。
次の図は、HTTPS エンドポイントを使用してクライアントからのウェブ リクエストとイベントを処理するために、複数のコンテナ インスタンスを実行している Cloud Run サービスを示しています。
標準サービスには次の機能が含まれます。
- すべてのサービス用の一意の HTTPS エンドポイント
- すべての Cloud Run サービスには、
*.run.appドメインの一意のサブドメインに HTTPS エンドポイントが用意されています。また、カスタム ドメインを構成することもできます。Cloud Run が TLS を管理し、WebSocket、HTTP/2(エンドツーエンド)、gRPC(エンドツーエンド)をサポートします。 - 高速なリクエスト ベースの自動スケーリング
- Cloud Run は、すべての受信リクエストを処理するために迅速にスケールアウトします。また、課金設定がインスタンスベースの課金に設定されている場合は、リクエスト以外の CPU 使用率の増加に対応するために迅速にスケールアウトします。サービスは、インスタンスを 1,000 個まで迅速にスケールアウトできます。割り当ての増加をリクエストした場合は、さらにスケールアウトが可能です。需要が減ると、Cloud Run はアイドル状態のコンテナを削除します。コストやダウンストリーム システムの過負荷が懸念される場合は、インスタンスの最大数を制限できます。
- オプションの手動スケーリング
- デフォルトでは、Cloud Run はより多くのトラフィックを処理するため、より多くのインスタンスに自動的にスケーリングしますが、手動スケーリングを使用してスケーリング動作を制御することで、この動作をオーバーライドできます。
- 組み込みのトラフィック管理
新しいリビジョンのデプロイのリスクを軽減するため、Cloud Run は、受信トラフィックの最新のリビジョンへのルーティング、前のリビジョンへのロールバック、トラフィックの複数のリビジョンへの同時分割など、段階的なロールアウトの実行をサポートしています。
たとえば、リクエストの 1% を新しいリビジョンに送信し、テレメトリーをモニタリングしながらその割合を増やします。
- 一般公開サービスと限定公開サービス
Cloud Run サービスには、インターネットから到達できます。また、次の方法でアクセスを制限できます。
- Cloud IAM を使用してアクセス ポリシーを指定する。
- 上り(内向き)設定を使用してネットワーク アクセスを制限する。これは、VPC と内部サービスからの内部トラフィックのみを許可する場合に便利です。
- Identity-Aware Proxy(IAP)で認証されたユーザーのみを許可する。
Firebase Hosting や Cloud CDN などのコンテンツ配信ネットワーク(CDN)を使用して Cloud Run サービスを起動することで、クライアントに近いエッジ ロケーションからキャッシュ可能なアセットを提供できます。
ゼロおよび最小インスタンスへのスケーリング
デフォルトでは、インスタンスベースの課金が設定されている場合、Cloud Run は、すべての受信リクエストを処理するため、またはリクエスト以外の CPU 使用率の増加に対応するために、インスタンスを自動的に追加または削除します。
サービスに対する受信リクエストがない場合は、最後に残ったインスタンスまで削除されます。この動作は一般にゼロにスケーリングと呼ばれています。その後、リクエストが届いたときにアクティブなインスタンスがない場合、Cloud Run は新しいインスタンスを作成します。コンテナでリクエストの処理の準備ができるまでの時間によっては、最初のリクエストのレスポンス時間が長くなります。
この動作を変更するには、次のいずれかの方法を使用します。
- サービスがゼロ インスタンスにスケーリングされないように、最小数のインスタンスをアクティブにするように Cloud Run を構成する
- 手動スケーリングを使用して、スケーリングをより細かく制御する
サービスの従量課金制
インスタンスに割り当てられた CPU とメモリは 100 ミリ秒の粒度で課金されます。そのため、ゼロへのスケーリングは、経済的な理由で魅力的な設定となります。最小インスタンス数を構成していない場合、サービスが使用されていなければ料金は発生しません。十分な無料枠が用意されています。詳細については、料金をご覧ください。
有効にできる課金設定は次の 2 つです。
- リクエスト ベース
- インスタンスがリクエストを処理していない場合、課金は発生しません。リクエストごとの料金が発生します。
- インスタンス ベース
- インスタンスの全期間に対して課金されます。リクエストごとの料金は発生しません。
十分な無料枠が用意されています。詳細については、料金をご覧ください。また、サービスに対してリクエスト ベースまたはインスタンス ベースの課金を有効にする方法については、課金設定をご覧ください。
使い捨てのコンテナ ファイルシステム
Cloud Run のインスタンスは使い捨てです。すべてのコンテナにはメモリ内に書き込み可能なファイル システム オーバーレイがあり、コンテナがシャットダウンした場合、これらは保持されません。Cloud Run は、スケールインなどの際に、インスタンスへのリクエスト送信を停止してシャットダウンするタイミングを決定します。
Cloud Run でインスタンスがシャットダウンされる際に警告を受け取るには、アプリケーションで SIGTERM シグナルをトラップします。これにより、ローカル バッファをフラッシュして、外部データをローカル データストアに保持できます。
ファイルを永続的に保持するには、Cloud Storage と統合するか、ネットワーク ファイル システム(NFS)をマウントします。
Cloud Run サービスを使用するタイミング
Cloud Run サービスは、リクエスト、イベント、関数を処理するコードに最適です。たとえば、次のような場合があります。
- ウェブサイトとウェブ アプリケーション
- お好みのスタックを使ってウェブアプリを構築し、SQL データベースにアクセスして動的な HTML ページをレンダリングします。
- API とマイクロサービス
- HTTP または gRPC で通信する REST API、GraphQL API、プライベート マイクロサービスを構築できます。
Cloud Run ジョブ
コードが動作後に停止する場合(スクリプトを使用する場合など)、Cloud Run ジョブを使用してコードを実行できます。コマンドラインから Google Cloud CLI を使用してジョブを実行するか、繰り返しのジョブをスケジュールする
配列ジョブでより迅速にジョブを実行する
ジョブは、コードを実行するために 1 つのインスタンスを開始します。これは、スクリプトまたはツールを実行する一般的な方法です。
ただし、独立した同一のインスタンスを複数並行して開始する配列ジョブを使用することもできます。配列ジョブは、複数の独立したタスクに分割できるジョブを迅速に処理します。
次の図は、4 つのインスタンスが独立したタスクを並行して処理できる場合、7 つのタスクを含むジョブを順番に実行するよりも、同じジョブを並行して実行するほうが時間がかかることを示しています。
たとえば、Cloud Storage 内の 1,000 枚の画像のサイズを変更して切り抜く場合、連続して処理する方が、多くのインスタンスで同時に処理する場合より時間がかかります。同時に処理する方法では、Cloud Run は自動スケーリングを使用して管理します。
Cloud Run ジョブを使用するタイミング
Cloud Run ジョブは、作業(ジョブ)を実行します。作業の完了後に終了するコードを実行する場合に適しています。いくつか例を挙げましょう。
- スクリプトまたはツール
- スクリプトを実行して、データベースの移行などの運用タスクを行います。
- 配列ジョブ
- Cloud Storage バケット内のすべてのファイルに高度な並列処理を行います。
- スケジュールされたジョブ
- 請求書の作成や送信を定期的に行います。また、データベース クエリの結果を XML 形式で保存し、数時間ごとにファイルをアップロードします。