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.

    Roles required to select or create a project

    • Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
    • Create a project: To create a project, you need the Project Creator role (roles/resourcemanager.projectCreator), which contains the resourcemanager.projects.create permission. Learn how to grant roles.

    Go to project selector

  3. Verify that billing is enabled for your Google Cloud project.

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

    Roles required to enable APIs

    To enable APIs, you need the Service Usage Admin IAM role (roles/serviceusage.serviceUsageAdmin), which contains the serviceusage.services.enable permission. Learn how to grant roles.

    Enable the APIs

  5. Install the Google Cloud CLI.

  6. 外部 ID プロバイダ(IdP)を使用している場合は、まず 連携 ID を使用して gcloud CLI にログインする必要があります。

  7. gcloud CLI を初期化するには、次のコマンドを実行します。

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

    Roles required to select or create a project

    • Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
    • Create a project: To create a project, you need the Project Creator role (roles/resourcemanager.projectCreator), which contains the resourcemanager.projects.create permission. Learn how to grant roles.

    Go to project selector

  9. Verify that billing is enabled for your Google Cloud project.

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

    Roles required to enable APIs

    To enable APIs, you need the Service Usage Admin IAM role (roles/serviceusage.serviceUsageAdmin), which contains the serviceusage.services.enable permission. Learn how to grant roles.

    Enable the APIs

  11. Install the Google Cloud CLI.

  12. 外部 ID プロバイダ(IdP)を使用している場合は、まず 連携 ID を使用して gcloud CLI にログインする必要があります。

  13. gcloud CLI を初期化するには、次のコマンドを実行します。

    gcloud init
  14. 環境を準備する

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

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

    クリーンアップ

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

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

    Google Cloud アカウントで追加料金が発生しないようにするには、このクイックスタートでデプロイしたすべてのリソースを削除します。

    リポジトリを削除する

    デプロイされたサービスが使用されていない場合、Cloud Run の料金は発生しません。ただし、コンテナ イメージを Artifact Registry に保存した場合にも料金が発生する可能性があります。Artifact Registry リポジトリを削除するには、Artifact Registry ドキュメントのリポジトリを削除するの手順を行います。

    サービスを削除する

    Cloud Run サービスの費用は、リクエストを受け取るまでは発生しません。Cloud Run サービスを削除するには、次のいずれかの操作を行います。

    コンソール

    サービスを削除するには:

    1. Google Cloud コンソールで、Cloud Run の [サービス] ページに移動します。

      Cloud Run に移動

    2. 削除するサービスをサービスリストで探し、そのチェックボックスをクリックして選択します。

    3. [削除] をクリックします。これにより、サービスのすべてのリビジョンが削除されます。

    gcloud

    サービスを削除するには、次のコマンドを実行します。

    gcloud run services delete SERVICE --region REGION

    次のように置き換えます。

    • SERVICE: サービスの名前。
    • REGION: サービスの Google Cloud リージョン。

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

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

    次のステップ