Stackdriver カスタム指標を使用したインスタンス グループの自動スケーリング

このチュートリアルでは、Stackdriver Monitoring カスタム指標の値に基づいて自動スケーリングを行う Compute Engine マネージド インスタンス グループをセットアップする方法を説明します。このチュートリアルの手法を使うと、独自のモニタリング指標を実装してマネージド インスタンス グループをスケーリングできます。

目標

  • 自動スケーリング Compute Engine インスタンス グループをデプロイします。
  • インスタンス グループのスケーリングに使用するカスタム指標を作成します。
  • Google Cloud Platform Console を使用して、カスタム指標とインスタンス グループのサイズを可視化します。

費用

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

  • Cloud Storage
  • Compute Engine
  • Stackdriver Monitoring

    Monitoring に備わっているカスタム指標には、料金が伴います。詳細については、Stackdriver の料金をご覧ください。

始める前に

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

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

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

  3. Cloud Storage と StackdriverAPIs を有効にします。

    API を有効にする

  4. まだワークスペースがない場合は、新しいワークスペースを作成します。

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

このチュートリアルでは、自動スケーリング アプリケーションのサンプル作成について説明します。このアプリケーションでは、Compute Engine インスタンスにインストールされた Node.js スクリプトを使用します。このスクリプトは、Stackdriver 指標に数値を報告します(このチュートリアルを実行するには、Node.js または JavaScript について理解している必要はありません)。指標の値に応じて、アプリケーションは Compute Engine インスタンス グループを必要に応じて自動スケールアップまたは自動スケールダウンします。

このチュートリアルの Node.js スクリプトは、インスタンス グループが応答できる値をカスタム指標に設定する方法として使用されます。本番環境では、ユースケースに関連する指標に基づいて自動スケーリングを行います。

インスタンス グループがテンプレートと Cloud Storage から読み込まれた起動スクリプトを使用して新しいインスタンスを起動する方法を示す、アプリケーションのアーキテクチャ。

このアプリケーションは、次のコンポーネントで構成されています。

  1. Compute Engine インスタンス テンプレート - インスタンス グループ内の各インスタンスの作成に使用されるテンプレート。
  2. Cloud Storage - 起動スクリプトその他のスクリプト ファイルをホストするために使用されるバケット。
  3. Compute Engine 起動スクリプト - 各インスタンスに必要なコード コンポーネントをインストールする起動スクリプト。起動スクリプトは、インスタンスの起動時に自動的にインストールされ起動されます。起動スクリプトが実行されると、Stackdriver カスタム指標に値を書き込むインスタンスにコードがインストールされ開始されます。
  4. Compute Engine インスタンス グループ - Stackdriver Monitoring の指標値に基づいて自動スケーリングを行うインスタンス グループ。
  5. Compute Engine インスタンス - 任意の数の Compute Engine インスタンス。
  6. Cloud Storage カスタム指標 - Compute Engine インスタンス グループの自動スケーリングの入力値として使用されるカスタム モニタリング指標。

アプリケーションの作成

自動スケーリング アプリケーションを作成するには、必要なコード コンポーネントをダウンロードし、マネージド インスタンス グループを作成し、マネージド インスタンス グループに対して自動スケーリングを構成する必要があります。

Cloud Storage にスクリプト ファイルをアップロードする

インスタンス グループは、自動スケーリング中に新しい Compute Engine インスタンスを作成する必要が生じる場合があります。その場合、インスタンス テンプレートに基づいてインスタンスが作成されます。各インスタンスには起動スクリプトが必要です。そのため、テンプレートには起動スクリプトを参照する方法が必要です。Compute Engine では、起動スクリプトのソースとして Cloud Storage バケットの使用がサポートされています。

次の手順で起動スクリプトを Cloud Storage バケットにアップロードします。

  1. このチュートリアルでは、GitHub リポジトリから次のスクリプトをダウンロードします。

    • startup.sh
    • writeToCustomMetric.js
    • writeToCustomMetric.sh
    • config.json
    • package.json
  2. GCP Console で、Cloud Storage ページに移動します。

    Cloud Storage ページに移動

  3. [バケットを作成] をクリックし、デフォルト値をそのまま使用して新規の Cloud Storage バケットを作成します。バケットの命名方法の詳細については、バケットの命名ガイドラインをご覧ください。

  4. スクリプト ファイルを Cloud Storage バケットにコピーします。

    1. 作成した Cloud Storage バケットをクリックして、バケットの内容を参照します。
    2. **[ファイルをアップロード] をクリックし、**GitHub から前にダウンロードしたすべてのスクリプト ファイル(startup.shwriteToCustomMetric.jswriteToCustomMetric.shconfig.jsonpackage.json)を選択してアップロードします。

    スクリプトがアップロードされると、Cloud Storage バケットにファイルが表示されます。

    ユーザーのバケット内のファイルの一覧表示

    これらの各スクリプトの機能については、次のセクションで説明します。

  5. 起動スクリプトの Cloud Storage ファイルの場所をメモします。これは次の形式で指定されます。

    gs://[YOUR_BUCKET_NAME]/startup.sh

コード コンポーネントについて

  • startup.sh - Compute Engine インスタンスをマネージド インスタンス グループに追加する際に必要なコンポーネントを各インスタンスにインストールするシェル スクリプト。
  • writeToCustomMetric.js - スケーリングのトリガーとなる値としてのカスタム モニタリング指標を生成する Node.js スニペット。現実の指標値をエミュレートするために、このスクリプトは時間とともに変化する値を生成します。本番環境にデプロイするとき、このスクリプトをカスタムコードに置き換え、お客様が関心のあるモニタリング指標(処理キューの値など)が報告されるようにします。
  • config.json - カスタム モニタリング指標の値を指定する Node.js 構成ファイル。writeToCustomMetric.js で使用されます。
  • package.json - writeToCustomMetric.js の標準インストールや依存関係を指定する Node.js パッケージ ファイル。
  • writeToCustomMetric.sh - writeToCustomMetric.js プログラムを各 Compute Engine インスタンス上で継続的に実行するシェル スクリプト。

インスタンス テンプレートを作成する

このセクションでは、自動スケーリングを使用してインスタンス グループ内に作成されるインスタンスのテンプレートを作成します。テンプレートの一部として、インスタンスの起動時に実行する起動スクリプトの場所(Cloud Storage 内)を指定します。

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

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

  2. [インスタンス テンプレートを作成] をクリックします。

  3. インスタンス テンプレートに autoscaling-instance01 という名前を付け、[マシンタイプ]、[ブートディスク]、[ID と API へのアクセス]、[ファイアウォール] の各デフォルト値をそのまま使用します。

    名前が入力された [インスタンス テンプレートの作成] の画像

  4. [管理]、[セキュリティ]、[ディスク]、[ネットワーク]、[単一テナンシー] をクリックして入力オプションを展開します。

  5. [管理] タブの [メタデータ] セクションで、次のメタデータのキーと値を入力します。

    • startup-script-url = gs://[YOUR_BUCKET_NAME]/startup.sh
    • gcs-bucket = gs://[YOUR_BUCKET_NAME]

    推奨される Key-Value ペアが入力された [インスタンス テンプレートの作成] ページの [メタデータ] セクション

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

インスタンス グループを作成する

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

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

  2. [新しいインスタンス グループの作成] をクリックし、インスタンス グループに autoscaling-instance-group-1. という名前を付けます。

  3. [ロケーション] で [シングルゾーン] を選択します。

  4. [ゾーン] で、希望のゾーンを選択します。

  5. [グループタイプ] で、[マネージド インスタンス グループ] を選択します。

    [マネージド インスタンス グループ] オプションが選択された [インスタンス グループの作成] ページ

  6. [インスタンス テンプレート] で、作成したインスタンス テンプレートを選択します。

  7. [自動スケーリング] を [オフ] に設定します。

    自動スケーリングの設定は、インスタンス グループが作成された後編集します。他の設定はデフォルト値のままにします。

    [自動スケーリング] オプションが [オフ] に設定された [インスタンス グループの作成] ページ

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

1 つのインスタンスを持つインスタンス グループを作成しました。そのインスタンスはカスタム指標値を報告しているはずです。次に、設定を確認します。

インスタンス グループが作成されたことを確認する

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

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

  2. autoscaling-instance01 テンプレートを使用して作成した autoscaling-instance-group-1 という名前のインスタンス グループに緑色のステータス アイコンが表示されていることを確認します。これは、インスタンス グループが正常に作成されたことを示します。

    「autoscaling-instance-group-1」グループの緑色のステータス アイコンを示すインスタンス グループのリスト

Node.js スクリプトが実行されていることを確認する

カスタム指標 custom.googleapis.com/appdemo_queue_depth_01 は、グループ内に最初のインスタンスが作成され、インスタンスがカスタム指標値の報告を開始するまで作成されません。

インスタンスがカスタム指標値を記録しているかどうかをチェックすることで、インスタンス グループの最初のインスタンスで writeToCustomMetric.js スクリプトが実行されていることを確認できます。

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

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

  2. autoscaling-instance-group-1 をクリックして、グループ内で実行中のインスタンスを表示します。

  3. 任意のインスタンスをクリックします(自動スケーリングは追加のインスタンスを開始していないので、現在表示されている単一のインスタンスをクリックします)。

    インスタンス グループによって開始された単一のインスタンスを示す、インスタンス グループの詳細を表示するページ

  4. [VM インスタンスの詳細] ページの [ログ] で [Stackdriver Logging] をクリックして、VM インスタンスのログを表示します。

    [Stackdriver Logging] リンクがある [ログ] 見出しを示す、[VM インスタンスの詳細] ページの詳細

  5. nodeapp」と入力して、この Compute Engine インスタンスのログをフィルタリングします。

    Node.js スクリプトが Compute Engine インスタンスで実行されている場合は、API にリクエストが送信され、ログに Finished writing time series data というログエントリが表示されます。たとえば、次のスクリーンショットでは、このテキストのエントリは 10:31:05.00010:30:53.000 に表示されています。このようなログエントリが表示されない場合、Node.js スクリプトはカスタム指標値を報告していません。

    ログエントリのリスト

インスタンス グループの自動スケーリングを構成する

カスタム指標が最初のインスタンスからデータを正常に報告していることを確認したら、インスタンス グループがカスタム指標の値に基づいて自動スケーリングを行うように構成できます。

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

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

  2. autoscaling-instance-group-1 グループを選択し、[編集] をクリックします。

    「autoscaling-instance-group-1」グループを示すインスタンス グループのリスト

  3. [自動スケーリング] を [オン] に設定します。

    [自動スケーリング] オプションが [オン] に設定された、編集モードの [インスタンス グループ] ページ

  4. [自動スケーリングの基準] で、[Stackdriver Monitoring の指標] を選択します。

  5. [指標 ID] フィールドに「custom.googleapis.com/appdemo_queue_depth_01」と入力します。

  6. [ターゲット] フィールドに「150」と入力します。

    カスタム モニタリング指標値が [ターゲット] の値と異なる場合、オートスケーラーはマネージド インスタンス グループをスケーリングし、インスタンス数を増減します。ターゲット値は、任意の double 値を指定できます。このチュートリアルでは、その値がカスタム モニタリング指標によって報告される値と一致するため、150 を使用します。

  7. [Target mode] リストで、[ゲージ] を選択します。

    [ゲージ] の設定では、オートスケーラーが直近の数分間に収集されたデータの平均値を計算し、ターゲット値と比較することを指定します。(これに対し、[ターゲット モード] を [DELTA_PER_MINUTE] または [DELTA_PER_SECOND] に設定すると、平均値ではなく、観測された変化率に基づいて自動スケーリングが行われます)。

  8. [インスタンスの最小数] に「1」、[インスタンスの最大数] に「5」と入力します。

    推奨設定を示す、編集モードの [インスタンス グループ] ページの詳細

  9. [保存] をクリックします。

インスタンス グループが自動スケーリングを行っていることを監視する

Node.js スクリプトは、各インスタンスから報告するカスタム指標値を時間の経過とともに変更します。指標の値が上がると、インスタンス グループは Compute Engine インスタンスを追加することによって拡張します。値が下がると、インスタンス グループはこれを検出し、インスタンスを削除して縮小します(前述のように、スクリプトは値が同様に上下に変動する実際の指標をエミュレートします)。

[自動スケーリングされたサイズ] グラフを表示することによって、指標に応じてインスタンス グループのスケーリング方法を確認できます。

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

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

  2. リストの autoscaling-instance-group-1 インスタンス グループをクリックします。

    自動スケーリング グラフなどのインスタンス グループの詳細がページに表示されます。

    [自動スケーリングされたサイズ] グラフを示す、選択したグループの [インスタンス グループ] ページ

    上のグラフに表示されるインスタンスの数は、下のグラフで報告されるカスタム指標によって報告される値と並行して変化します。

クリーンアップ

チュートリアルが終了したら、GCP で作成したリソースについて料金が発生しないようにクリーンアップします。以降のセクションでは、このようなリソースを削除する方法を説明します。

プロジェクトの削除

課金を停止する最も簡単な方法は、チュートリアル用に作成したプロジェクトを削除することです。

プロジェクトを削除する手順は次のとおりです。

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

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

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

すべてのコンポーネントを削除する

  1. インスタンス グループを削除します
  2. インスタンス テンプレートを削除します
  3. Cloud Storage バケットを削除します

次のステップ