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.

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. Ver registos do seu serviço do Cloud Run.