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.

    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 (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. 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.

    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 (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. 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 denominado 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 denominado 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 denominado 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

    Para evitar custos adicionais na sua conta do Google Cloud , elimine todos os recursos implementados com este início rápido.

    Elimine o seu repositório

    O Cloud Run não lhe cobra nada quando o serviço implementado não está a ser usado. No entanto, ainda pode ser cobrado pelo armazenamento da imagem do contentor no Artifact Registry. Para eliminar repositórios do Artifact Registry, siga os passos em Eliminar repositórios na documentação do Artifact Registry.

    Elimine o seu serviço

    Os serviços do Cloud Run não incorrem em custos até receberem pedidos. Para eliminar o seu serviço do Cloud Run, siga um destes passos:

    Consola

    Para eliminar um serviço:

    1. Na Google Cloud consola, aceda ao Cloud Run:

      Aceda ao Cloud Run

    2. Localize o serviço que quer eliminar na lista de serviços e clique na caixa de verificação para o selecionar.

    3. Clique em Eliminar. Esta ação elimina todas as revisões do serviço.

    gcloud

    Para eliminar um serviço, execute o seguinte comando:

    gcloud run services delete SERVICE --region REGION

    Substitua o seguinte:

    • SERVICE: nome do seu serviço.
    • REGION: Google Cloud região do serviço.

    Elimine o projeto de teste

    A eliminação do seu projeto Google Cloud interrompe a faturação de todos os recursos nesse projeto. Para libertar todos os Google Cloud recursos no seu projeto, siga estes passos:

    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?