このチュートリアルでは、Cloud Spanner 用オートスケーラー ツールのインフラストラクチャを設定する方法について説明します。このチュートリアルでは、要件に応じて、2 つの方法でインフラストラクチャを設定します。
- プロジェクトごとのデプロイ トポロジ。このトポロジは、独自のオートスケーラー構成とインフラストラクチャを自分たちで管理したい独立したチームに適しています。また、プロジェクトごとのデプロイ トポロジは、オートスケーラーの機能をテストする出発点としても有用です。
- 一元化されたデプロイ トポロジ。このトポロジは、1 つ以上の Spanner インスタンスの構成とインフラストラクチャを管理する一方で、オートスケーラーのコンポーネントと構成を一元化したいチームに適しています。一元化されたトポロジでは、オートスケーラー プロジェクトに加えて、第二のプロジェクトを設定します。このチュートリアルでは、これをアプリケーション プロジェクトと呼びます。アプリケーション プロジェクトは、Cloud Spanner を含むアプリケーション リソースを保持します。このチュートリアルでは、この 2 つのプロジェクトの請求と API の請求を分けて設定して有効にします。
このドキュメントはシリーズの一部です。
- Spanner の自動スケーリング
- Cloud Spanner 用オートスケーラー ツールのプロジェクト別デプロイと集中デプロイ(このドキュメント)
- Cloud Spanner 用分散オートスケーラー ツールのデプロイ
このシリーズは、運用上のオーバーヘッドを削減し、Cloud Spanner のデプロイコストを最適化したいと考える、IT、オペレーション、サイト信頼性エンジニアリング(SRE)のチームを対象としています。
目標
- プロジェクト別デプロイや集中デプロイのトポロジを使用して、オートスケーラーをデプロイする。
- 既存の Cloud Spanner インスタンスを Terraform の状態にインポートする。
- オートスケーラーを構成する。
費用
このドキュメントでは、Google Cloud の次の課金対象のコンポーネントを使用します。
料金計算ツールを使うと、予想使用量に基づいて費用の見積もりを生成できます。
このチュートリアルを実装する場合、オートスケーラー コンポーネントのオペレーションに関連する費用は、ゼロかほぼゼロになると考えられます。ただし、Cloud Spanner インスタンスの費用は、この見積もりに含まれません。Spanner インスタンスのコストを計算する方法の例については、Spanner の自動スケーリングをご覧ください。
このドキュメントに記載されているタスクの完了後、作成したリソースを削除すると、それ以上の請求は発生しません。詳細については、クリーンアップをご覧ください。
準備
-
In the Google Cloud console, activate Cloud Shell.
Cloud Shell で、次の GitHub リポジトリのクローンを作成します。
git clone https://github.com/cloudspannerecosystem/autoscaler
各トポロジの Terraform 構成ファイルが置かれる作業ディレクトリの変数をエクスポートします。
export AUTOSCALER_DIR="$(pwd)/autoscaler/terraform/cloud-functions/per-project"
オートスケーラー プロジェクトの準備
このセクションでは、デプロイ用のオートスケーラー プロジェクトを準備します。
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, Cloud Build, and Cloud Scheduler APIs.
Cloud Shell で、オートスケーラー プロジェクトの ID を環境変数に設定します。
export PROJECT_ID=INSERT_YOUR_PROJECT_ID gcloud config set project "${PROJECT_ID}"
リージョン、ゾーン、App Engine のロケーション(オートスケーラー インフラストラクチャの Cloud Scheduler と Firestore 用)を設定します。
export REGION=us-central1 export ZONE=us-central1-c export 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 "${PROJECT_ID}" \ --member "serviceAccount:terraformer@${PROJECT_ID}.iam.gserviceaccount.com" \ --role roles/owner
サービス アカウントのキーファイルを作成します。
gcloud iam service-accounts keys create \ --iam-account "terraformer@${PROJECT_ID}.iam.gserviceaccount.com" "${AUTOSCALER_DIR}/key.json"
Firestore インスタンスがプロジェクトにない場合は作成します。
gcloud app create --region="${APP_ENGINE_LOCATION}" gcloud alpha firestore databases create --region="${APP_ENGINE_LOCATION}"
アプリケーション プロジェクトの準備
プロジェクトごとのモードでオートスケーラーをデプロイする場合は、オートスケーラーのデプロイまでスキップできます。
集中デプロイのトポロジでは、オートスケーラーの全コンポーネントが同じプロジェクト内に置かれます。Spanner インスタンスは、別のプロジェクトに配置できます。
このセクションでは、Spanner インスタンスが配置されるアプリケーション プロジェクトを構成します。この Spanner インスタンスは、1 つ以上の特定のアプリケーションに対応します。このチュートリアルでは、これらのアプリケーションを担当するチームは、オートスケーラーのインフラストラクチャと構成を担当するチームとは異なることを前提としています。
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 Spanner API.
Cloud Shell で、環境変数を設定します。
export APP_PROJECT_ID=INSERT_YOUR_APP_PROJECT_ID
INSERT_YOUR_APP_PROJECT_IDINSERT_YOUR_APP_PROJECT_ID をアプリケーション プロジェクトの ID に置き換えます。
アプリケーション プロジェクトで、作成した
terraformer
サービス アカウントにオーナーのロール(roles/owner
)を付与します。gcloud projects add-iam-policy-binding "${APP_PROJECT_ID}" \ --member "serviceAccount:terraformer@${PROJECT_ID}.iam.gserviceaccount.com" \ --role roles/owner
このロールをサービス アカウントに付与すると、リソースを作成できます。
対応する 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/ |
集中デプロイ オプション用の手順。 |
Cloud Shell で、対応する Terraform 環境変数にプロジェクト ID、リージョン、ゾーンを設定します。
export TF_VAR_project_id="${PROJECT_ID}" export TF_VAR_region="${REGION}" export TF_VAR_zone="${ZONE}"
この手順では、オートスケーラーがモニタリングする既存のインスタンスを設定するか、新しいインスタンスを作成して設定します。
既存の 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 インスタンスのインポートをご覧ください。
作業ディレクトリを Terraform のプロジェクトごとのディレクトリに変更します。
cd "${AUTOSCALER_DIR}" terraform init
このコマンドは、Terraform のプロジェクトごとのディレクトリも初期化します。
既存の App Engine アプリケーションを Terraform の状態にインポートします。
terraform import module.scheduler.google_app_engine_application.app "${PROJECT_ID}"
オートスケーラー インフラストラクチャを作成します。
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 にインポートして管理する場合は、このセクションの手順に沿って操作してください。そうしない場合は、オートスケーラーの構成に進んでください。
Cloud Shell で、Spanner インスタンスをリスト出力します。
gcloud spanner instances list
自動スケーリングを設定するインスタンス名で、次の変数を設定します。
SPANNER_INSTANCE_NAME=YOUR_SPANNER_INSTANCE_NAME
空の
google_spanner_instance
リソースを使用して、Terraform 構成ファイルを作成します。echo "resource \"google_spanner_instance\" \"${SPANNER_INSTANCE_NAME}\" {}" > "${SPANNER_INSTANCE_NAME}.tf"
Spanner インスタンスを Terraform の状態にインポートします。
terraform import "google_spanner_instance.${SPANNER_INSTANCE_NAME}" "${SPANNER_INSTANCE_NAME}"
インポートが完了したら、実際のインスタンス属性を使用して、インスタンスの Terraform 構成ファイルを更新します。
terraform state show -no-color "google_spanner_instance.${SPANNER_INSTANCE_NAME}" \ | grep -vE "(id|num_nodes|state|timeouts).*(=|\{)" \ > "${SPANNER_INSTANCE_NAME}.tf"
インポートする追加の Spanner インスタンスがある場合は、インポート プロセスを繰り返します。
オートスケーラーを構成する
オートスケーラーをデプロイした後、そのパラメータを構成します。
Google Cloud Console で、Cloud Scheduler ページに移動します。
オートスケーラーのデプロイによって作成された
poll-main-instance-metrics
ジョブの横にあるチェックボックスをオンにします。[編集] をクリックします。
ペイロード フィールドに示されるオートスケーラーのパラメータを変更します。
ペイロードの例を次に示します。
[ { "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
をご覧ください。変更を保存するには、[更新] をクリックします。
以上でオートスケーラーが構成され、スケジュールされたジョブの次回の実行でインスタンスのモニタリングとスケーリングを開始する準備が整いました。
JSON ペイロードに構文エラーがある場合は、Google Cloud Console の [ログ エクスプローラ] ページで
tf-poller-function
関数からのログエントリとして調査できます。次のようなエラーが表示される場合があります。
SyntaxError: Unexpected token errortext in JSON at position 15 JSON.parse
シンタックス エラーを回避するには、JSON を再フォーマットして検証できるエディタを使用してください。
オートスケーラーのモニタリング
このステップでは、Cloud Run の Poller 関数と Scaler 関数についてのモニタリングを設定します。
Google Cloud コンソールで、[ログ エクスプローラ] ページを開きます。
[クエリのプレビュー] をクリックし、次のフィルタを [クエリビルダー] に入力します。
resource.type="cloud_function" resource.labels.function_name=~"tf-.*-function"
[実行] をクリックします。
クエリ結果で、オートスケーラー関数からのすべてのメッセージを確認できます。ポーラーは 2 分間隔でのみ実行されるため、ログメッセージを受信するためにクエリを再実行することが必要な場合があります。
Cloud Run の Scaler 関数からのメッセージのみを表示するには、[クエリ プレビュー] ボックスをクリックして、[クエリビルダー] テキスト ボックス内の前回のフィルタを次のように置き換えます。
resource.type="cloud_function" resource.labels.function_name="tf-scaler-function"
[クエリを実行] をクリックします。
[クエリ結果] では、フィルタはテキスト ペイロードに適用されているため、スケーリングの候補と決定に関連する Scaler 関数からのメッセージのみが表示されます。
フィルタクエリや同様のフィルタを使用して、ログベースの指標を作成できます。こうした指標は、自動スケーリング イベントの頻度を記録する機能、または Cloud Monitoring のグラフやアラート ポリシーで役立ちます。
オートスケーラーのテスト
このセクションでは、最小インスタンス サイズを変更してログを監視することで、オートスケーラーのオペレーションを確認します。
テストデータベースを使用してオートスケーラーをデプロイすると、オートスケーラーはコンピューティング容量の単位として NODES
を使用するように構成されます。最小サイズ(minSize
)の設定を 2 に変更することで、ツールが機能しているかどうかを確認できます。ツールが期待どおりに動作している場合、Cloud Spanner インスタンスは 2 ノードにスケールアウトします。このチュートリアルに既存のデータベースを使用すると、異なる値が表示されることがあります。
Google Cloud コンソールで、[Cloud Scheduler] ページに移動します。
オートスケーラーのデプロイによって作成された
poll-main-instance-metrics
ジョブの横にあるチェックボックスをオンにします。[編集] をクリックします。
[ジョブ ペイロード] フィールドで、
minSize
の値を1
から2
に変更します。"minSize": 2
変更を保存するには、[更新] をクリックします。
[ログ エクスプローラ] ページに移動します。
[クエリのプレビュー] をクリックし、次のフィルタを [クエリビルダー] に入力します。
resource.type="cloud_function" resource.labels.function_name="tf-scaler-function"
[実行] をクリックします。
次のログメッセージが表示されるまで、[現在の位置に移動] をクリックします。
Scaling spanner instance to 2 NODES
Cloud Spanner が 2 つのノードにスケールアウトしたことを確認するには、Google Cloud コンソールで Cloud Spanner コンソール ページに移動します。
autoscale-test
インスタンスをクリックします。[概要] で、ノード数が 2 になっていることを確認します。このクイックテストでは、オートスケーラーのパラメータを変更してスケールアウト イベント実際に生成します。YCSB などのツールを使用して負荷テストを実行して、オートスケーラーが使用率に基づいてスケーリング イベントをトリガーするシミュレーションを実行できます。
クリーンアップ
このチュートリアルで使用したリソースについて、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 使用率の指標とレイテンシの指標の詳細を確認する。
- Cloud Spanner のスキーマ設計のベスト プラクティスを確認する。
- Google Cloud に関するリファレンス アーキテクチャ、図、ベスト プラクティスを確認する。Cloud アーキテクチャ センターをご覧ください。