デプロイ後に環境が正常かどうかを確認する方法
デプロイが完了しました。パイプラインはグリーンを示しています。サーバーログには新しいバージョンが実行中と表示されています。デプロイ中にエラーはありません。すべてがきれいに見えます。
しかし、アプリケーションは実際に動作しているのでしょうか?
プロセスが実行中であることと、アプリケーションが動作していることは同じではありません。アプリケーションはサーバー上で生きている一方で、ユーザーがエラーに直面している可能性があります。データベース接続が切断されているかもしれません。外部APIが応答しないかもしれません。誤って設定された環境変数が重要な機能を壊しているかもしれません。アプリケーションは技術的には「起動」していますが、誰も適切に使用できません。
この「デプロイされた」と「動作している」の間のギャップこそ、多くのチームが陥る落とし穴です。リリースのたびに、環境の実際の状態を知る方法が必要です。
実際に必要なもの:ヘルスシグナル
新しいバージョンをデプロイするとき、単純な質問への答えが必要です:すべて問題ないか?
その答えは、ヘルスシグナルと呼ばれるものから得られます。ヘルスシグナルとは、環境とアプリケーションが正常に動作しているかどうかを教えてくれるあらゆる指標です。これは、すべてが問題ないと推測することと、実際に問題ないと知ることの違いです。
ヘルスシグナルを得る最も基本的な方法は、ヘルスチェックです。ヘルスチェックは、アプリケーションが正しく応答することを確認する、シンプルで定期的なテストです。ほとんどのアプリケーションは、このために専用のエンドポイントを公開しており、多くの場合 /health や /status と呼ばれます。監視ツールがそのエンドポイントにアクセスすると、アプリケーションはステータス(OKまたはNG、場合によっては内部状態の詳細)で応答します。
以下は、ヘルスチェックが実際にどのように動作するかを示す実用的な例です。
curl -f http://localhost:8080/health
正常なアプリケーションは、次のようなJSONで応答する可能性があります。
{
"status": "ok",
"version": "2.4.1",
"uptime": 3600,
"dependencies": {
"database": "connected",
"cache": "connected",
"external_api": "reachable"
}
}
しかし、すべてのヘルスチェックが同じというわけではありません。異なるレベルでチェックでき、各レベルで異なる確信度が得られます。
ヘルスチェックのレベル
最も単純なチェックは、アプリケーションプロセスがまだ実行中かどうかです。プロセスはサーバー上で生きていますか?これはほとんど情報を与えてくれません。プロセスは生きていても、完全に壊れている可能性があります。
次のレベルは、アプリケーションがリクエストに応答できるかどうかをチェックします。/health エンドポイントにアクセスし、200応答を取得します。これはより良いですが、まだ浅いです。アプリケーションは単純なpingに応答する一方で、コア機能が壊れている可能性があります。
最も有用なレベルは、アプリケーションがその依存関係と通信できるかどうかをチェックします。データベースに到達できますか?キャッシュは応答していますか?外部APIは利用可能ですか?このレベルは、アプリケーションが実際にその仕事を実行できるかどうかの現実的な状況を提供します。
次のフローチャートは、これらのレベルがどのように相互に構築され、チェックが失敗したときに何が起こるかを示しています。
ヘルスチェックが完全であればあるほど、環境の状況をより正確に把握できます。しかし、最高のヘルスチェックでさえ、時間的なスナップショットにすぎません。監視を続ける必要があります。
モニタリング:時間の経過に伴うシグナルの監視
単一のヘルスチェックは、ある瞬間の状態を教えてくれます。しかし、状況は変化します。データベース接続は、チェックが成功した5分後に切断されるかもしれません。メモリはゆっくりとリークし、1時間後にアプリケーションがクラッシュするかもしれません。
ここでモニタリングが登場します。モニタリングとは、ヘルスシグナルを継続的に収集し表示するプラクティスです。一度だけチェックする代わりに、数秒または数分ごとにチェックします。結果を保存します。時間の経過に伴う傾向を示すダッシュボードを構築します。
適切なモニタリングは、次のような質問に答えます。
- デプロイ直後に環境は正常でしたか?
- 過去1時間でヘルスは徐々に低下しましたか?
- すべての環境(ステージング、本番)で同じパターンを示していますか?
モニタリングにより、開発から本番までのすべての環境のヘルスを一箇所で確認できます。リリースの前後を比較できます。単一のチェックでは見逃すパターンを発見できます。
アラート:いつ行動すべきかを知る
モニタリングは有用ですが、誰かがダッシュボードを監視している場合に限ります。実際には、誰も一日中ダッシュボードを見つめているわけではありません。何か問題が発生したときにシステムが通知する必要があります。
これがアラートです。アラートとは、ヘルスシグナルが異常な状態を示したときに送信される通知です。たとえば、ヘルスチェックが3回連続で失敗した場合、監視システムはチームにメッセージを送信します(メール、Slack、PagerDuty、またはチームが使用するチャネル)。
アラートはアクションにつながるものであるべきです。アラートを受け取ったら、次に何をすべきかがわかる必要があります。「ヘルスチェック失敗」のような曖昧なアラートよりも、「本番APIエンドポイント /orders が503エラーを返しています。データベース接続プールが枯渇しています。」の方がはるかに有用です。
目標は、問題が発生してからチームがそれを知るまでの時間を短縮することです。気づかない1分ごとに、ユーザーが影響を受ける可能性があります。
パイプラインでのヘルスシグナルの活用
ヘルスシグナルは、デプロイ後のモニタリングのためだけではありません。それらはデプロイメントパイプライン自体の一部にもなり得ます。
より成熟したCI/CDセットアップでは、パイプラインはデプロイ後に自動的にヘルスシグナルをチェックできます。シーケンスは次のようになります。
- 新しいバージョンをデプロイします。
- アプリケーションが起動するのを待ちます。
- 新しいバージョンに対してヘルスチェックを実行します。
- ヘルスチェックが成功した場合、デプロイを成功としてマークします。
- ヘルスチェックが失敗した場合、自動ロールバックをトリガーするか、リリースを停止します。
これにより、ヘルスシグナルを受動的な観測から能動的な安全機構に変えます。パイプライン自体が最初の対応者になります。人間が問題に気付くのを待つのではなく、チェックし、判断し、行動します。
このアプローチは、頻繁にデプロイするチームにとって特に価値があります。1日に複数回デプロイする場合、すべてのリリースを人間が監視することはできません。パイプラインが自身の作業を検証する必要があります。
デプロイ後ヘルスの実践的チェックリスト
デプロイのたびに、このクイックチェックリストを実行して環境が正常であることを確認します。
- アプリケーションプロセスに到達できますか?(基本的なプロセスチェック)
- ヘルスエンドポイントは成功応答を返しますか?(アプリケーションレベルのチェック)
- すべての重要な依存関係(データベース、キャッシュ、外部API)に到達できますか?(依存関係チェック)
- エラー率はデプロイ前と比較して安定しているか、または減少していますか?
- 応答時間は通常の範囲内ですか?
- これらのチェックのいずれかが失敗した場合にチームに通知するアラートが設定されていますか?
このチェックリストは網羅的ではありませんが、正常なデプロイを確認するために必要な最小限のシグナルをカバーしています。
まとめ
グリーンのデプロイメントパイプラインは、正常な環境を意味しません。アプリケーションが実際に動作しているかどうかを知る唯一の方法は、直接チェックすることです。ヘルスチェックはシグナルを提供します。モニタリングは監視を続けます。アラートは行動すべきタイミングを教えます。そして、ヘルスシグナルをパイプラインに統合すると、デプロイメントプロセス自体に自身の成功を検証する能力を与えることができます。
リリース後は、「デプロイは完了したか?」と尋ねるだけでなく、「アプリケーションは実際に動作しているか?」と尋ねてください。答えはヘルスシグナルにあります。