Cloud Runでは、アプリケーションが正常に動作しているかどうかを監視する、ヘルスチェック機能が提供されています。
この機能を使用することで、サービスが正常に稼働しているかどうかを定期的に確認できます。

概要

Cloud Runのヘルスチェック機能は、起動プローブとライブネスプローブの2つの方法があります。

起動プローブ

アプリケーションがCloud Run上で起動した後に最初に実行されるプローブで、アプリケーションが正常に起動したかどうかを確認します。
例えば、必要な環境変数やデータベース接続などを初期化できているかどうかを確認するようなケースが挙げられます。
アプリケーションの起動が確認できない場合は、インスタンスを再起動します。
HTTP、TCP、gRPCの3種類のプローブを利用できます。

ライブネスプローブ

アプリケーションが稼働中であることを確認するために定期的に実行されるプローブで、アプリケーションがリクエストを受け付けることができるかどうかを確認します。
これにより、Cloud Runはアプリケーションが応答しなくなった場合は、自動的にインスタンスを再起動することができます。
HTTP、gRPCの2種類のプローブを利用できます。

設定方法

1. HTTPエンドポイントを追加

ヘルスチェックを行う任意のHTTPエンドポイント( /healthなど)を用意します。
エンドポイントへの通信は、Cloud Runのインフラストラクチャからのリクエスト送信となり、外部IPからの通信ではないため、Cloud ArmorやCloud RunのIngressの設定を気にする必要はありません。
ただし、アプリケーション側でIP制限を行っている場合は弾かれてしまうので注意が必要です。

2. ヘルスチェックを追加

マネジメントコンソール上でCloud Runのリビジョンの編集から設定可能です。
ヘルスチェックの種類とプローブタイプを決めて、先程追加したHTTPエンドポイントへの相対パスを入力します。
その他、必要に応じて以下の項目を変更します。

項目 デフォルト値 詳細
初期遅延 0 コンテナが開始された後、最初のプローブを実行するまでの待機時間(秒)
期間 1 プローブを実行する期間(秒)
失敗しきい値 3 コンテナを失敗と判断する前にプローブを再試行する回数
タイムアウト 10 プローブがタイムアウトするまでの待機時間(秒)

例として、HTTPのライブネスプローブをデフォルトで構成する場合は以下のようになります。
この場合、コンテナ開始直後から60秒間隔でヘルスチェックを行い、20秒 x 3回の失敗がマークされた場合にコンテナの再起動を行います。

3. ログに出力されているか確認

ヘルスチェックの設定をすると、ログに以下のような形で出力されます。

成功時

production.INFO: GET {"url":"http://127.0.0.1/health","request":[]}
169.254.1.1 - - "GET /health HTTP/1.1" 200 26 "-" "-"

失敗時

production.INFO: GET {"url":"http://127.0.0.1/health","request":[]}
production.NOTICE: Access denied from 169.254.1.1
169.254.1.1 - - "GET /health HTTP/1.1" 403 73798 "-" "-"
Liveness check failed for container : xxxx. Terminating container.

最後に

Cloud Runのヘルスチェック機能を使用することで、アプリケーションの状態を定期的に監視し、Cloud Runがアプリケーションの再起動を自動的に実行することができました。
これにより、ユーザーがアプリケーションにアクセスできない時間を最小限に抑えることができ、サービスの可用性を高めることができます。
Cloud Runを使用する場合は設定しておいて損はないと思いますので、積極的に活用することをオススメします。