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 do 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 de funcionamento típico.

Objetivos

  1. Escreva 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 de funcionamento do PST.

Custos

Neste documento, você vai 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 um teste sem custo financeiro.

Ao concluir as tarefas descritas neste documento, é possível evitar o faturamento contínuo excluindo os recursos criados. Para mais informações, consulte Limpeza.

Antes de começar

  1. Faça login na sua conta do Google Cloud . Se você começou a usar o Google Cloud, 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. 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 role (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. Instale a CLI do Google Cloud.

  6. Ao usar um provedor de identidade (IdP) externo, primeiro faça login na CLI gcloud com sua identidade federada.

  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 role (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. Instale a CLI do Google Cloud.

  12. Ao usar um provedor de identidade (IdP) externo, primeiro faça login na CLI gcloud com sua identidade federada.

  13. Para inicializar a CLI gcloud, execute o seguinte comando:

    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 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 está em contêineres, é possível 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 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. 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

Para evitar cobranças extras na sua conta do Google Cloud , exclua todos os recursos implantados com este guia de início rápido.

Excluir o repositório

O Cloud Run não cobra quando o serviço implantado não está em uso. No entanto, ainda é possível receber cobranças pelo armazenamento da imagem do contêiner no Artifact Registry. Para excluir repositórios do Artifact Registry, siga as etapas em Excluir repositórios na documentação do Artifact Registry.

Excluir o serviço

Os serviços do Cloud Run não geram custos até receberem solicitações. Para excluir o serviço do Cloud Run, siga uma destas etapas:

Console

Para excluir um serviço, realize as etapas a seguir:

  1. No console do Google Cloud , acesse a página Serviços do Cloud Run:

    Acessar o Cloud Run

  2. Localize o serviço que você quer excluir na lista de serviços e clique na caixa de seleção para marcá-lo.

  3. Clique em Excluir. Isso excluirá todas as revisões do serviço.

gcloud

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

gcloud run services delete SERVICE --region REGION

Substitua:

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

Excluir o projeto de teste

A exclusão do projeto Google Cloud interrompe o faturamento de todos os recursos nele. Para liberar todos os recursos Google Cloud no seu projeto, siga estas etapas:

  1. No console 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. Acesse a página Cloud Scheduler no console 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