Programar operaciones de Workstation con Cloud Scheduler y Cloud Run


En este tutorial se explica cómo usar Cloud Scheduler y Cloud Run para realizar automáticamente operaciones como las siguientes:

  • Programar aumentos y disminuciones automáticos del tamaño del grupo de inicio rápido.
  • Iniciar automáticamente las estaciones de trabajo de forma periódica.

En este tutorial se explica cómo aumentar y reducir el tamaño del grupo de inicio rápido para que coincida con el horario de trabajo habitual.

Objetivos

  1. Escribe y despliega un servicio de Cloud Run que actualice el tamaño del grupo de inicio rápido de una configuración de estación de trabajo.
  2. Configura una tarea de Cloud Scheduler que programe el servicio creado en el paso 1 para que se ejecute de 09:00 a 17:00, de lunes a viernes, de acuerdo con el horario de oficina del PST.

Costes

En este documento, se utilizan los siguientes componentes facturables de Google Cloud:

  • Cloud Scheduler
  • Cloud Run

Para generar una estimación de costes basada en el uso previsto, utiliza la calculadora de precios.

Los usuarios nuevos Google Cloud pueden disfrutar de una prueba gratuita.

Cuando termines las tareas que se describen en este documento, puedes evitar que se te siga facturando eliminando los recursos que has creado. Para obtener más información, consulta la sección Limpiar.

Antes de empezar

  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. Verify 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. Si utilizas un proveedor de identidades (IdP) externo, primero debes iniciar sesión en la CLI de gcloud con tu identidad federada.

  7. Para inicializar la CLI de gcloud, ejecuta el siguiente comando:

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

    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.

    Enable the APIs

  11. Install the Google Cloud CLI.

  12. Si utilizas un proveedor de identidades (IdP) externo, primero debes iniciar sesión en la CLI de gcloud con tu identidad federada.

  13. Para inicializar la CLI de gcloud, ejecuta el siguiente comando:

    gcloud init
  14. Preparar el entorno

    Define las siguientes variables de entorno, que utilizan las secuencias de comandos automatizadas que crearás más adelante.

    1. Define las variables PROJECT_ID y REGION que quieras usar:

      PROJECT_ID=$PROJECT_ID
      REGION=$REGION
      

      Sustituye $REGION por el nombre de la región que quieras usar (por ejemplo, us-central1).

      Para obtener más información sobre las regiones disponibles, consulta las ubicaciones de Cloud Workstations.

    Arquitectura de aplicaciones

    Esta solución incluye los siguientes Google Cloud componentes:

    • Cloud Run para actualizar el Tamaño del grupo de inicio rápido de WorkstationConfig.
    • Tareas de Cloud Scheduler para hacer llamadas en una programación definida para actualizar el WorkstationConfig.

    Diagrama de arquitectura del sistema que muestra la programación de operaciones de Workstation mediante Cloud Scheduler y Cloud Run

    Crear un servicio de Cloud Run

    El primer paso consiste en configurar un servidor web sencillo para que escuche las solicitudes HTTP que recibas en el puerto 8080. Como la aplicación está en contenedores, puedes escribir tu servidor en cualquier lenguaje.

    Para escribir la aplicación de escucha del servidor web en Python, haz lo siguiente:

    1. Crea un directorio llamado workstation-config-updater y cambia al directorio:

      mkdir workstation-config-updater
      cd workstation-config-updater
      
    2. Crea un archivo llamado app.py y pega el siguiente código en él:

      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)
      

      Este código crea un servidor web básico que escucha el puerto definido por la variable de entorno PORT y ejecuta la secuencia de comandos update_config.sh.

    3. Crea un archivo llamado update_config.sh y pega el siguiente código en él:

      #!/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
      
      

      Esta secuencia de comandos usa comandos gcloud para enumerar todos los WorkstationConfig de un clúster determinado y actualizar su tamaño de grupo de inicio rápido a POOL_SIZE.

    4. Crea un archivo llamado Dockerfile y pega el siguiente código en él:

      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
      

      Este código genera un contenedor de la aplicación para que esté lista para desplegarse en Cloud Run.

    Desplegar en Cloud Run

    Para desplegar en Cloud Run, ejecuta el siguiente comando:

    gcloud run deploy --source . --project $PROJECT_ID --region $REGION
    1. Cuando se te pida el nombre del servicio, pulsa Intro para aceptar el nombre predeterminado workstation-config-updater.

    2. Si se te pide que habilites la API de Artifact Registry o que permitas la creación de un repositorio de Artifact Registry, pulsa y.

    3. Cuando se te pida que permitas las invocaciones sin autenticar, pulsa n.

    4. Espera a que se complete la implementación.

    5. Cuando la URL del servicio se muestre con el siguiente formato, cópiala:

    SERVICE_URL=$SERVICE_URL
    

    Configurar la cuenta de servicio para invocar Cloud Run

    El servicio workstation-config-updater que has desplegado no permite invocaciones sin autenticar.

    Cloud Scheduler requiere una cuenta de servicio que tenga las credenciales adecuadas para llamar al servicio workstation-config-updater.

    Configurar la cuenta de servicio

    1. Si aún no tienes una cuenta de servicio que quieras usar para los trabajos de Cloud Scheduler, crea una cuenta de servicio.

      gcloud iam service-accounts create $SERVICE_ACCOUNT_NAME \
          --description="$DESCRIPTION" \
          --display-name="$DISPLAY_NAME"
    2. Añade el enlace de rol de gestión de identidades y accesos necesario para permitir que tu cuenta de servicio invoque 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

    Crear una configuración de Cloud Scheduler con autenticación

    1. Crea un trabajo y especifica el URL que has copiado de Desplegar en Cloud Run:

      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

      Este comando programa un trabajo para aumentar el tamaño del grupo de inicio rápido de todos los WorkstationConfigs de WorkstationCluster $CLUSTER a 2 a las 9:00 (PST) de lunes a viernes.

      Para obtener más información, consulta Configurar programaciones de trabajos.

    2. Del mismo modo, para reducir el tamaño del grupo de tu configuración de estación de trabajo a 0 al final de un día de trabajo, ejecuta lo siguiente:

      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

    Opcional: Verifica los trabajos

    Para asegurarte de que tus trabajos funcionan correctamente, puedes verificarlos.

    1. Ve a la página Cloud Scheduler de la consola de Google Cloud .

      Ir a Cloud Scheduler

      workstation-pool-increaser-cron debería aparecer en la lista de tareas.

    2. En la fila del trabajo workstation-pool-increaser-cron, haga clic en Acciones > Forzar la ejecución de un trabajo.

      La primera tarea creada en un proyecto puede tardar unos minutos en ejecutarse.

    3. En la columna Estado de la última ejecución, el estado Success indica que has ejecutado correctamente el trabajo.

    Para verificar que las configuraciones de la estación de trabajo se han actualizado, haz lo siguiente:

    1. Ve a la página Configuraciones de estaciones de trabajo de la Google Cloud consola.

      Ve a Configuraciones de la estación de trabajo.

    2. Comprueba que el tamaño del grupo de inicio rápido sea 2.

    3. Consulta los registros de tu servicio de Cloud Run.

    Limpieza

    Para evitar que los recursos utilizados en este tutorial se cobren en tu cuenta de Google Cloud, elimina el proyecto que contiene los recursos o conserva el proyecto y elimina los recursos.

    Eliminar el proyecto de prueba

    Aunque Cloud Run no aplica cargos cuando el servicio no se está usando, es posible que se te cobre por almacenar la imagen de contenedor en Artifact Registry. Puede eliminar su imagen de contenedor o su proyecto Google Cloud para evitar que se le apliquen cargos. Al eliminar tu Google Cloud proyecto, se detendrá la facturación de todos los recursos utilizados en ese proyecto.

    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.

    Eliminar tareas de Cloud Scheduler

    Para eliminar recursos de Cloud Scheduler concretos,

    1. Ve a la página Cloud Scheduler de la consola de Google Cloud .

      Ir a Cloud Scheduler

    2. Haz clic en las casillas situadas junto a los trabajos.

    3. Haz clic en el botón Eliminar situado en la parte superior de la página y confirma la eliminación.

    Siguientes pasos