Spanner 用分散オートスケーラー ツールのデプロイ


このチュートリアルでは、分散デプロイ トポロジを使用して Spanner 用のオートスケーラー ツールのインフラストラクチャを設定する方法について説明します。このチュートリアルのデプロイメント オプションでは、オートスケーラーのすべてのコンポーネントが 1 つのプロジェクトにあります。ただし、Cloud Scheduler、フォワーダー トピック、および対応する関数は除きます。

このチュートリアルは、運用上のオーバーヘッドを削減し、Spanner のデプロイの費用を最適化したいと考えている、IT、オペレーション、サイト信頼性エンジニアリング チームを対象としています。このドキュメントはシリーズの一部です。

分散デプロイ トポロジでは、次のように、プロジェクトごとのデプロイと集中デプロイの両方の利点が 1 つにまとめられます。

  • アプリケーション チームと呼ばれる Spanner インスタンスを所有するチームが、自身が所有する Cloud Scheduler ジョブを使用して、インスタンスのオートスケーラー設定パラメータを管理します。
  • 中央のチームが設定パラメータ外で、残りのオートスケーラー インフラストラクチャを管理し、管理オーバーヘッドを最小限に抑えます。

アーキテクチャ

次の図は、分散デプロイ トポロジにおけるオートスケーラーのアーキテクチャを示しています。

分散デプロイ トポロジ。

オートスケーラーのコンポーネントの説明とイベントのフローの各番号付きステップについては、Spanner の自動スケーリングをご覧ください。

フォワーダー関数

Cloud Scheduler では、同じプロジェクト内のトピックにのみメッセージをパブリッシュできます。そのため、このチュートリアルでは、分散トポロジについて、フォワーダー関数と呼ばれる中間コンポーネントを使用します。

フォワーダー関数は、Cloud Scheduler から Pub/Sub に公開されたメッセージを取得し、JSON 構文をチェックして、ポーラー Pub/Sub トピックに転送します。このトピックは、Cloud Scheduler の別のプロジェクトに属することができます。

次の図は、転送メカニズムに使用されるコンポーネントを示しています。

転送メカニズム。

上の図に示すように、Spanner インスタンスは、Application 1Application 2 という名前のプロジェクト内にあります。

  1. Cloud Scheduler は、Spanner インスタンスと同じプロジェクトです。
  2. (2a)Cloud Scheduler は、Application 1 と Application 2 プロジェクトのフォワーダー トピックにメッセージをパブリッシュします。

    (2b)フォワーダー関数は、フォワーダー トピックからメッセージを読み取ります。

    (2c)フォワーダー関数は、オートスケーラー プロジェクト内のポーリング トピックにメッセージを転送します。

  3. ポーラー関数は、ポーリング トピックからメッセージを読み取り、Spanner の自動スケーリングで説明するように、プロセスが続行されます。

目標

  • 分散デプロイ モデルを使用してオートスケーラーをデプロイする。
  • 既存の Spanner インスタンスを Terraform の状態にインポートする。
  • オートスケーラーを構成する。

費用

このドキュメントでは、Google Cloud の次の課金対象のコンポーネントを使用します。

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

このチュートリアルの指示に従う場合、オートスケーラー コンポーネントのオペレーションに関連するコストはゼロか、ほぼゼロになります。ただし、Spanner インスタンスの費用は、この見積もりに含まれません。Spanner インスタンスのコストを計算する方法の例については、Spanner の自動スケーリングをご覧ください。

このドキュメントに記載されているタスクの完了後、作成したリソースを削除すると、それ以上の請求は発生しません。詳細については、クリーンアップをご覧ください。

準備

分散デプロイ トポロジでは、オートスケーラー プロジェクトに加えて 2 つ目のプロジェクトを設定します。このチュートリアルでは、このプロジェクトをアプリケーション プロジェクトと呼びます。アプリケーション プロジェクトは、Spanner を含むアプリケーション リソースを保持します。このチュートリアルでは、この 2 つのプロジェクトの請求と API の請求を分けて設定して有効にします。

  1. Google Cloud コンソールで、「Cloud Shell をアクティブにする」をクリックします。

    Cloud Shell をアクティブにする

  2. Cloud Shell で、次のリポジトリのクローンを作成します。

    git clone https://github.com/cloudspannerecosystem/autoscaler
    
  3. 作業ディレクトリの変数をエクスポートします。

    export AUTOSCALER_DIR="$(pwd)/autoscaler/terraform/cloud-functions/distributed/autoscaler-project"
    export APP_DIR="$(pwd)/autoscaler/terraform/cloud-functions/distributed/app-project"
    

オートスケーラー プロジェクトの準備

このセクションでは、プロジェクトのデプロイの準備をします。この中には、Cloud Scheduler 以外のすべての一元化されたオートスケーラー インフラストラクチャが含まれます。

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

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

  2. Google Cloud プロジェクトで課金が有効になっていることを確認します

  3. Identity and Access Management (IAM), Resource Manager, App Engine Admin, Firestore, Spanner, Pub/Sub, Cloud Functions, and Cloud Build API を有効にします。

    API を有効にする

  4. Cloud Shell で、オートスケーラー プロジェクトの ID を環境変数に設定します。

    export AUTO_SCALER_PROJECT_ID=INSERT_YOUR_PROJECT_ID
    gcloud config set project "${AUTO_SCALER_PROJECT_ID}"
    
  5. オートスケーラー インフラストラクチャのリージョンとゾーン、および App Engine のロケーションFirestore 用)を設定します。

     export AUTO_SCALER_REGION=us-central1
     export AUTO_SCALER_ZONE=us-central1-c
     export AUTO_SCALER_APP_ENGINE_LOCATION=us-central
    
  6. サービス アカウントを作成します。

    gcloud iam service-accounts create terraformer --display-name "Terraform service account"
    

    Terraform はこのアカウントを使用して、インフラストラクチャ内のすべてのリソースを作成します。

  7. プロジェクト オーナーのロールをサービス アカウントに付与します。

     gcloud projects add-iam-policy-binding "${AUTO_SCALER_PROJECT_ID}" \
        --member "serviceAccount:terraformer@${AUTO_SCALER_PROJECT_ID}.iam.gserviceaccount.com" \
        --role roles/owner
    
  8. サービス アカウントのキーファイルを作成します。

     gcloud iam service-accounts keys create \
        --iam-account "terraformer@${AUTO_SCALER_PROJECT_ID}.iam.gserviceaccount.com" "${AUTOSCALER_DIR}/key.json"
    
  9. プロジェクトに Firestore インスタンスがない場合は作成します。

     gcloud app create --region="${AUTO_SCALER_APP_ENGINE_LOCATION}"
     gcloud alpha firestore databases create --region="${AUTO_SCALER_APP_ENGINE_LOCATION}"
    

オートスケーラーのデプロイ

このセクションでは、次のディレクトリにある Terraform ファイルを使用して、オートスケーラーを構成するコンポーネントをデプロイします。

ディレクトリ ディレクトリの内容
terraform/ 最上位の構成。各デプロイ オプションと再利用可能なモジュールが含まれます。
terraform/cloud-functions/distributed/autoscaler-project/ オートスケーラーが配置されているプロジェクトの構成。オートスケーラー モジュールに委任されます。
terraform/modules/autoscaler-functions ポーラーおよびスケーラー Cloud Functions と Pub/Sub のトピックの構成。
  1. Cloud Shell で、対応する Terraform 環境変数にプロジェクト ID、リージョン、ゾーン、App Engine のロケーションを設定します。

    export TF_VAR_project_id="${AUTO_SCALER_PROJECT_ID}"
    export TF_VAR_region="${AUTO_SCALER_REGION}"
    export TF_VAR_zone="${AUTO_SCALER_ZONE}"
    export TF_VAR_location="${AUTO_SCALER_APP_ENGINE_LOCATION}"
    
  2. ディレクトリを Terraform スケーラー プロジェクト ディレクトリに変更し、初期化します。

    cd "${AUTOSCALER_DIR}"
    terraform init
    
  3. オートスケーラー インフラストラクチャを作成します。

    terraform apply -parallelism=2
    

    リソースの確認後、プロンプトが表示されたら「yes」と入力します。

    Cloud Shell でこのコマンドを実行すると、エラー メッセージ "Error: cannot assign requested address" が表示されることがあります。

    このエラーは、Terraform Google プロバイダの既知の問題です。この場合は、次のコマンドで再試行します。

    terraform apply -parallelism=1
    

アプリケーション プロジェクトの準備

このセクションでは、Spanner インスタンスを含むプロジェクトで、Cloud Scheduler、フォワーダー トピックおよび関数のデプロイを準備します。

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

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

  2. Google Cloud プロジェクトで課金が有効になっていることを確認します

  3. Identity and Access Management, Resource Manager, App Engine Admin, Firestore, Spanner, Pub/Sub, Cloud Functions, and Cloud Build API を有効にします。

    API を有効にする

  4. Cloud Shell で、アプリケーション プロジェクトの ID を使用した環境変数を設定します。

    export APP_PROJECT_ID=INSERT_YOUR_APP_PROJECT_ID
    gcloud config set project "${APP_PROJECT_ID}"
    
  5. アプリケーション プロジェクトのリージョンとゾーンおよび App Engine のロケーションを設定します。

    export APP_REGION=us-central1
    export APP_ZONE=us-central1-c
    export APP_APP_ENGINE_LOCATION=us-central
    
  6. Terraform でインフラストラクチャ内のリソースの作成に使用するサービス アカウントを作成します。

    gcloud iam service-accounts create terraformer --display-name "Terraform service account"
    
  7. プロジェクト オーナーのロールroles/owner)をサービス アカウントに付与します。

     gcloud projects add-iam-policy-binding "${APP_PROJECT_ID}" \
        --member "serviceAccount:terraformer@${APP_PROJECT_ID}.iam.gserviceaccount.com" \
        --role roles/owner
    
  8. サービス アカウントのキーファイルを作成します。

     gcloud iam service-accounts keys create \
        --iam-account "terraformer@${APP_PROJECT_ID}.iam.gserviceaccount.com"  "${APP_DIR}/key.json"
    
  9. Cloud Scheduler を有効にするアプリケーションを作成します。

    gcloud app create --region="${APP_APP_ENGINE_LOCATION}"
    

    状態がオートスケーラー プロジェクトに保存されているため、Firestore データベースを作成する必要はありません。

アプリケーション プロジェクト インフラストラクチャをデプロイする

アプリケーション プロジェクトを構成する Terraform コンポーネントは、次のディレクトリにあります。

このセクションでは、Terraform ファイルを使用して、アプリケーション プロジェクトを構成するコンポーネントをデプロイします。

  1. Cloud Shell で、対応する Terraform 環境変数にプロジェクト ID、リージョン、ゾーン、App Engine のロケーションを設定します。

      export TF_VAR_project_id="${APP_PROJECT_ID}"
      export TF_VAR_region="${APP_REGION}"
      export TF_VAR_zone="${APP_ZONE}"
      export TF_VAR_location="${APP_APP_ENGINE_LOCATION}"
    
  2. オートスケーラーの状態を保存する場所のプロジェクト ID を設定します。

    export TF_VAR_state_project_id="${AUTO_SCALER_PROJECT_ID}"
    

    オートスケーラーの状態には、インスタンスごとにスケーリング イベントがトリガーされた時点のタイムスタンプが含まれます。

  3. オートスケーラーのテスト用に新しい Spanner インスタンスを作成する場合は、次の変数を設定します。

    export TF_VAR_terraform_spanner=true
    

    Terraform が作成する Spanner インスタンスは、autoscale-test という名前になります。

    オートスケーラーが監視するインスタンスがすでにあるため新しい Spanner インスタンスを作成する必要がない場合は、次の変数にインスタンス名を設定します。

    export TF_VAR_spanner_name=INSERT_YOUR_SPANNER_INSTANCE_NAME
    

    Terraform を設定して Spanner インスタンスを管理する方法の詳細については、Spanner インスタンスのインポートをご覧ください。

  4. ディレクトリを Terraform アプリプロジェクト ディレクトリに変更し、初期化します。

    cd "${APP_DIR}"
    terraform init
    
  5. アプリケーション プロジェクトにインフラストラクチャを作成します。

    terraform import module.scheduler.google_app_engine_application.app "${APP_PROJECT_ID}"
    terraform apply -parallelism=2
    

    作成する Terraform のリソースのリストが正しいことを確認し、プロンプトが表示されたら「yes」と入力します。

    Cloud Shell でこのコマンドを実行すると、エラー メッセージ "Error: cannot assign requested address" が表示されることがあります。

    このエラーは、Terraform Google プロバイダの既知の問題です。この場合は、次のコマンドで再試行します。

    terraform apply -parallelism=1
    

フォワーダー Cloud Functions にポーラー トピックへのパブリッシュを許可する

  1. Cloud Shell で、オートスケーラー テラフォーム プロジェクトのディレクトリに戻り、Terraform 変数が正しく設定されていることを確認します。

    cd "${AUTOSCALER_DIR}"
    
    export TF_VAR_project_id="${AUTO_SCALER_PROJECT_ID}"
    export TF_VAR_region="${AUTO_SCALER_REGION}"
    export TF_VAR_zone="${AUTO_SCALER_ZONE}"
    export TF_VAR_location="${AUTO_SCALER_APP_ENGINE_LOCATION}"
    
  2. フォワーダー サービス アカウントの Terraform 変数を設定します。必要に応じて、サービス アカウントを更新して追加します。

     export TF_VAR_forwarder_sa_emails='["serviceAccount:forwarder-sa@'"${APP_PROJECT_ID}"'.iam.gserviceaccount.com"]'
      terraform apply -parallelism=2
    

    作成する Terraform のリソースのリストが正しいことを確認し、プロンプトが表示されたら「yes」と入力します。

    Cloud Shell でこのコマンドを実行すると、エラー メッセージ "Error: cannot assign requested address" が表示されることがあります。

    このエラーは、Terraform Google プロバイダの既知の問題です。この場合は、次のコマンドで再試行します。

    terraform apply -parallelism=1.
    

デプロイの確認

オートスケーラーのインフラストラクチャの準備ができたら、パラメータを構成できます。詳細については、オートスケーラーの構成をご覧ください。

このチュートリアルでは分散デプロイを作成するため、ログのプロパティは次のとおりです。

  • Pollar 関数と Scaler 関数からのログは、オートスケーラー プロジェクトのログ エクスプローラに表示されます。
  • Cloud Scheduler ペイロードの JSON 構成の構文エラーに関するログは、各アプリケーション プロジェクトのログ エクスプローラに表示されます。これにより、特定の Spanner インスタンスを担当するチームは、単独で構成の問題をトラブルシューティングできます。

クリーンアップ

このチュートリアルで使用したリソースについて、Google Cloud アカウントに課金されないようにするには、リソースを含むプロジェクトを削除するか、プロジェクトを維持して個々のリソースを削除します。

プロジェクトの削除

  1. Google Cloud コンソールで、[リソースの管理] ページに移動します。

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

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

次のステップ