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 operações automaticamente, como

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

Este tutorial ajuda 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 atualize 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 fuso horário do Pacífico.

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. 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. Make sure 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. To initialize the gcloud CLI, run the following command:

    gcloud init
  7. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  8. Make sure that billing is enabled for your Google Cloud project.

  9. Enable the Cloud Run, Cloud Scheduler, Cloud Workstations APIs.

    Enable the APIs

  10. Install the Google Cloud CLI.
  11. To initialize the gcloud CLI, run the following command:

    gcloud init

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 para atualizar o WorkstationConfig.

Diagrama de arquitetura do sistema que mostra a programação de operações da Workstation 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 escrever o servidor em qualquer idioma.

Para escrever o aplicativo de 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 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 conteineriza o aplicativo 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 aparecer no formato a seguir, copie-o:

SERVICE_URL=$SERVICE_URL

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

O serviço workstation-config-updater que você implantou 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 a 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 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 verificar se os jobs estão funcionando conforme o esperado, você pode fazer a verificação.

  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.

Para verificar se as configurações da Workstation foram atualizadas, faça o seguinte:

  1. Acesse a página Configurações da estação de trabalho no console do 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. Acesse 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. 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. 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