Agende operações de estações de trabalho com o Cloud Scheduler e o Cloud Run


Este tutorial mostra como usar o Cloud Scheduler e o Cloud Run para realizar automaticamente operações como

  • Agendar aumentos e diminuições automáticos do tamanho do conjunto de início rápido.
  • Iniciar automaticamente estações de trabalho de acordo com um horário regular.

Este tutorial ajuda a aumentar e diminuir o tamanho do conjunto de início rápido para corresponder ao horário de funcionamento típico.

Objetivos

  1. Escreva e implemente um serviço do Cloud Run que atualize o Tamanho do conjunto de início rápido para uma configuração da estação de trabalho.
  2. Configure uma tarefa do Cloud Scheduler que agende a execução do serviço criado no passo 1 das 09:00 às 17:00, de segunda a sexta-feira, para corresponder ao horário de funcionamento do PST.

Custos

Neste documento, usa os seguintes componentes faturáveis do Google Cloud:

  • Cloud Scheduler
  • Cloud Run

Para gerar uma estimativa de custos com base na sua utilização projetada, use a calculadora de preços.

Os novos Google Cloud utilizadores podem ser elegíveis para uma avaliação gratuita.

Quando terminar as tarefas descritas neste documento, pode evitar a faturação contínua eliminando os recursos que criou. Para mais informações, consulte o artigo Limpe.

Antes de começar

  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. Se estiver a usar um fornecedor de identidade (IdP) externo, primeiro, tem de iniciar sessão na CLI com a sua identidade federada.gcloud

  7. Para inicializar a CLI gcloud, execute o seguinte 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. Se estiver a usar um fornecedor de identidade (IdP) externo, primeiro, tem de iniciar sessão na CLI com a sua identidade federada.gcloud

  13. Para inicializar a CLI gcloud, execute o seguinte comando:

    gcloud init
  14. Prepare o ambiente

    Defina as seguintes variáveis de ambiente, que são usadas pelos scripts automatizados que criar mais tarde.

    1. Defina as variáveis PROJECT_ID e REGION que planeia usar:

      PROJECT_ID=$PROJECT_ID
      REGION=$REGION
      

      Substitua $REGION pelo nome da região que planeia usar, por exemplo, us-central1.

      Para mais informações sobre as regiões disponíveis, consulte o artigo Localizações das Cloud Workstations.

    Arquitetura de aplicações

    Esta solução inclui os seguintes Google Cloud componentes:

    • Cloud Run para atualizar o tamanho do conjunto de início rápido do WorkstationConfig.
    • Tarefas do Cloud Scheduler para fazer chamadas num horário definido para atualizar o WorkstationConfig.

    Diagrama de arquitetura do sistema que mostra o agendamento de operações da estação de trabalho através do Cloud Scheduler e do Cloud Run

    Crie um serviço do Cloud Run

    O primeiro passo é configurar um servidor Web simples para escutar os pedidos HTTP que recebe na porta 8080. Uma vez que a aplicação está contentorizada, pode escrever o seu servidor em qualquer idioma.

    Para escrever a aplicação de ouvinte do servidor Web em Python, faça o seguinte:

    1. Crie um novo diretório com o nome workstation-config-updater e altere o diretório para este:

      mkdir workstation-config-updater
      cd workstation-config-updater
      
    2. Crie um ficheiro com o nome app.py e cole o seguinte código no mesmo:

      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 cria um servidor Web básico que escuta na porta definida pela variável de ambiente PORT e executa o script update_config.sh.

    3. Crie um ficheiro com o nome update_config.sh e cole o seguinte código no mesmo:

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

      Este script usa comandos gcloud para listar todos os WorkstationConfig num determinado cluster e atualizar o respetivo tamanho do conjunto de início rápido para POOL_SIZE.

    4. Crie um ficheiro com o nome Dockerfile e cole o seguinte código no mesmo:

      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 coloca a aplicação num contentor para a preparar para implementação no Cloud Run.

    Implemente no Cloud Run

    Para implementar no Cloud Run, execute o seguinte comando:

    gcloud run deploy --source . --project $PROJECT_ID --region $REGION
    1. Quando lhe for pedido o nome do serviço, prima Enter para aceitar o nome predefinido workstation-config-updater.

    2. Se lhe for pedido que ative a API Artifact Registry ou que permita a criação do repositório do Artifact Registry, prima y.

    3. Quando lhe for pedido que permita invocações não autenticadas, prima n.

    4. Aguarde até que a implementação esteja concluída.

    5. Quando o URL do serviço for apresentado no seguinte formato, copie-o:

    SERVICE_URL=$SERVICE_URL
    

    Configure a conta de serviço para invocar o Cloud Run

    O serviço workstation-config-updater que implementou não permite invocações não autenticadas.

    O Cloud Scheduler requer uma conta de serviço com as credenciais adequadas para chamar o serviço workstation-config-updater.

    Configure a conta de serviço

    1. Se ainda não tiver uma conta de serviço que queira usar para tarefas do Cloud Scheduler, crie uma nova conta de serviço.

      gcloud iam service-accounts create $SERVICE_ACCOUNT_NAME \
          --description="$DESCRIPTION" \
          --display-name="$DISPLAY_NAME"
    2. Adicione a associação de funções do IAM necessária para permitir que a sua conta de serviço invoque o 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

    Crie uma configuração do Cloud Scheduler com autenticação

    1. Crie uma tarefa e especifique o URL que copiou de Implementar no 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 agenda uma tarefa para aumentar o tamanho do conjunto de início rápido para todos os WorkstationConfigs em WorkstationCluster $CLUSTER para 2 às 09:00 (PST) de segunda a sexta-feira.

      Para mais informações, consulte o artigo Configurar programações de tarefas.

    2. Da mesma forma, para reduzir o tamanho do conjunto para 0 na configuração da estação de trabalho no final de um dia de trabalho, execute o seguinte

      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: valide os trabalhos

    Para se certificar de que os trabalhos estão a funcionar conforme esperado, pode validá-los.

    1. Aceda à página Cloud Scheduler na Google Cloud consola.

      Aceda ao Cloud Scheduler

      workstation-pool-increaser-cron deve aparecer na lista de empregos.

    2. Na linha da tarefa workstation-pool-increaser-cron, clique em Ações > Forçar execução de uma tarefa.

      A primeira tarefa criada num projeto pode demorar alguns minutos a ser executada.

    3. Na coluna Estado da última execução, um estado Success indica que executou a tarefa com êxito.

    Para verificar se as configurações da estação de trabalho estão atualizadas, faça o seguinte:

    1. Aceda à página Configurações da estação de trabalho na Google Cloud consola.

      Aceda a Configurações da estação de trabalho

    2. Verifique se a dimensão do conjunto de início rápido é 2.

    3. Veja os registos do seu serviço do Cloud Run.

    Limpar

    Para evitar incorrer em custos na sua conta do Google Cloud pelos recursos usados neste tutorial, elimine o projeto que contém os recursos ou mantenha o projeto e elimine os recursos individuais.

    Remova o projeto de teste

    Embora o Cloud Run não cobre quando o serviço não está em utilização, ainda pode ser-lhe cobrado o armazenamento da imagem do contentor no Artifact Registry. Pode eliminar a imagem do contentor ou eliminar o Google Cloud projeto para evitar incorrer em custos. A eliminação do seu Google Cloud projeto interrompe a faturação de todos os recursos usados nesse projeto.

    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.

    Elimine tarefas do Cloud Scheduler

    Para eliminar recursos individuais do Cloud Scheduler:

    1. Aceda à página Cloud Scheduler na Google Cloud consola.

      Aceda ao Cloud Scheduler

    2. Clique nas caixas de verificação junto aos seus trabalhos.

    3. Clique no botão Eliminar na parte superior da página e confirme a eliminação.

    O que se segue?