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.

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 de 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 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 que queira usar para 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.