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


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

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

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

目標

  1. ワークステーション構成のクイックスタート プールのサイズを更新する Cloud Run サービスを作成してデプロイします。
  2. 手順 1 で作成したサービスを PST の営業時間に合わせて月曜日から金曜日の 09:00~17:00 に実行するようにスケジュールする Cloud Scheduler ジョブを構成します。

費用

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

  • Cloud Scheduler
  • Cloud Run

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

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

始める前に

  1. 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.
  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

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

  4. Enable the Cloud Run, Cloud Scheduler, Cloud Workstations APIs.

    Enable the APIs

  5. Install the Google Cloud CLI.
  6. To initialize the gcloud CLI, run the following command:

    gcloud init
  7. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

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

  9. Enable the Cloud Run, Cloud Scheduler, Cloud Workstations APIs.

    Enable the APIs

  10. Install the Google Cloud CLI.
  11. To initialize the gcloud CLI, run the following command:

    gcloud init

環境を準備する

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

  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 を使用したワークステーション オペレーションのスケジューリングを示すシステム アーキテクチャ図

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 サービスのログを表示します。

クリーンアップ

このチュートリアルで使用したリソースについて、Google Cloud アカウントに課金されないようにするには、リソースを含むプロジェクトを削除するか、プロジェクトを維持して個々のリソースを削除します。

テスト プロジェクトを削除する

サービスが使用されていない場合、Cloud Run の料金は発生しませんが、コンテナ イメージを Artifact Registry に保存すると課金される場合があります。コンテナ イメージを削除するか、Google Cloud プロジェクトを削除してこのような料金が発生しないようにできます。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.

Cloud Scheduler ジョブを削除する

個々の Cloud Scheduler リソースを削除するには、次の操作を行います。

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

    Cloud Scheduler に移動

  2. ジョブの横にあるチェックボックスをクリックします。

  3. ページの上部にある [削除] ボタンをクリックして、削除操作を確定します。

次のステップ