- 自動クイック スタート プールのサイズの増減をスケジューリングします。
- 定期的なスケジュールでワークステーションを自動的に起動する。
このチュートリアルは、通常の営業時間に合わせてクイック スタート プールのサイズを増減するのに役立ちます。
目標
- ワークステーション構成のクイックスタート プールのサイズを更新する Cloud Run サービスを作成してデプロイします。
- 手順 1 で作成したサービスを PST の営業時間に合わせて月曜日から金曜日の 09:00~17:00 に実行するようにスケジュールする Cloud Scheduler ジョブを構成します。
費用
このドキュメントでは、Google Cloud の次の課金対象のコンポーネントを使用します。
- Cloud Scheduler
- Cloud Run
料金計算ツールを使うと、予想使用量に基づいて費用の見積もりを生成できます。
このドキュメントに記載されているタスクの完了後、作成したリソースを削除すると、それ以上の請求は発生しません。詳細については、クリーンアップをご覧ください。
始める前に
- Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
-
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 Cloud Run, Cloud Scheduler, Cloud Workstations APIs.
- Install the Google Cloud CLI.
-
To initialize the gcloud CLI, run the following command:
gcloud init
-
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 Cloud Run, Cloud Scheduler, Cloud Workstations APIs.
- Install the Google Cloud CLI.
-
To initialize the gcloud CLI, run the following command:
gcloud init
環境を準備する
後ほど作成する自動スクリプトで使用する、次の環境変数を設定します。
使用する予定の
PROJECT_ID
変数とREGION
変数を設定します。PROJECT_ID=$PROJECT_ID REGION=$REGION
$REGION は、使用するリージョン名(
us-central1
など)に置き換えます。使用可能なリージョンの詳細については、Cloud Workstations のロケーションをご覧ください。
アプリケーション アーキテクチャ
このソリューションでは、次の Google Cloud コンポーネントを使用します。
WorkstationConfig
のクイック スタート プールのサイズを更新する Cloud Run。- 設定したスケジュールで呼び出しを行い、
WorkstationConfig
を更新する Cloud Scheduler ジョブ。
Cloud Run サービスを作成する。
最初のステップでは、ポート 8080 で受信した HTTP リクエストをリッスンするシンプルなウェブサーバーをセットアップします。アプリケーションはコンテナ化されているため、任意の言語でサーバーを記述できます。
Python でウェブサーバーのリスナー アプリケーションを作成するには、次のようにします。
workstation-config-updater
という名前の新しいディレクトリを作成し、そのディレクトリに移動します。mkdir workstation-config-updater cd workstation-config-updater
app.py
という名前のファイルを作成し、次のコードを貼り付けます。import os, subprocess from flask import Flask, request, abort app = Flask(__name__) @app.route("/", methods=["POST"]) def update(): app.logger.info("Update request received.") data = request.json cluster = data["cluster"] region = data["region"] pool_size = data["pool-size"] path = os.path.join(app.root_path, "update_config.sh") o = subprocess.run( [path, cluster, region, pool_size], stdout=subprocess.PIPE, stderr=subprocess.STDOUT, text=True ) app.logger.info("Sending response:", o.stdout) return o.stdout if __name__ == "__main__": app.run(host="0.0.0.0", port=8080, debug=True)
このコードは、
PORT
環境変数で定義されたポートをリッスンし、スクリプトupdate_config.sh
を実行する基本的なウェブサーバーを作成します。update_config.sh
という名前のファイルを作成し、次のコードを貼り付けます。#!/bin/bash set -e if [ $# -ne 3 ] then echo "Usage: update_config.sh CLUSTER REGION POOL_SIZE" exit 1 fi CLUSTER=$1 REGION=$2 POOL_SIZE=$3 # list workstation configs echo "Attempting to list workstation configs in cluster $CLUSTER and region $REGION ..." for CONFIG in $(gcloud workstations configs list --cluster $CLUSTER --region $REGION --format="value(NAME)"); do echo "Attempting to update Quick Pool Size to $POOL_SIZE for config $CONFIG ..." # update the workstation config pool-size RET=$(gcloud workstations configs update $CONFIG --cluster $CLUSTER --region $REGION --pool-size=$POOL_SIZE) if [[ $RET -eq 0 ]]; then echo "Workstation config $CONFIG updated." else echo "Workstation config $CONFIG update failed." fi done
このスクリプトは、
gcloud
コマンドを使用して特定のクラスタ内のすべてのWorkstationConfig
を一覧表示し、そのクイック スタート プールのサイズをPOOL_SIZE
に更新します。Dockerfile
という名前のファイルを作成し、次のコードを貼り付けます。FROM google/cloud-sdk RUN apt-get update && apt-get install -y python3-pip python3 # Copy local code to the container image. ENV APP_HOME /app WORKDIR $APP_HOME COPY . ./ RUN /bin/bash -c 'ls -la; chmod +x ./update_config.sh' # Install production dependencies. RUN pip3 install Flask gunicorn # Run the web service on container startup CMD exec gunicorn --bind :8080 --workers 1 --threads 8 app:app
このコードは、アプリケーションをコンテナ化して、Cloud Run にデプロイできるようにします。
Cloud Run へのデプロイ
Cloud Run にデプロイするには、次のコマンドを実行します。
gcloud run deploy --source . --project $PROJECT_ID --region $REGION
サービス名の入力を求められたら、Enter キーを押して、デフォルトの名前(
workstation-config-updater
)を受け入れます。Artifact Registry API を有効にするか、Artifact Registry リポジトリの作成を許可するように求められたら、y キーを押します。
未認証の呼び出しの許可を求められたら、n キーを押します。
デプロイが完了するまで待ちます。
サービス URL が次の形式で表示されたら、コピーします。
SERVICE_URL=$SERVICE_URL
サービス アカウントを構成して Cloud Run を呼び出す
デプロイした workstation-config-updater サービスは、未認証の呼び出しを許可していません。
Cloud Scheduler には、workstation-config-updater サービスを呼び出すための適切な認証情報を持つサービス アカウントが必要です。
サービス アカウントを設定する
Cloud Scheduler ジョブに使用するサービス アカウントがまだない場合は、新しいサービス アカウントを作成します。
gcloud iam service-accounts create $SERVICE_ACCOUNT_NAME \ --description="$DESCRIPTION" \ --display-name="$DISPLAY_NAME"
サービス アカウントが Cloud Run を呼び出せるように、必要な IAM ロール バインディングを追加します。
gcloud run services add-iam-policy-binding workstation-config-updater \ --member=serviceAccount:$SERVICE_ACCOUNT_NAME@$PROJECT_ID.iam.gserviceaccount.com \ --region $REGION \ --role=roles/run.invoker
認証を使用する Cloud Scheduler の構成を作成する
ジョブを作成し、Cloud Run へのデプロイでコピーした
URL
を指定します。gcloud scheduler jobs create http workstation-pool-increaser-cron \ --http-method=POST \ --location=us-central1 \ --schedule="0 9 * * 1-5" \ --time-zone="America/Los_Angeles" \ --headers "Content-Type=application/json" \ --message-body='{"cluster":"$CLUSTER", "region":"$REGION", "pool-size": "2"}' \ --uri=$SERVICE_URL \ --oidc-service-account-email=$SERVICE_ACCOUNT_NAME@$PROJECT_ID.iam.gserviceaccount.com
このコマンドは、
WorkstationCluster
$CLUSTER 内のすべてのWorkstationConfigs
のクイック スタート プールのサイズを、月曜日から金曜日の午前 9 時(PST)に 2 に増加させるようにジョブをスケジュールします。詳細については、ジョブ スケジュールの構成をご覧ください。
同様に、営業日の終わりにワークステーション構成のプールサイズを 0 に減らすには、次のコマンドを実行します。
gcloud scheduler jobs create http workstation-pool-decreaser-cron \ --http-method=POST \ --location=$REGION \ --schedule="0 17 * * 1-5" \ --time-zone="America/Los_Angeles" \ --headers "Content-Type=application/json" \ --message-body='{"cluster":"$CLUSTER", "region":"$REGION", "pool-size": "0"}' \ --uri=$SERVICE_URL \ --oidc-service-account-email=$SERVICE-ACCOUNT@$PROJECT_ID.iam.gserviceaccount.com
省略可: ジョブを確認する
ジョブが想定どおりに機能していることを確認するには、ジョブを検証します。
Google Cloud コンソールの [Cloud Scheduler] ページに移動します。
ジョブのリストに
workstation-pool-increaser-cron
が表示されます。workstation-pool-increaser-cron
ジョブの行で、[ アクション] > [ジョブ実行を強制] をクリックします。プロジェクトに作成された最初のジョブを実行するには数分かかることがあります。
[最後の実行のステータス] 列の
Success
ステータスに、あなたのジョブが正常に実行されたことが表示されます。
ワークステーションの構成が更新されたことを確認するには、次の操作を行います。
Google Cloud コンソールで、[ワークステーションの構成] ページに移動します。
クイック スタート プールサイズが 2 であることを確認します。
Cloud Run サービスのログを表示します。
クリーンアップ
このチュートリアルで使用したリソースについて、Google Cloud アカウントに課金されないようにするには、リソースを含むプロジェクトを削除するか、プロジェクトを維持して個々のリソースを削除します。
テスト プロジェクトを削除する
サービスが使用されていない場合、Cloud Run の料金は発生しませんが、コンテナ イメージを Artifact Registry に保存すると課金される場合があります。コンテナ イメージを削除するか、Google Cloud プロジェクトを削除してこのような料金が発生しないようにできます。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.
Cloud Scheduler ジョブを削除する
個々の Cloud Scheduler リソースを削除するには、次の操作を行います。
Google Cloud コンソールの [Cloud Scheduler] ページに移動します。
ジョブの横にあるチェックボックスをクリックします。
ページの上部にある [削除] ボタンをクリックして、削除操作を確定します。
次のステップ
- Google Cloud に関するリファレンス アーキテクチャ、図、ベスト プラクティスを確認する。Cloud アーキテクチャ センターをご覧ください。