スケーラビリティの高いアプリケーションでの自動スケーリングの使用

このチュートリアルでは、自動スケーリングを使用して、アプリケーションをホストしている VM インスタンスの数を自動的に調整し、アプリケーションがさまざまな量のトラフィックに適応できるようにする方法について説明します。

自動スケーリングを使用するには、マネージド インスタンス グループでアプリケーションをホストします。マネージド インスタンス グループとは、すべてが同じアプリケーションを実行し、単一のエンティティとして管理できる、インスタンスの集まりです。マネージド インスタンス グループで自動スケーリングが有効になっている場合、インスタンス グループ内の VM の数は、自動スケーリング ポリシーに指定したターゲット値に従って自動的に増加(スケールアウト)または減少(スケールイン)します。

このチュートリアルでは、マネージド インスタンス グループでウェブ アプリケーションを起動する手順、自動スケーリングを設定する手順、ネットワーク アクセスを構成する手順、負荷の急激な上昇や下落をシミュレートして自動スケーリングを観察する手順の詳細を示します。このような機能の使用経験にもよりますが、このチュートリアルは約 20 分で完了します。

目標

  • マネージド インスタンス グループでデモのウェブ アプリケーションを起動する。
  • トラフィックの急激な上昇や下落をシミュレートすることで、自動スケーリングの効果を観察する。

費用

このチュートリアルでは、Google Cloud の課金対象となる以下のコンポーネントを使用します。

  • Compute Engine

料金計算ツールを使うと、予想使用量に基づいて費用の見積もりを出すことができます。新しい Google Cloud ユーザーは無料トライアルをご利用いただける場合があります。

始める前に

  1. Google アカウントにログインします。

    Google アカウントをまだお持ちでない場合は、新しいアカウントを登録します。

  2. Cloud Console のプロジェクト セレクタページで、Cloud プロジェクトを選択または作成します。

    プロジェクト セレクタのページに移動

  3. Google Cloud プロジェクトに対して課金が有効になっていることを確認します。プロジェクトに対して課金が有効になっていることを確認する方法を学習する

アプリケーション アーキテクチャ

アプリケーションには、次の Compute Engine コンポーネントが含まれています。

ウェブ アプリケーションを起動する

このチュートリアルでは、GitHub に保存されているウェブ アプリケーションを使用します。アプリケーションの実装方法の詳細については、Google Cloud Platform の GitHub リポジトリをご覧ください。

インスタンス テンプレートに起動スクリプトを含めることで、マネージド インスタンス グループ内のすべての VM でウェブ アプリケーションを起動します。ウェブ アプリケーションへの HTTP トラフィックを許可するには、ファイアウォール ルールを作成します。

ファイアウォール ルールを作成する

ウェブ アプリケーションへの HTTP トラフィックを許可するファイアウォール ルールを作成します。

  1. Cloud Console の [ファイアウォール] ページに移動します。
    [ファイアウォール] ページに移動
  2. [ファイアウォール ルールを作成] をクリックします。
  3. [名前] に「default-allow-http」と入力します。
  4. [ネットワーク] を default に設定します。
  5. [ターゲット] を Specified target tags に設定します。
  6. [ターゲットタグ] に「http-server」と入力します。
  7. [ソースフィルタ] を IP ranges に設定します。
  8. [ソース IP の範囲] に「0.0.0.0/0」と入力して、すべての IP アドレスに対しアクセスを許可します。
  9. [ポートとプロトコル] で、[指定したプロトコルとポート] を選択します。
    次に、[tcp] を選択し、「80」と入力して HTTP トラフィックに対しアクセスを許可します。
  10. [作成] をクリックします。

インスタンス テンプレートの作成

起動時にデモのウェブ アプリケーションを起動するインスタンス テンプレートを作成します。

  1. Cloud Console の [インスタンス テンプレート] ページに移動します。
    [インスタンス テンプレート] ページに移動
  2. [インスタンス テンプレートを作成] をクリックします。
  3. [名前] に「autoscaling-web-app-template」と入力します。
  4. [マシンの構成] で、[マシンタイプ] を n1-standard-1 に設定します。
  5. [ブートディスク] で、[イメージ] を Debian GNU/Linux 9(stretch) に設定します。
  6. [ファイアウォール] で、[HTTP トラフィックを許可する] チェックボックスをオンにします。これにより、このテンプレートから作成された各インスタンスに http-server ネットワーキング タグが適用されます。
  7. [管理、セキュリティ、ディスク、ネットワーク、単一テナンシー] をクリックして、詳細設定を表示します。いくつかのタブが表示されます。
  8. [管理] タブで、[自動化] を見つけて、[起動スクリプト] に次の内容を入力します。

    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
    

    このスクリプトにより、起動時に各インスタンスでウェブ アプリケーションが実行されます。

  9. [作成] をクリックします。

マネージド インスタンス グループの作成

リージョン インスタンス グループを作成して、ウェブ アプリケーションの実行を開始します。

  1. Cloud Console の [インスタンス グループ] ページに移動します。
    [インスタンス グループ] ページに移動
  2. [インスタンス グループを作成] をクリックして、新しいインスタンス グループを作成します。
  3. [名前] に「autoscaling-web-app-group」と入力します。
  4. [ロケーション] で、[複数のゾーン] を選択します。

  5. [リージョン] で、us-central1 を選択します。

  6. [ゾーンを設定] プルダウン メニューをクリックして、[ゾーン] を表示します。次のゾーンを選択します。

    • us-central1-b
    • us-central1-c
    • us-central1-f
  7. [インスタンス テンプレート] で autoscaling-web-app-template を選択します。

  8. インスタンス グループの自動スケーリングを構成します。

    1. [自動スケーリング] で [オン] を選択します。
    2. [自動スケーリング ポリシー] を [CPU 使用率] に設定します。他の自動スケーリング ポリシーの詳細については、自動的スケーリングのポリシーと目標使用率をご覧ください。

    3. [ターゲットの CPU 使用率] を 60% に設定します。

    4. [インスタンスの最小数] を 3 に設定します。

    5. [インスタンスの最大数] を 6 に設定します。

    6. [クールダウン期間] を 120 秒に設定します。

  9. [ヘルスチェック] で [ヘルスチェックをしない] を選択します。

  10. [作成] をクリックします。[インスタンス グループ] ページにリダイレクトされます。

  11. インスタンスが実行されていることを確認します。

    1. Cloud Console の [インスタンス グループ] ページで、autoscaling-web-app-group をクリックしてグループ内のインスタンスを表示します。
    2. [外部 IP] で IP アドレスをクリックして、そのインスタンスを接続します。新しいブラウザタブが開き、デモウェブ アプリケーションが表示されます。

      デモウェブ アプリケーションのスクリーンショット。インスタンスに関する情報の一覧とアクション ボタンが表示されています。

      確認が終わったら、デモウェブ アプリケーションのブラウザタブを閉じます。

自動スケーリングの観察

自動スケーリングの動作の詳細については、自動スケーリングの判断についてをご覧ください。

自動スケーリングのモニタリング

作成したインスタンス グループは、CPU 使用率に基づいた自動スケーリング ポリシーを使用します。つまり、オートスケーラーが必要に応じてグループを拡大または縮小して、ターゲット CPU 使用率を 60% に維持します。

インスタンス グループのサイズと平均 CPU 使用率をモニタリングするには、GCP Console の自動スケーリング グラフを使用します。

  1. autoscaling-web-app-group インスタンス グループの [インスタンス グループ] ページで、[モニタリング] タブをクリックします。
  2. CPU 使用率と自動スケーリングをモニタリングするには、左側のプルダウン メニューから [自動スケーリングされたサイズ] を選択し、右側のプルダウン メニューから [cpu] を選択します。

    これにより、グラフが 2 つ表示されます。

    • 上部のグラフには、インスタンス グループ内のインスタンスの数であるサイズが表示されます。
    • 下部のグラフには、インスタンス グループの平均 CPU 使用率である使用率と、インスタンス グループの累積ターゲット CPU 使用率である容量が表示されます。

    自動スケーリングは、可能な場合にサイズを変更することで、容量使用率に一致させようとします。

このウィンドウは閉じないでください。

スケールアウトのシミュレーション

スケールアウトは、インスタンス グループの平均 CPU 使用率がターゲット値より大幅に高い場合に発生します。スケールアウトの際、オートスケーラーは、CPU 使用率がターゲット CPU 使用率の値まで減少するか、インスタンス グループ サイズがインスタンスの最大数6 に設定しました)に等しくなるまで、インスタンス グループのサイズを徐々に増やします。

スケールアウトをトリガーするには、インスタンスの CPU 使用率を増やします。

  1. Cloud Console から Cloud Shell を使用してターミナルを開きます。

    Cloud Shell を開く

    Cloud Console の下部に Cloud Shell が開きます。セッションが初期化されるまで数秒かかることがあります。

  2. プロジェクト ID のローカル bash 変数を作成します。

    export PROJECT_ID=[PROJECT_ID]
    

    ここで、PROJECT_ID は、現在のプロジェクトのプロジェクト ID です。この値は Cloud Shell のすべての新しい行に表示されます。

    user@cloudshell:~ ([PROJECT_ID])$
    
  3. 次の bash スクリプトを実行します。このスクリプトにより、デモのウェブ アプリケーション インスタンスの負荷が増加し、CPU 使用率が増加します。数分後、CPU 使用率がターゲット値を上回り、自動スケーリングはインスタンス グループのサイズを増やすように促されます。

    export MACHINES=$(gcloud --project=$PROJECT_ID compute instances list --format="csv(name,networkInterfaces[0].accessConfigs[0].natIP)" | grep "autoscaling-web-app-group")
    for i in $MACHINES;
    do
      NAME=$(echo "$i" | cut -f1 -d,)
      IP=$(echo "$i" | cut -f2 -d,)
      echo "Simulating high load for instance $NAME"
      curl -q -s "http://$IP/startLoad" >/dev/null --retry 2
    done
    
  4. Cloud Console で [モニタリング] タブを開きます。

    数分後、[モニタリング] タブに CPU 使用率の増加が表示され、インスタンス グループのサイズを増やすことで容量を増やすように自動スケーリングがトリガーされます。

    モニタリングにより、CPU 使用率の増加が示されています。すぐに、グループのサイズが 3 インスタンスから 6 インスタンスに増加します

    また、[メンバー] タブに 6 つのインスタンスが表示されるようになったこともわかります。

両方のウィンドウを開いたままにします。

スケールインのシミュレーション

スケールインは、インスタンス グループの平均 CPU 使用率がターゲット値より大幅に低い場合に発生します。スケールインの際、オートスケーラーは、CPU 使用率がターゲット CPU 使用率まで増加するか、インスタンス グループ サイズがインスタンスの最小数3 に設定しました)に等しくなるまで、インスタンス グループのサイズを徐々に減らします。

スケールインをトリガーするには、インスタンスの CPU 使用率を減らします。

  1. 次の bash スクリプトを実行します。このスクリプトにより、デモのウェブ アプリケーション インスタンスの負荷が減少し、CPU 使用率が減少します。数分後、CPU 使用率がターゲット値を下回り、オートスケーラーはインスタンス グループサイズを減らすように促されます。

    export MACHINES=$(gcloud --project=$PROJECT_ID compute instances list --format="csv(name,networkInterfaces[0].accessConfigs[0].natIP)" | grep "autoscaling-web-app-group")
    for i in $MACHINES;
    do
      NAME=$(echo "$i" | cut -f1 -d,)
      IP=$(echo "$i" | cut -f2 -d,)
      echo "Simulating low load for instance $NAME"
      curl -q -s "http://$IP/stopLoad" >/dev/null --retry 2
    done
    
  2. Cloud Console で [モニタリング] タブを開きます。

    数分後、[モニタリング] タブに CPU 使用率の減少が表示されます。負荷が一貫して少ないことを確認する 10 分間の安定化期間の後、インスタンス グループのサイズを減らすことで容量を減らすように自動スケーリングがトリガーされます。

    モニタリングにより、CPU 使用率の減少が示されています。約 10 分後、グループのサイズが 6 インスタンスから 3 インスタンスに減少します。

    また、[メンバー] タブに 3 つのインスタンスのみが表示されていることもわかります。

終了したら、両方のウィンドウを閉じます。

クリーンアップ

自動スケーリングのチュートリアルが終了したら、Google Cloud で作成したリソースをクリーンアップして、今後料金が発生しないようにします。次のセクションで、リソースを削除または無効にする方法を説明します。

このチュートリアル用に別個のプロジェクトを作成した場合は、プロジェクトごと削除します。それ以外の場合は、プロジェクトに保持したいリソースがあれば、このチュートリアルで作成した特定のリソースのみを削除します。

プロジェクトを削除する

  1. Cloud Console で [リソースの管理] ページに移動します。

    [リソースの管理] ページに移動

  2. プロジェクト リストで、削除するプロジェクトを選択し、[削除] をクリックします。
  3. ダイアログでプロジェクト ID を入力し、[シャットダウン] をクリックしてプロジェクトを削除します。

特定のリソースを削除する

インスタンス グループを削除する

  1. Cloud Console で、[インスタンス グループ] ページに移動します。

    [インスタンス グループ] ページに移動

  2. autoscaling-web-app-group インスタンス グループのチェックボックスをクリックします。
  3. [削除] をクリックしてインスタンス グループを削除します。

インスタンス テンプレートを削除する

  1. Cloud Console の [インスタンス テンプレート] ページに移動します。

    [インスタンス テンプレート] ページに移動

  2. autoscaling-web-app-template の横にあるチェックボックスをオンにします。

  3. ページの上部にある [削除] をクリックします。表示される新しいウィンドウで、[削除] をクリックして削除を確定します。

ファイアウォール ルールを削除する

  1. Cloud Console の [ファイアウォール ルール] ページに移動します。

    [ファイアウォール ルール] ページに移動

  2. default-allow-http という名前のファイアウォール ルールの横にあるチェックボックスをオンにします。

  3. ページの上部にある [削除] をクリックします。表示される新しいウィンドウで、[削除] をクリックして削除を確定します。

次のステップ