Programa operaciones de Workstation con Cloud Scheduler y Cloud Run


En este instructivo, se muestra 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 según un programa regular

En este instructivo, se explica cómo aumentar y disminuir el tamaño del grupo de inicio rápido para que coincida con el horario de atención típico.

Objetivos

  1. Escribe e implementa un servicio de Cloud Run que actualice el tamaño del grupo de inicio rápido para una configuración de estación de trabajo.
  2. Configura un trabajo de Cloud Scheduler que programe el servicio creado en el paso 1 para que se ejecute de 9:00 a.m. a 5:00 p.m., de lunes a viernes, para que coincida con el horario comercial del PST.

Costos

En este documento, usarás los siguientes componentes facturables de Google Cloud:

  • Cloud Scheduler
  • Cloud Run

Para generar una estimación de costos en función del uso previsto, usa la calculadora de precios.

Es posible que los usuarios de Google Cloud nuevos cumplan con los requisitos para acceder a una prueba gratuita.

Cuando completes las tareas que se describen en este documento, podrás borrar los recursos que creaste para evitar que se te siga facturando. Para obtener más información, consulta Realiza una limpieza.

Antes de comenzar

  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 usas un proveedor de identidad externo (IdP), primero debes acceder a 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 usas un proveedor de identidad externo (IdP), primero debes acceder a la CLI de gcloud con tu identidad federada.

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

    gcloud init
  14. Prepare el entorno

    Configura las siguientes variables de entorno, que se usan en las secuencias de comandos automatizadas que crearás más adelante.

    1. Establece las variables PROJECT_ID y REGION que planeas usar:

      PROJECT_ID=$PROJECT_ID
      REGION=$REGION
      

      Reemplaza $REGION por el nombre de la región que planeas usar, por ejemplo, us-central1.

      Para obtener más información sobre las regiones disponibles, consulta 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.
    • Trabajos de Cloud Scheduler para realizar llamadas en un horario establecido y actualizar el WorkstationConfig

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

    Crear un servicio de Cloud Run

    El primer paso es configurar un servidor web simple para que detecte las solicitudes HTTP que recibas en el puerto 8080. Como la aplicación está alojada en un contenedor, 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 nuevo llamado workstation-config-updater y usa el comando de cambio de directorio en él:

      mkdir workstation-config-updater
      cd workstation-config-updater
      
    2. Crea un archivo llamado app.py y pega el código siguiente 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)
      

      Con este código, se crea un servidor web básico que escucha en el puerto definido por la variable de entorno PORT y ejecuta el script update_config.sh.

    3. Crea un archivo llamado update_config.sh y pega el código siguiente 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 en 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 código siguiente 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 aloja la aplicación en un contenedor para que esté lista para implementarse en Cloud Run.

    Implementa en Cloud Run

    Para realizar la implementación en Cloud Run, ejecuta el siguiente comando:

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

    2. Si se te solicita que habilites la API de Artifact Registry o que permitas la creación del repositorio de Artifact Registry, presiona y.

    3. Cuando se te solicite permitir invocaciones no autenticadas, presiona n.

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

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

    SERVICE_URL=$SERVICE_URL
    

    Configura la cuenta de servicio para invocar Cloud Run

    El servicio workstation-config-updater que implementaste no permite invocaciones sin autenticación.

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

    Configura 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 nueva.

      gcloud iam service-accounts create $SERVICE_ACCOUNT_NAME \
          --description="$DESCRIPTION" \
          --display-name="$DISPLAY_NAME"
    2. Agrega la vinculación del rol de IAM necesaria 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

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

    1. Crea un trabajo y especifica el URL que copiaste de Implementar 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 para todos los WorkstationConfigs en WorkstationCluster $CLUSTER a 2 a las 9 a.m. (PST) de lunes a viernes.

      Para obtener más información, consulta Configura programas de trabajo.

    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 laboral, 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 funcionen según lo previsto, puedes verificarlos.

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

      Ir a Cloud Scheduler

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

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

      El primer trabajo creado en un proyecto puede tardar unos minutos en ejecutarse.

    3. En la columna Estado de la última ejecución, el estado Success indica que ejecutaste tu trabajo de forma correcta.

    Para verificar que se hayan actualizado los parámetros de configuración de la estación de trabajo, haz lo siguiente:

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

      Ir a Configuración de estaciones de trabajo

    2. Verifica que el Tamaño de grupo de inicio rápido sea 2.

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

    Limpia

    Para evitar que se apliquen cargos a tu cuenta de Google Cloud por los recursos usados en este instructivo, borra el proyecto que contiene los recursos o conserva el proyecto y borra los recursos individuales.

    Quita el proyecto de prueba

    Para evitar cargos adicionales en tu cuenta de Google Cloud , borra todos los recursos que implementaste con esta guía de inicio rápido.

    Borra tu repositorio

    Cloud Run no te cobra cuando no se usa el servicio implementado. Sin embargo, es posible que se te cobre por almacenar la imagen del contenedor en Artifact Registry. Para borrar repositorios de Artifact Registry, sigue los pasos que se indican en Borra repositorios en la documentación de Artifact Registry.

    Borra tu servicio

    Los servicios de Cloud Run no generan costos hasta que reciben solicitudes. Para borrar tu servicio de Cloud Run, sigue uno de estos pasos:

    Console

    Para borrar un servicio, debes hacer lo siguiente:

    1. En la consola de Google Cloud , ve a Cloud Run:

      Ir a Cloud Run

    2. Buscar el servicio que deseas borrar en la lista de servicios y hacer clic en su casilla de verificación para seleccionarlo

    3. Haz clic en Borrar. Esta acción borra todas las revisiones del servicio

    gcloud

    Para borrar un servicio, ejecuta el siguiente comando:

    gcloud run services delete SERVICE --region REGION

    Reemplaza lo siguiente:

    • SERVICE: Nombre de tu servicio.
    • REGION: Google Cloud Región del servicio.

    Borra tu proyecto de prueba

    Si borras tu proyecto de Google Cloud , se detendrá la facturación de todos los recursos que contenga. Para liberar todos los recursos Google Cloud de tu proyecto, sigue estos pasos:

    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.

    Borra trabajos de Cloud Scheduler

    Para borrar recursos individuales de Cloud Scheduler, haz lo siguiente:

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

      Ir a Cloud Scheduler

    2. Haz clic en las casillas de verificación junto a tus trabajos.

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

    ¿Qué sigue?

    • Explora arquitecturas de referencia, diagramas y prácticas recomendadas sobre Google Cloud. Consulta nuestro Cloud Architecture Center.