Programar operações da estação de trabalho usando o Cloud Scheduler e o Cloud Run


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

  • Programar aumentos e diminuições automáticas do tamanho do pool de início rápido.
  • Inicie estações de trabalho automaticamente em uma programação regular.

Neste tutorial, ajudamos a aumentar e diminuir o tamanho do pool de início rápido para corresponder ao horário de funcionamento normal.

Objetivos

  1. Grave e implante um serviço do Cloud Run que atualiza o tamanho do pool de início rápido para a configuração de uma estação de trabalho.
  2. Configurar um job do Cloud Scheduler que programe o serviço criado na Etapa 1 para ser executado das 9h às 17h, de segunda a sexta-feira, de acordo com o horário comercial PST.

Custos

Neste documento, você 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. Faça login na sua conta do Google Cloud. Se você começou a usar o Google Cloud agora, crie uma conta para avaliar o desempenho de nossos produtos em situações reais. Clientes novos também recebem US$ 300 em créditos para executar, testar e implantar cargas de trabalho.
  2. No console do Google Cloud, na página do seletor de projetos, selecione ou crie um projeto do Google Cloud.

    Acessar o seletor de projetos

  3. Verifique se a cobrança está ativada para o seu projeto do Google Cloud.

  4. Ative as APIs Cloud Run, Cloud Scheduler, Cloud Workstations .

    Ative as APIs

  5. Instale a CLI do Google Cloud.
  6. Para inicializar a CLI gcloud, execute o seguinte comando:

    gcloud init
  7. No console do Google Cloud, na página do seletor de projetos, selecione ou crie um projeto do Google Cloud.

    Acessar o seletor de projetos

  8. Verifique se a cobrança está ativada para o seu projeto do Google Cloud.

  9. Ative as APIs Cloud Run, Cloud Scheduler, Cloud Workstations .

    Ative as APIs

  10. Instale a CLI do Google Cloud.
  11. Para inicializar a CLI gcloud, execute o seguinte comando:

    gcloud init

prepare o ambiente

Defina as variáveis de ambiente a seguir, que são usadas pelos scripts automatizados que você criará posteriormente.

  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 para 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 é conteinerizado, você pode gravar seu servidor em qualquer linguagem.

Para criar o aplicativo listener do servidor da Web em Python, siga estas etapas:

  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 detecta 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 contêiner para que ele esteja pronto para 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 de um 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. Copie o URL de serviço quando ele for exibido no seguinte formato:

SERVICE_URL=$SERVICE_URL

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

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

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

Configurar a conta de serviço

  1. Se você ainda não tiver uma conta de serviço para usar em 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 PST, 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 ao 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 os jobs estejam funcionando conforme o esperado, verifique-os.

  1. Vá para a página Cloud Scheduler no Console do Google Cloud.

    Acessar o Cloud Scheduler

    workstation-pool-increaser-cron deve 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 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 estão atualizadas, faça o seguinte:

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

    Acessar "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 do Google Cloud interrompe o faturamento de todos os recursos usados no projeto.

  1. No Console do Google Cloud, acesse a página Gerenciar recursos.

    Acessar "Gerenciar recursos"

  2. Na lista de projetos, selecione o projeto que você quer excluir e clique em Excluir .
  3. Na caixa de diálogo, digite o ID do projeto e clique em Encerrar para excluí-lo.

Excluir jobs do Cloud Scheduler

Para excluir recursos individuais do Cloud Scheduler,

  1. Vá para a página Cloud Scheduler no Console do 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