このインタラクティブなチュートリアルでは、自動修復を使用して Compute Engine 上で高可用性アプリケーションを構築する方法を説明します。
高可用性アプリケーションは、最小限のレイテンシとダウンタイムでクライアントに対応するよう意図されています。アプリがクラッシュまたはフリーズすると、可用性が低下します。可用性が低下したアプリケーションのクライアントは、高レイテンシやダウンタイムの影響を受ける可能性があります。
自動修復を使用すると、可用性が損なわれたアプリケーションを自動的に再起動できます。自動修復により障害が発生したインスタンスがすばやく検出され、そのインスタンスが自動的に再作成されるため、クライアントに再び対応できるようになります。自動修復を使用すれば、障害の発生後に手動でアプリを運用中の状態に戻す必要がなくなります。
目標
- ヘルスチェックと自動修復ポリシーを構成する。
- マネージド インスタンス グループでデモ用ウェブサービスを設定する。
- ヘルスチェック失敗をシミュレートして自動修復による復元プロセスを確認する。
費用
このチュートリアルでは、Google Cloud の課金対象となる以下のコンポーネントを使用します。- Compute Engine
始める前に
Google Cloud Console の [プロジェクト セレクタ] ページで、Google Cloud プロジェクトを選択または作成します。
Google Cloud プロジェクトで課金が有効になっていることを確認します。
Compute Engine API を有効にします。
Google Cloud Console の [プロジェクト セレクタ] ページで、Google Cloud プロジェクトを選択または作成します。
Google Cloud プロジェクトで課金が有効になっていることを確認します。
Compute Engine API を有効にします。
コマンドラインから作業する場合は、Google Cloud CLI をインストールします。
アプリ アーキテクチャ
アプリには、次の Compute Engine コンポーネントが含まれています。
- ヘルスチェック: 障害が発生した VM インスタンスを検出するために自動修復ツールが使用する HTTP ヘルスチェック ポリシー。
- ファイアウォール ルール: Google Cloud ファイアウォール ルールにより、インスタンスへのトラフィックを許可または拒否できます。
- マネージド インスタンス グループ: 同じデモ用ウェブサービスを実行するインスタンスのグループ。
- インスタンス テンプレート: インスタンス グループ内の各インスタンスを作成するために使用されるテンプレート。
ヘルスチェック プローブでデモ用ウェブサービスを調査する仕組み
ヘルスチェックは指定のプロトコル(HTTP(S)、SSL、TCP など)を使用して、プローブ リクエストをインスタンスに送信します。詳細については、ヘルスチェックの仕組みとヘルスチェックのカテゴリ、プロトコル、ポートをご覧ください。
このチュートリアルでのヘルスチェックは、ポート 80 上で HTTP パス /health
を調査する HTTP ヘルスチェックです。HTTP ヘルスチェックの場合、HTTP パスが HTTP 200 (OK)
レスポンスを返した場合にのみ、プローブ リクエストがチェックに合格します。このチュートリアルのデモ用ウェブサーバーで定義する /health
パスは、正常であれば HTTP 200 (OK)
レスポンスを返し、異常であれば HTTP 500 (Internal Server Error)
レスポンスを返します。詳細については、HTTP、HTTPS、HTTP/2 での成功基準をご覧ください。
ヘルスチェックを作成します。
自動修復を設定するには、カスタム ヘルスチェックを作成し、ヘルスチェック ブローブを許可するようにネットワーク ファイアウォールを構成します。 リージョン ヘルスチェックまたはグローバル ヘルスチェックのいずれかを使用できます。リージョン ヘルスチェックにより、リージョン間の依存関係が軽減され、データ所在地に到達するために役立ちます。グローバル ヘルスチェックは、複数のリージョンの MIG に同じヘルスチェックを使用する場合に役立ちます。このチュートリアルでは、グローバル ヘルスチェックを作成します。
Console
ヘルスチェックを作成する。
Google Cloud Console で、[ヘルスチェック] ページに移動します。
[ヘルスチェックを作成] をクリックします。
[名前] フィールドに「
autohealer-check
」と入力します。[スコープ] を
Global
に設定します。自動修復には、リージョン ヘルスチェックまたはグローバル ヘルスチェックのいずれかを使用できます。[プロトコル] で
HTTP
を選択します。[リクエストパス] を
/health
に設定します。これは、ヘルスチェックで使用する HTTP パスを示します。このチュートリアルのデモ用ウェブサーバーで定義する/health
パスは、正常であればHTTP 200 (OK)
レスポンスを返し、異常であればHTTP 500 (Internal Server Error)
レスポンスを返します。[ヘルス条件] を設定します。
- [チェック間隔] を「
10
」に設定します。これは、あるプローブを開始してから次のブローブを開始するまでの時間を定義します。 - [タイムアウト] を「
5
」に設定します。これは、Google Cloud でプローブに対するレスポンスを待ち受ける時間です。この値は、チェック間隔に設定した数値以下にする必要があります。 - [正常しきい値] を「
2
」に設定します。これは、インスタンスを正常とみなすために連続して成功しなければならないプローブの数を定義します。 - [異常しきい値] を「
3
」に設定します。これは、インスタンスを異常とみなすために連続して失敗しなければならないプローブの数を定義します。
- [チェック間隔] を「
下部にある [作成] をクリックします。
ヘルスチェック プローブによる HTTP リクエストを許可するファイアウォール ルールを作成します。
Google Cloud Console で、[ファイアウォール ルールの作成] ページに移動します。
[名前] に「
default-allow-http-health-check
」と入力します。[ネットワーク] で、[
default
] を選択します。[ターゲット] で、[
All instances in the network
] を選択します。[ソースフィルタ] で、
IP ranges
を選択します。[ソース IP の範囲] に、
130.211.0.0/22
と35.191.0.0/16
を入力します。[プロトコルとポート] で [tcp] を選択し、「
80
」と入力します。[作成] をクリックします。
gcloud
health-checks create http
コマンドを使用してグローバル ヘルスチェックを作成します。gcloud compute health-checks create http autohealer-check \ --global \ --check-interval 10 \ --timeout 5 \ --healthy-threshold 2 \ --unhealthy-threshold 3 \ --request-path "/health"
check-interval
は、プローブを開始してから次のプローブを開始するまでの時間です。timeout
は、Google Cloud でプローブに対するレスポンスを待ち受ける時間です。この値は、チェック間隔に設定した数値以下にする必要があります。healthy-threshold
は、インスタンスを正常とみなすために連続して成功しなければならないプローブの数を定義します。unhealthy-threshold
は、インスタンスを異常とみなすために連続して失敗しなければならないプローブの数を定義します。request-path
は、ヘルスチェックで使用する HTTP パスを示します。このチュートリアルのデモ用ウェブサーバーで定義する/health
パスは、正常であればHTTP 200 (OK)
レスポンスを返し、異常であればHTTP 500 (Internal Server Error)
レスポンスを返します。
ヘルスチェック プローブによる HTTP リクエストを許可するファイアウォール ルールを作成します。
gcloud compute firewall-rules create default-allow-http-health-check \ --network default \ --allow tcp:80 \ --source-ranges 130.211.0.0/22,35.191.0.0/16
適切な自動修復ヘルスチェックについて
自動修復で使用するヘルスチェックは、インスタンスを予防的に削除、再作成しないよう、慎重に実施しなければなりません。自動修復ツールによるヘルスチェックを積極的に実施しすぎると、自動修復ツールがビジー状態のインスタンスを障害が発生したものと誤って判断し、不必要にインスタンスを再起動して可用性を低下させる可能性があります。
unhealthy-threshold
。1
以上にする必要があります。この値は、3
以上に設定するのが理想的です。これにより、発生頻度の低いネットワーク パケットの損失などの障害を回避できます。healthy-threshold
。ほとんどのアプリは値2
で十分です。timeout
。この時間値には十分な値を設定します(予想されるレスポンス時間の 5 倍以上)。これにより、ビジー状態のインスタンスや低速のネットワーク接続などの予期しない遅延を回避できます。check-interval
。この値は、1 秒からタイムアウトの 2 倍までの値にする必要があります。長すぎず、短すぎない値を設定してください。値が長すぎると、失敗したインスタンスがすぐに捕捉されません。値が短すぎると、毎秒かなりの数のヘルスチェック プローブが送信されるため、インスタンスとネットワークがビジー状態になる可能性があります。
ウェブサービスを設定する
このチュートリアルでは、GitHub に保存されているウェブアプリを使用します。アプリケーションの実装方法の詳細については、GoogleCloudPlatform/python-docs-samples GitHub リポジトリをご覧ください。
デモ用ウェブサービスを設定するには、起動時にデモ用ウェブサーバーを起動するインスタンス テンプレートを作成します。そのインスタンス テンプレートを使用してマネージド インスタンス グループをデプロイし、自動修復を有効にします。
Console
インスタンス テンプレートを作成します。デモ用ウェブサーバーを起動する起動スクリプトを組み込みます。
Google Cloud Console で、[インスタンス テンプレート] ページに移動します。
[インスタンス テンプレートを作成] をクリックします。
[名前] を
webserver-template
に設定します。[マシンの構成] で
micro
(e2-micro)を選択します。[ファイアウォール] で、[HTTP トラフィックを許可する] チェックボックスをオンにします。
[管理、セキュリティ、ディスク、ネットワーク、単一テナンシー] をクリックして、詳細設定を表示します。複数のタブが表示されます。
[管理] タブの [自動化] にある [起動スクリプト] に、次の内容を入力します。
sudo apt update && sudo apt -y install git gunicorn3 python3-pip git clone https://github.com/GoogleCloudPlatform/python-docs-samples.git cd python-docs-samples/compute/managed-instances/demo sudo pip3 install -r requirements.txt sudo gunicorn3 --bind 0.0.0.0:80 app:app --daemon
[作成] をクリックします。
ウェブサーバーをマネージド インスタンス グループとしてデプロイします。
Google Cloud Console で、[インスタンス グループ]