このチュートリアルでは、分散デプロイ トポロジを使用して Spanner 用オートスケーラー ツールのインフラストラクチャを設定する方法を説明します。このチュートリアルのデプロイメント オプションでは、オートスケーラーのすべてのコンポーネントが 1 つのプロジェクトにあります。ただし、Cloud Scheduler、フォワーダー トピック、および対応する関数は除きます。
このチュートリアルは、運用上のオーバーヘッドを削減し、Spanner のデプロイの費用を最適化したいと考えている、IT、オペレーション、サイト信頼性エンジニアリング チームを対象としています。このドキュメントはシリーズの一部です。
- Spanner の自動スケーリング
- Spanner 用オートスケーラー ツールのプロジェクト別デプロイと集中デプロイ
- Spanner 用分散オートスケーラー ツールをデプロイする(このドキュメント)
分散デプロイ トポロジでは、次のように、プロジェクトごとのデプロイと集中デプロイの両方の利点が 1 つにまとめられます。
- アプリケーション チームと呼ばれる Spanner インスタンスを所有するチームが、自身が所有する Cloud Scheduler ジョブを使用して、インスタンスのオートスケーラー設定パラメータを管理します。
- 中央のチームが設定パラメータ外で、残りのオートスケーラー インフラストラクチャを管理し、管理オーバーヘッドを最小限に抑えます。
アーキテクチャ
次の図は、分散デプロイ トポロジにおけるオートスケーラーのアーキテクチャを示しています。
オートスケーラーのコンポーネントの説明とイベントのフローの各番号付きステップについては、Spanner の自動スケーリングをご覧ください。
フォワーダー関数
Cloud Scheduler では、同じプロジェクト内のトピックにのみメッセージをパブリッシュできます。そのため、このチュートリアルでは、分散トポロジについて、フォワーダー関数と呼ばれる中間コンポーネントを使用します。
フォワーダー関数は、Cloud Scheduler から Pub/Sub に公開されたメッセージを取得し、JSON 構文をチェックして、ポーラー Pub/Sub トピックに転送します。このトピックは、Cloud Scheduler の別のプロジェクトに属することができます。
次の図は、転送メカニズムに使用されるコンポーネントを示しています。
上の図に示すように、Spanner インスタンスは、Application 1 と Application 2 という名前のプロジェクト内にあります。
- Cloud Scheduler は、Spanner インスタンスと同じプロジェクトです。
(2a)Cloud Scheduler は、Application 1 と Application 2 プロジェクトのフォワーダー トピックにメッセージをパブリッシュします。
(2b)フォワーダー関数は、フォワーダー トピックからメッセージを読み取ります。
(2c)フォワーダー関数は、オートスケーラー プロジェクト内のポーリング トピックにメッセージを転送します。
ポーラー関数は、ポーリング トピックからメッセージを読み取り、Spanner の自動スケーリングで説明するように、プロセスが続行されます。
目標
- 分散デプロイ モデルを使用してオートスケーラーをデプロイする。
- 既存の Spanner インスタンスを Terraform の状態にインポートする。
- オートスケーラーを構成する。
費用
このドキュメントでは、Google Cloud の次の課金対象のコンポーネントを使用します。
料金計算ツールを使うと、予想使用量に基づいて費用の見積もりを生成できます。
このチュートリアルの指示に従う場合、オートスケーラー コンポーネントのオペレーションに関連するコストはゼロか、ほぼゼロになります。ただし、Spanner インスタンスの費用は、この見積もりに含まれません。Spanner インスタンスのコストを計算する方法の例については、Spanner の自動スケーリングをご覧ください。
このドキュメントに記載されているタスクの完了後、作成したリソースを削除すると、それ以上の請求は発生しません。詳細については、クリーンアップをご覧ください。
準備
分散デプロイ トポロジでは、オートスケーラー プロジェクトに加えて 2 つ目のプロジェクトを設定します。このチュートリアルでは、このプロジェクトをアプリケーション プロジェクトと呼びます。アプリケーション プロジェクトは、Spanner を含むアプリケーション リソースを保持します。このチュートリアルでは、この 2 つのプロジェクトの請求と API の請求を分けて設定して有効にします。
-
In the Google Cloud console, activate Cloud Shell.
Cloud Shell で、次のリポジトリのクローンを作成します。
git clone https://github.com/cloudspannerecosystem/autoscaler
作業ディレクトリの変数をエクスポートします。
export AUTOSCALER_DIR="$(pwd)/autoscaler/terraform/cloud-functions/distributed/autoscaler-project" export APP_DIR="$(pwd)/autoscaler/terraform/cloud-functions/distributed/app-project"
オートスケーラー プロジェクトの準備
このセクションでは、プロジェクトのデプロイの準備をします。この中には、Cloud Scheduler 以外のすべての一元化されたオートスケーラー インフラストラクチャが含まれます。
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
Make sure that billing is enabled for your Google Cloud project.
Enable the Identity and Access Management (IAM), Resource Manager, App Engine Admin, Firestore, Spanner, Pub/Sub, Cloud Run functions, and Cloud Build APIs.
Cloud Shell で、オートスケーラー プロジェクトの ID を環境変数に設定します。
export AUTO_SCALER_PROJECT_ID=INSERT_YOUR_PROJECT_ID gcloud config set project "${AUTO_SCALER_PROJECT_ID}"
オートスケーラー インフラストラクチャのリージョンとゾーン、および App Engine のロケーション(Firestore 用)を設定します。
export AUTO_SCALER_REGION=us-central1 export AUTO_SCALER_ZONE=us-central1-c export AUTO_SCALER_APP_ENGINE_LOCATION=us-central
サービス アカウントを作成します。
gcloud iam service-accounts create terraformer --display-name "Terraform service account"
Terraform はこのアカウントを使用して、インフラストラクチャ内のすべてのリソースを作成します。
プロジェクト オーナーのロールをサービス アカウントに付与します。
gcloud projects add-iam-policy-binding "${AUTO_SCALER_PROJECT_ID}" \ --member "serviceAccount:terraformer@${AUTO_SCALER_PROJECT_ID}.iam.gserviceaccount.com" \ --role roles/owner
サービス アカウントのキーファイルを作成します。
gcloud iam service-accounts keys create \ --iam-account "terraformer@${AUTO_SCALER_PROJECT_ID}.iam.gserviceaccount.com" "${AUTOSCALER_DIR}/key.json"
プロジェクトに Firestore インスタンスがない場合は作成します。
gcloud app create --region="${AUTO_SCALER_APP_ENGINE_LOCATION}" gcloud alpha firestore databases create --region="${AUTO_SCALER_APP_ENGINE_LOCATION}"
オートスケーラーのデプロイ
このセクションでは、次のディレクトリにある Terraform ファイルを使用して、オートスケーラーを構成するコンポーネントをデプロイします。
ディレクトリ | ディレクトリの内容 |
---|---|
terraform/ |
最上位の構成。各デプロイ オプションと再利用可能なモジュールが含まれます。 |
|
オートスケーラーが配置されているプロジェクトの構成。オートスケーラー モジュールに委任されます。 |
terraform/modules/autoscaler-functions |
Cloud Run の Poller 関数および Scaler 関数と Pub/Sub のトピックの構成。 |
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}"
ディレクトリを Terraform スケーラー プロジェクト ディレクトリに変更し、初期化します。
cd "${AUTOSCALER_DIR}" terraform init
オートスケーラー インフラストラクチャを作成します。
terraform apply -parallelism=2
リソースの確認後、プロンプトが表示されたら「
yes
」と入力します。Cloud Shell でこのコマンドを実行すると、エラー メッセージ
"Error: cannot assign requested address"
が表示されることがあります。このエラーは、Terraform Google プロバイダの既知の問題です。この場合は、次のコマンドで再試行します。
terraform apply -parallelism=1
アプリケーション プロジェクトの準備
このセクションでは、Spanner インスタンスを含むプロジェクトで、Cloud Scheduler、フォワーダー トピックおよび関数のデプロイを準備します。
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
Make sure that billing is enabled for your Google Cloud project.
Enable the Identity and Access Management, Resource Manager, App Engine Admin, Firestore, Spanner, Pub/Sub, Cloud Run functions, and Cloud Build APIs.
Cloud Shell で、アプリケーション プロジェクトの ID を使用した環境変数を設定します。
export APP_PROJECT_ID=INSERT_YOUR_APP_PROJECT_ID gcloud config set project "${APP_PROJECT_ID}"
アプリケーション プロジェクトのリージョンとゾーンおよび App Engine のロケーションを設定します。
export APP_REGION=us-central1 export APP_ZONE=us-central1-c export APP_APP_ENGINE_LOCATION=us-central
Terraform でインフラストラクチャ内のリソースの作成に使用するサービス アカウントを作成します。
gcloud iam service-accounts create terraformer --display-name "Terraform service account"
プロジェクト オーナーのロール(
roles/owner
)をサービス アカウントに付与します。gcloud projects add-iam-policy-binding "${APP_PROJECT_ID}" \ --member "serviceAccount:terraformer@${APP_PROJECT_ID}.iam.gserviceaccount.com" \ --role roles/owner
サービス アカウントのキーファイルを作成します。
gcloud iam service-accounts keys create \ --iam-account "terraformer@${APP_PROJECT_ID}.iam.gserviceaccount.com" "${APP_DIR}/key.json"
Cloud Scheduler を有効にするアプリケーションを作成します。
gcloud app create --region="${APP_APP_ENGINE_LOCATION}"
状態がオートスケーラー プロジェクトに保存されているため、Firestore データベースを作成する必要はありません。
アプリケーション プロジェクト インフラストラクチャをデプロイする
アプリケーション プロジェクトを構成する Terraform コンポーネントは、次のディレクトリにあります。
terraform/
: 最上位の構成。各デプロイ オプションと再利用可能なモジュールが含まれます。terraform/distributed/app-project/
: Spanner があるアプリケーション プロジェクトの構成。以下のモジュールを使用します。terraform/modules/scheduler/
: ポーリングをトリガーする Cloud Scheduler の構成。terraform/modules/spanner/
: Spanner データベースの構成。terraform/modules/forwarder/
: フォワーダー Cloud Run 関数の構成。
このセクションでは、Terraform ファイルを使用して、アプリケーション プロジェクトを構成するコンポーネントをデプロイします。
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}"
オートスケーラーの状態を保存する場所のプロジェクト ID を設定します。
export TF_VAR_state_project_id="${AUTO_SCALER_PROJECT_ID}"
オートスケーラーの状態には、インスタンスごとにスケーリング イベントがトリガーされた時点のタイムスタンプが含まれます。
オートスケーラーのテスト用に新しい 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 インスタンスのインポートをご覧ください。
ディレクトリを
Terraform
アプリプロジェクト ディレクトリに変更し、初期化します。cd "${APP_DIR}" terraform init
アプリケーション プロジェクトにインフラストラクチャを作成します。
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 Run 関数にポーラー トピックへのパブリッシュを許可する
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}"
フォワーダー サービス アカウントの 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 アカウントに課金されないようにするには、リソースを含むプロジェクトを削除するか、プロジェクトを維持して個々のリソースを削除します。
プロジェクトの削除
- In the Google Cloud console, go to the Manage resources page.
- In the project list, select the project that you want to delete, and then click Delete.
- In the dialog, type the project ID, and then click Shut down to delete the project.
次のステップ
- オートスケーラーのアーキテクチャを確認する。
- プロジェクトごとまたは一元化されたモードでオートスケーラーをデプロイする方法を確認する。
- Spanner の推奨しきい値について確認する。
- Spanner の CPU 使用率の指標とレイテンシの指標の詳細を確認する。
- Spanner のスキーマ設計のベスト プラクティスを確認する。
- Google Cloud に関するリファレンス アーキテクチャ、図、ベスト プラクティスを確認する。Cloud アーキテクチャ センターをご覧ください。