Cloud Scheduler と Cloud Run を使用して Workstation オペレーションをスケジュールする

このチュートリアルでは、Cloud Scheduler と Cloud Run を使用して、次のようなオペレーションを自動的に実行する方法について説明します。

  • 自動クイック スタート プールのサイズの増減をスケジューリングします。
  • 定期的なスケジュールでワークステーションを自動的に起動する。

このチュートリアルは、通常の営業時間に合わせてクイック スタート プールのサイズを増減するのに役立ちます。

環境を準備する

後ほど作成する自動スクリプトで使用する、次の環境変数を設定します。

  1. 使用する予定の PROJECT_ID 変数と REGION 変数を設定します。

    PROJECT_ID=$PROJECT_ID
    REGION=$REGION
    

    $REGION は、使用する予定のリージョン名(us-central1 など)に置き換えます。

    使用可能なリージョンの詳細については、Cloud Workstations のロケーションをご覧ください。

アプリケーション アーキテクチャ

このソリューションには、次の Google Cloud コンポーネントが含まれています。

  • WorkstationConfigクイック スタート プールのサイズを更新する Cloud Run
  • 設定したスケジュールで呼び出しを行い、WorkstationConfig を更新する Cloud Scheduler ジョブ

Cloud Scheduler と Cloud Run を使用して Workstation オペレーションをスケジュールする様子を示すシステム アーキテクチャ図

Cloud Run サービスを作成する。

最初のステップでは、ポート 8080 で受信した HTTP リクエストをリッスンするシンプルなウェブサーバーをセットアップします。アプリケーションはコンテナ化されているため、サーバーは任意の言語で記述できます。

Python でウェブサーバーのリスナー アプリケーションを作成するには、次のようにします。

  1. workstation-config-updater という名前の新しいディレクトリを作成し、そのディレクトリに移動します。

    mkdir workstation-config-updater
    cd workstation-config-updater
    
  2. 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 を実行する基本的なウェブサーバーを作成します。

  3. 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 に更新します。

  4. 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
  1. サービス名の入力を求められたら、Enter キーを押して、デフォルトの名前(workstation-config-updater)を受け入れます。

  2. Artifact Registry API を有効にするか、Artifact Registry リポジトリの作成を許可するように求められたら、y キーを押します。

  3. 未認証の呼び出しの許可を求められたら、n キーを押します。

  4. デプロイが完了するまで待ちます。

  5. サービス URL が次の形式で表示されたら、コピーします。

SERVICE_URL=$SERVICE_URL

サービス アカウントを構成して Cloud Run を呼び出す

デプロイした workstation-config-updater サービスで、未認証の呼び出しが許可されていません。

Cloud Scheduler には、workstation-config-updater サービスを呼び出すための適切な認証情報を持つサービス アカウントが必要です。

サービス アカウントを設定する

  1. Cloud Scheduler ジョブに使用するサービス アカウントがまだない場合は、新しいサービス アカウントを作成します。

    gcloud iam service-accounts create $SERVICE_ACCOUNT_NAME \
        --description="$DESCRIPTION" \
        --display-name="$DISPLAY_NAME"
  2. サービス アカウントが 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 の構成を作成する

  1. ジョブを作成し、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 に増加させるようにジョブをスケジュールします。

    詳細については、ジョブ スケジュールの構成をご覧ください。

  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

省略可: ジョブを確認する

ジョブが想定どおりに動作していることを確認するには、ジョブを検証します。

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

    Cloud Scheduler に移動

    ジョブのリストに workstation-pool-increaser-cron が表示されます。

  2. workstation-pool-increaser-cron ジョブの行で、[ アクション] > [ジョブ実行を強制] をクリックします。

    プロジェクトで作成された最初のジョブの実行には数分かかることがあります。

  3. [最後の実行のステータス] 列の Success ステータスに、あなたのジョブが正常に実行されたことが表示されます。

ワークステーション構成が更新されたことを確認する手順は次のとおりです。

  1. Google Cloud コンソールの [ワークステーションの構成] ページに移動します。

    [ワークステーションの構成] に移動

  2. [クイック スタート プールのサイズ] が 2 であることを確認します。

  3. Cloud Run サービスのログを表示します。