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


このチュートリアルでは、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. Google Cloud Console の [プロジェクト セレクタ] ページで、Google Cloud プロジェクトを選択または作成します。

    プロジェクト セレクタに移動

  3. Google Cloud プロジェクトで課金が有効になっていることを確認します

  4. Cloud Run, Cloud Scheduler, Cloud Workstations API を有効にします。

    API を有効にする

  5. Google Cloud CLI をインストールします。
  6. gcloud CLI を初期化するには:

    gcloud init
  7. Google Cloud Console の [プロジェクト セレクタ] ページで、Google Cloud プロジェクトを選択または作成します。

    プロジェクト セレクタに移動

  8. Google Cloud プロジェクトで課金が有効になっていることを確認します

  9. Cloud Run, Cloud Scheduler, Cloud Workstations API を有効にします。

    API を有効にする

  10. Google Cloud CLI をインストールします。
  11. gcloud CLI を初期化するには:

    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. 必要な IAM ロール バインディングを追加して、サービス アカウントで Cloud Run を呼び出せるようにします。

    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. ページの上部にある [削除] ボタンをクリックして、削除操作を確定します。

次のステップ