Programar operações da Workstation usando o Cloud Scheduler e o Cloud Run


Neste tutorial, mostramos como usar o Cloud Scheduler e o Cloud Run para realizar automaticamente operações como

  • Programação de aumentos e reduções automáticas no tamanho do pool de início rápido.
  • Iniciar automaticamente as estações de trabalho em uma programação regular.

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

Objetivos

  1. Escreva e implante um serviço do Cloud Run que atualiza o Tamanho do pool de início rápido para uma configuração de estação de trabalho.
  2. Configure um job do Cloud Scheduler que agende o serviço criado na etapa 1 para ser executado das 9h às 17h, de segunda a sexta-feira, para corresponder ao horário comercial do PST.

Custos

Neste documento, você vai usar os seguintes componentes faturáveis do Google Cloud:

  • Cloud Scheduler
  • Cloud Run

Para gerar uma estimativa de custo baseada na projeção de uso deste tutorial, use a calculadora de preços.

Novos usuários do Google Cloud podem estar qualificados para uma avaliação gratuita.

Ao concluir as tarefas descritas neste documento, é possível evitar o faturamento contínuo excluindo os recursos criados. Saiba mais em Limpeza.

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 você estiver usando um provedor de identidade externo (IdP), primeiro faça login na CLI gcloud com sua identidade federada.

  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 você estiver usando um provedor de identidade externo (IdP), primeiro faça login na CLI gcloud com sua identidade federada.

  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 você vai criar mais tarde.

    1. Defina as variáveis PROJECT_ID e REGION que você planeja usar:

      PROJECT_ID=$PROJECT_ID
      REGION=$REGION
      

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

      Para mais informações sobre as regiões disponíveis, consulte Locais do Cloud Workstations.

    Arquitetura do aplicativo

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

    • Cloud Run para atualizar o Tamanho do pool de início rápido do WorkstationConfig.
    • Jobs do Cloud Scheduler para fazer chamadas em uma programação definida e atualizar o WorkstationConfig.

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

    Criar um serviço do Cloud Run

    A primeira etapa é configurar um servidor da Web simples para detectar as solicitações HTTP recebidas na porta 8080. Como o aplicativo está em contêineres, é possível escrever o servidor em qualquer linguagem.

    Para escrever o aplicativo listener do servidor da Web em Python, faça o seguinte:

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

      mkdir workstation-config-updater
      cd workstation-config-updater
      
    2. Crie um arquivo chamado app.py e cole o seguinte código nele:

      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)
      

      Esse código cria um servidor da Web básico que realiza detecções na porta definida pela variável de ambiente PORT e executa o script update_config.sh.

    3. Crie um arquivo chamado update_config.sh e cole o seguinte código nele:

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

      Esse script usa comandos gcloud para listar todos os WorkstationConfig em um determinado cluster e atualizar o Tamanho do pool de início rápido para POOL_SIZE.

    4. Crie um arquivo chamado Dockerfile e cole o seguinte código nele:

      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
      

      Esse código coloca o aplicativo em um contêiner para que ele possa ser implantado no Cloud Run.

    Implantar no Cloud Run

    Para implantar no Cloud Run, execute o seguinte comando:

    gcloud run deploy --source . --project $PROJECT_ID --region $REGION
    1. Quando o nome do serviço for solicitado, pressione Enter para aceitar o nome padrão workstation-config-updater.

    2. Se você precisar ativar a API Artifact Registry ou permitir a criação do repositório do Artifact Registry, pressione y.

    3. Quando for solicitado que você permita invocações não autenticadas, pressione n.

    4. Aguarde a conclusão da implantação.

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

    SERVICE_URL=$SERVICE_URL
    

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

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

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

    Configurar a conta de serviço

    1. Se você ainda não tiver uma conta de serviço para usar nos jobs 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 vinculação de papel do IAM necessária para permitir que 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

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

    1. Crie um job e especifique o URL que você copiou de Implantar 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

      Esse comando programa um job para aumentar o tamanho do pool de início rápido de todos os WorkstationConfigs em WorkstationCluster $CLUSTER para 2 às 9h (horário padrão do Pacífico) de segunda a sexta-feira.

      Para mais informações, consulte Como configurar programações de jobs.

    2. Da mesma forma, para reduzir o tamanho do pool da configuração da estação de trabalho para 0 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: verificar os jobs

    Para garantir que seus jobs estejam funcionando conforme o esperado, verifique-os.

    1. Acesse a página Cloud Scheduler no console Google Cloud .

      Acessar o Cloud Scheduler

      workstation-pool-increaser-cron vai aparecer na lista de jobs.

    2. Na linha do job workstation-pool-increaser-cron, clique em Ações > Forçar a execução de um job.

      A primeira execução do primeiro job criado em um projeto pode levar alguns minutos.

    3. Na coluna Status da última execução, o status Success indica que o job foi executado com sucesso.

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

    1. Acesse a página Configurações da estação de trabalho no console Google Cloud .

      Acessar as configurações da estação de trabalho

    2. Verifique se o Tamanho do pool de início rápido é 2.

    3. Confira os registros do serviço do Cloud Run.

    Limpar

    Para evitar cobranças na sua conta do Google Cloud pelos recursos usados no tutorial, exclua o projeto que os contém ou mantenha o projeto e exclua os recursos individuais.

    Remover o projeto de teste

    Ainda que o Cloud Run não gere custos quando o serviço não estiver em uso, é possível que receba cobranças pelo armazenamento da imagem do contêiner no Artifact Registry. É possível excluir sua imagem de contêiner ou excluir seu projeto do Google Cloud para evitar cobranças. A exclusão do projeto Google Cloud interrompe o faturamento de todos os recursos usados nele.

    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.

    Excluir jobs do Cloud Scheduler

    Para excluir recursos individuais do Cloud Scheduler,

    1. Acesse a página Cloud Scheduler no console Google Cloud .

      Acessar o Cloud Scheduler

    2. Clique nas caixas de seleção ao lado dos seus jobs.

    3. Clique no botão Excluir na parte superior da página e confirme.

    A seguir