Cloud Spanner 用オートスケーラー ツールのプロジェクト別デプロイと集中デプロイ


このチュートリアルでは、Cloud Spanner 用オートスケーラー ツールのインフラストラクチャを設定する方法について説明します。このチュートリアルでは、要件に応じて、2 つの方法でインフラストラクチャを設定します。

  • プロジェクトごとのデプロイ トポロジ。このトポロジは、独自のオートスケーラー構成とインフラストラクチャを自分たちで管理したい独立したチームに適しています。また、プロジェクトごとのデプロイ トポロジは、オートスケーラーの機能をテストする出発点としても有用です。
  • 一元化されたデプロイ トポロジ。このトポロジは、1 つ以上の Spanner インスタンスの構成とインフラストラクチャを管理する一方で、オートスケーラーのコンポーネントと構成を一元化したいチームに適しています。一元化されたトポロジでは、オートスケーラー プロジェクトに加えて、第二のプロジェクトを設定します。このチュートリアルでは、これをアプリケーション プロジェクトと呼びます。アプリケーション プロジェクトは、Cloud Spanner を含むアプリケーション リソースを保持します。このチュートリアルでは、この 2 つのプロジェクトの請求と API の請求を分けて設定して有効にします。

このドキュメントはシリーズの一部です。

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

目標

  • プロジェクト別デプロイや集中デプロイのトポロジを使用して、オートスケーラーをデプロイする。
  • 既存の Cloud Spanner インスタンスを Terraform の状態にインポートする。
  • オートスケーラーを構成する。

費用

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

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

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

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

準備

  1. In the Google Cloud console, activate Cloud Shell.

    Activate Cloud Shell

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

    git clone https://github.com/cloudspannerecosystem/autoscaler
    
  3. 各トポロジの Terraform 構成ファイルが置かれる作業ディレクトリの変数をエクスポートします。

    export AUTOSCALER_DIR="$(pwd)/autoscaler/terraform/cloud-functions/per-project"
    

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

このセクションでは、デプロイ用のオートスケーラー プロジェクトを準備します。

  1. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  2. Make sure that billing is enabled for your Google Cloud project.

  3. Enable the Identity and Access Management (IAM), Resource Manager, App Engine Admin, Firestore, Spanner, Pub/Sub, Cloud Run functions, Cloud Build, and Cloud Scheduler APIs.

    Enable the APIs

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

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

    export REGION=us-central1
    export ZONE=us-central1-c
    export 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 "${PROJECT_ID}" \
        --member "serviceAccount:terraformer@${PROJECT_ID}.iam.gserviceaccount.com" \
        --role roles/owner
    
  8. サービス アカウントのキーファイルを作成します。

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

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

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

プロジェクトごとのモードでオートスケーラーをデプロイする場合は、オートスケーラーのデプロイまでスキップできます。

集中デプロイのトポロジでは、オートスケーラーの全コンポーネントが同じプロジェクト内に置かれます。Spanner インスタンスは、別のプロジェクトに配置できます。

このセクションでは、Spanner インスタンスが配置されるアプリケーション プロジェクトを構成します。この Spanner インスタンスは、1 つ以上の特定のアプリケーションに対応します。このチュートリアルでは、これらのアプリケーションを担当するチームは、オートスケーラーのインフラストラクチャと構成を担当するチームとは異なることを前提としています。

  1. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  2. Make sure that billing is enabled for your Google Cloud project.

  3. Enable the Spanner API.

    Enable the API

  4. Cloud Shell で、環境変数を設定します。

    export APP_PROJECT_ID=INSERT_YOUR_APP_PROJECT_ID
    

    INSERT_YOUR_APP_PROJECT_IDINSERT_YOUR_APP_PROJECT_ID をアプリケーション プロジェクトの ID に置き換えます。

  5. アプリケーション プロジェクトで、作成した terraformer サービス アカウントにオーナーのロールroles/owner)を付与します。

    gcloud projects add-iam-policy-binding "${APP_PROJECT_ID}" \
        --member "serviceAccount:terraformer@${PROJECT_ID}.iam.gserviceaccount.com" \
        --role roles/owner
    

    このロールをサービス アカウントに付与すると、リソースを作成できます。

  6. 対応する Terraform の環境変数に、アプリケーション プロジェクト ID を設定します。

    export TF_VAR_app_project_id="${APP_PROJECT_ID}"
    

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

このセクションでは、事前構成された複数の Terraform モジュールを使用して、オートスケーラーを構成するコンポーネントをデプロイします。このモジュールを定義する Terraform ファイルは、次のディレクトリにあります。

ディレクトリ ディレクトリの内容
terraform/ 最上位の構成。各デプロイ オプションと再利用可能なモジュールが含まれます。
terraform/cloud-functions/per-project/ プロジェクトごとのデプロイ オプションの説明。
terraform/modules/autoscaler-functions/ Cloud Run の Poller 関数および Scaler 関数と Pub/Sub のトピックの構成
terraform/modules/scheduler/ ポーリングをトリガーする Cloud Scheduler の構成。
terraform/modules/spanner/ Spanner データベースの構成
terraform/cloud-functions/centralized/ 集中デプロイ オプション用の手順。
  1. Cloud Shell で、対応する Terraform 環境変数にプロジェクト ID、リージョン、ゾーンを設定します。

    export TF_VAR_project_id="${PROJECT_ID}"
    export TF_VAR_region="${REGION}"
    export TF_VAR_zone="${ZONE}"
    
  2. この手順では、オートスケーラーがモニタリングする既存のインスタンスを設定するか、新しいインスタンスを作成して設定します。

    既存の Spanner インスタンスがある場合は、次の変数にインスタンス名を設定します。

    export TF_VAR_spanner_name=INSERT_YOUR_SPANNER_INSTANCE_NAME
    

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

    export TF_VAR_terraform_spanner=true
    

    Terraform によって作成される Spanner インスタンスは autoscale-test という名前になります。

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

  3. 作業ディレクトリを Terraform のプロジェクトごとのディレクトリに変更します。

    cd "${AUTOSCALER_DIR}"
    terraform init
    

    このコマンドは、Terraform のプロジェクトごとのディレクトリも初期化します。

  4. 既存の App Engine アプリケーションを Terraform の状態にインポートします。

    terraform import module.scheduler.google_app_engine_application.app "${PROJECT_ID}"
    
  5. オートスケーラー インフラストラクチャを作成します。

    terraform apply -parallelism=2
    

    Terraform が作成するリソースのリストが正しいことを確認するよう求める次のメッセージが表示されます。

       Do you want to perform these actions?
       Terraform will perform the actions described above.
       Only 'yes' will be accepted to approve.
       Enter a value:
       

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

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

    "Error: cannot assign requested address"

    このエラーは、Terraform Google プロバイダの既知の問題です。この場合は、コマンド「terraform apply -parallelism=1.」で再試行してください。

Spanner インスタンスのインポート

既存の Spanner インスタンスを Terraform にインポートして管理する場合は、このセクションの手順に沿って操作してください。そうしない場合は、オートスケーラーの構成に進んでください。

  1. Cloud Shell で、Spanner インスタンスをリスト出力します。

    gcloud spanner instances list
    
  2. 自動スケーリングを設定するインスタンス名で、次の変数を設定します。

    SPANNER_INSTANCE_NAME=YOUR_SPANNER_INSTANCE_NAME
    
  3. 空の google_spanner_instance リソースを使用して、Terraform 構成ファイルを作成します。

    echo "resource \"google_spanner_instance\" \"${SPANNER_INSTANCE_NAME}\" {}" > "${SPANNER_INSTANCE_NAME}.tf"
    
  4. Spanner インスタンスを Terraform の状態にインポートします。

    terraform import "google_spanner_instance.${SPANNER_INSTANCE_NAME}" "${SPANNER_INSTANCE_NAME}"
    
  5. インポートが完了したら、実際のインスタンス属性を使用して、インスタンスの Terraform 構成ファイルを更新します。

    terraform state show -no-color "google_spanner_instance.${SPANNER_INSTANCE_NAME}" \
        | grep -vE "(id|num_nodes|state|timeouts).*(=|\{)" \
        > "${SPANNER_INSTANCE_NAME}.tf"
    

    インポートする追加の Spanner インスタンスがある場合は、インポート プロセスを繰り返します。

オートスケーラーを構成する

オートスケーラーをデプロイした後、そのパラメータを構成します。

  1. Google Cloud Console で、Cloud Scheduler ページに移動します。

    Cloud Scheduler に移動

  2. オートスケーラーのデプロイによって作成された poll-main-instance-metrics ジョブの横にあるチェックボックスをオンにします。

  3. [編集] をクリックします。

  4. ペイロード フィールドに示されるオートスケーラーのパラメータを変更します。

    ペイロードの例を次に示します。

        [
            {
                "projectId": "my-spanner-project",
                "instanceId": "spanner1",
                "scalerPubSubTopic": "projects/my-spanner-project/topics/spanner-scaling",
                "units": "NODES",
                "minSize": 1,
                "maxSize": 3
            },{
                "projectId": "different-project",
                "instanceId": "another-spanner1",
                "scalerPubSubTopic": "projects/my-spanner-project/topics/spanner-scaling",
                "units": "PROCESSING_UNITS",
                "minSize": 500,
                "maxSize": 3000,
                "scalingMethod": "DIRECT"
            }
        ]
       

    ペイロードは、JSON 配列を使用して定義されます。配列の各要素は、同じオートスケーラー ジョブ スケジュールを共有する Spanner インスタンスを表しています。

    パラメータとそのデフォルト値の詳細については、Poller コンポーネントの README をご覧ください。

  5. 変更を保存するには、[更新] をクリックします。

    以上でオートスケーラーが構成され、スケジュールされたジョブの次回の実行でインスタンスのモニタリングとスケーリングを開始する準備が整いました。

    JSON ペイロードに構文エラーがある場合は、Google Cloud Console の [ログ エクスプローラ] ページで tf-poller-function 関数からのログエントリとして調査できます。

    [ログ エクスプローラ] に移動

    次のようなエラーが表示される場合があります。

    SyntaxError: Unexpected token errortext in JSON at position 15 JSON.parse

    シンタックス エラーを回避するには、JSON を再フォーマットして検証できるエディタを使用してください。

オートスケーラーのモニタリング

このステップでは、Cloud Run の Poller 関数と Scaler 関数についてのモニタリングを設定します。

  1. Google Cloud コンソールで、[ログ エクスプローラ] ページを開きます。

    [ログ エクスプローラ] に移動

  2. [クエリのプレビュー] をクリックし、次のフィルタを [クエリビルダー] に入力します。

    resource.type="cloud_function"
    resource.labels.function_name=~"tf-.*-function"
    
  3. [実行] をクリックします。

    クエリ結果で、オートスケーラー関数からのすべてのメッセージを確認できます。ポーラーは 2 分間隔でのみ実行されるため、ログメッセージを受信するためにクエリを再実行することが必要な場合があります。

  4. Cloud Run の Scaler 関数からのメッセージのみを表示するには、[クエリ プレビュー] ボックスをクリックして、[クエリビルダー] テキスト ボックス内の前回のフィルタを次のように置き換えます。

    resource.type="cloud_function"
    resource.labels.function_name="tf-scaler-function"
    
  5. [クエリを実行] をクリックします。

    [クエリ結果] では、フィルタはテキスト ペイロードに適用されているため、スケーリングの候補と決定に関連する Scaler 関数からのメッセージのみが表示されます。

    フィルタクエリや同様のフィルタを使用して、ログベースの指標を作成できます。こうした指標は、自動スケーリング イベントの頻度を記録する機能、または Cloud Monitoring のグラフやアラート ポリシーで役立ちます。

オートスケーラーのテスト

このセクションでは、最小インスタンス サイズを変更してログを監視することで、オートスケーラーのオペレーションを確認します。

テストデータベースを使用してオートスケーラーをデプロイすると、オートスケーラーはコンピューティング容量の単位として NODES を使用するように構成されます。最小サイズ(minSize)の設定を 2 に変更することで、ツールが機能しているかどうかを確認できます。ツールが期待どおりに動作している場合、Cloud Spanner インスタンスは 2 ノードにスケールアウトします。このチュートリアルに既存のデータベースを使用すると、異なる値が表示されることがあります。

  1. Google Cloud コンソールで、[Cloud Scheduler] ページに移動します。

    Cloud Scheduler に移動

  2. オートスケーラーのデプロイによって作成された poll-main-instance-metrics ジョブの横にあるチェックボックスをオンにします。

  3. [編集] をクリックします。

  4. [ジョブ ペイロード] フィールドで、minSize の値を 1 から 2 に変更します。

    "minSize": 2
    
  5. 変更を保存するには、[更新] をクリックします。

  6. [ログ エクスプローラ] ページに移動します。

    ログ エクスプローラを開く

  7. [クエリのプレビュー] をクリックし、次のフィルタを [クエリビルダー] に入力します。

    resource.type="cloud_function"
    resource.labels.function_name="tf-scaler-function"
    
  8. [実行] をクリックします。

  9. 次のログメッセージが表示されるまで、[現在の位置に移動] をクリックします。

    Scaling spanner instance to 2 NODES

  10. Cloud Spanner が 2 つのノードにスケールアウトしたことを確認するには、Google Cloud コンソールで Cloud Spanner コンソール ページに移動します。

    Spanner に移動

  11. autoscale-test インスタンスをクリックします。

    [概要] で、ノード数が 2 になっていることを確認します。このクイックテストでは、オートスケーラーのパラメータを変更してスケールアウト イベント実際に生成します。YCSB などのツールを使用して負荷テストを実行して、オートスケーラーが使用率に基づいてスケーリング イベントをトリガーするシミュレーションを実行できます。

クリーンアップ

このチュートリアルで使用したリソースについて、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.

次のステップ