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. In the Google Cloud console, go to the Manage resources page.

    Go to Manage resources

  2. In the project list, select the project that you want to delete, and then click Delete.
  3. In the dialog, type the project ID, and then click Shut down to delete the project.

次のステップ