Pianifica le operazioni della workstation utilizzando Cloud Scheduler e Cloud Run

Questo tutorial mostra come utilizzare Cloud Scheduler e Cloud Run per eseguire automaticamente operazioni come

  • Pianificazione di aumenti e diminuzioni automatici delle dimensioni del pool di avvio rapido.
  • Avvio automatico delle workstation in base a una pianificazione regolare.

Questo tutorial ti aiuta ad aumentare e diminuire le dimensioni del pool di avvio rapido in base ai normali orari di apertura.

Obiettivi

  1. Scrivere ed eseguire il deployment di un servizio Cloud Run che aggiorna le dimensioni del pool di avvio rapido per una configurazione di workstation.
  2. Configurare un job Cloud Scheduler che pianifica l'esecuzione del servizio creato nel passaggio 1 dalle 09:00 alle 17:00, dal lunedì al venerdì, in base agli orari di apertura PST.

Costi

In questo documento vengono utilizzati i seguenti componenti fatturabili di Google Cloud:

  • Cloud Scheduler
  • Cloud Run

Per generare una stima dei costi in base all'utilizzo previsto, utilizza il calcolatore prezzi.

I nuovi Google Cloud utenti potrebbero avere diritto a una prova senza costi.

Al termine delle attività descritte in questo documento, puoi evitare l'addebito di ulteriori costi eliminando le risorse che hai creato. Per saperne di più, consulta Esegui la pulizia.

Prima di iniziare

  1. Accedi al tuo Google Cloud account. Se non conosci Google Cloud, crea un account per valutare le prestazioni dei nostri prodotti in scenari reali. I nuovi clienti ricevono anche 300 $di crediti senza costi per l'esecuzione, il test e il deployment dei workload.
  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. Installa Google Cloud CLI.

  6. Se utilizzi un provider di identità (IdP) esterno, devi prima accedere a gcloud CLI con la tua identità federata.

  7. Per inizializzare la gcloud CLI, esegui questo 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. Installa Google Cloud CLI.

  12. Se utilizzi un provider di identità (IdP) esterno, devi prima accedere a gcloud CLI con la tua identità federata.

  13. Per inizializzare la gcloud CLI, esegui questo comando:

    gcloud init

Prepara l'ambiente

Imposta le seguenti variabili di ambiente, utilizzate dagli script automatizzati che creerai in un secondo momento.

  1. Imposta le variabili PROJECT_ID e REGION che intendi utilizzare:

    PROJECT_ID=$PROJECT_ID
    REGION=$REGION
    

    Sostituisci $REGION con il nome della regione che intendi utilizzare, ad esempio us-central1.

    Per ulteriori informazioni sulle regioni disponibili, vedi Località di Cloud Workstations.

Architettura dell'applicazione

Questa soluzione include i seguenti Google Cloud componenti:

  • Cloud Run per aggiornare le dimensioni del pool di avvio rapido di WorkstationConfig.
  • Job Cloud Scheduler per effettuare chiamate in base a una pianificazione impostata per aggiornare WorkstationConfig.

Diagramma dell'architettura del sistema che mostra la pianificazione delle operazioni di Workstations utilizzando Cloud Scheduler e Cloud Run

Crea un servizio Cloud Run

Il primo passaggio consiste nel configurare un semplice server web per rimanere in ascolto delle richieste HTTP ricevute sulla porta 8080. Poiché l'applicazione è containerizzata, puoi scrivere il server in qualsiasi linguaggio.

Per scrivere l'applicazione di ascolto del server web in Python:

  1. Crea una nuova directory denominata workstation-config-updater e passa alla directory:

    mkdir workstation-config-updater
    cd workstation-config-updater
    
  2. Crea un file denominato app.py e incolla il seguente codice:

    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)
    

    Questo codice crea un server web di base in ascolto sulla porta definita dalla PORT variabile di ambiente ed esegue lo script update_config.sh.

  3. Crea un file denominato update_config.sh e incolla il seguente codice:

    #!/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
    
    

    Questo script utilizza i comandi gcloud per elencare tutti i WorkstationConfig in un determinato cluster e aggiornarne le dimensioni del pool di avvio rapido a POOL_SIZE.

  4. Crea un file denominato Dockerfile e incolla il seguente codice:

    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
    

    Questo codice containerizza l'applicazione per prepararla al deployment su Cloud Run.

Esegui il deployment in Cloud Run

Per eseguire il deployment in Cloud Run, esegui questo comando:

gcloud run deploy --source . --project $PROJECT_ID --region $REGION
  1. Quando ti viene richiesto il nome del servizio, premi Invio per accettare il nome predefinito workstation-config-updater.

  2. Se ti viene richiesto di abilitare l'API Artifact Registry o di consentire la creazione del repository Artifact Registry, premi y.

  3. Quando ti viene chiesto di consentire chiamate non autenticate, premi n.

  4. Attendi il completamento del deployment.

  5. Quando l'URL del servizio viene visualizzato nel seguente formato, copialo:

SERVICE_URL=$SERVICE_URL

Configura il account di servizio per richiamare Cloud Run

Il servizio workstation-config-updater di cui hai eseguito il deployment non consente chiamate non autenticate.

Cloud Scheduler richiede un account di servizio con le credenziali appropriate per chiamare il servizio workstation-config-updater.

Configurare il account di servizio

  1. Se non hai già un account di servizio che vuoi utilizzare per i job Cloud Scheduler, creane uno nuovo.

    gcloud iam service-accounts create $SERVICE_ACCOUNT_NAME \
        --description="$DESCRIPTION" \
        --display-name="$DISPLAY_NAME"
  2. Aggiungi l'associazione di ruoli IAM necessaria per consentire al tuo account di servizio di richiamare 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

Crea una configurazione di Cloud Scheduler con autenticazione

  1. Crea un job e specifica il URL che hai copiato da Esegui il deployment in 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

    Questo comando pianifica un job per aumentare le dimensioni del pool di avvio rapido di tutti i WorkstationConfigs in WorkstationCluster $CLUSTER a 2 alle 9:00 PST dal lunedì al venerdì.

    Per ulteriori informazioni, vedi Configurazione delle pianificazioni dei job.

  2. Allo stesso modo, per ridurre a 0 le dimensioni del pool per la configurazione della workstation alla fine di una giornata lavorativa, esegui il seguente comando:

    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

(Facoltativo) Verifica i job

Per assicurarti che i job funzionino come previsto, puoi verificarli.

  1. Vai alla pagina Cloud Scheduler nella Google Cloud console.

    Vai a Cloud Scheduler

    workstation-pool-increaser-cron dovrebbe essere visualizzato nell'elenco dei job.

  2. Nella riga del job workstation-pool-increaser-cron, fai clic su Azioni > Forza esecuzione di un job.

    L'esecuzione del primo job creato in un progetto può richiedere alcuni minuti.

  3. Nella colonna Stato dell'ultima esecuzione, lo stato Success indica che il job è stato eseguito correttamente.

Per verificare che le configurazioni di Workstations siano aggiornate:

  1. Vai alla pagina Configurazioni di workstation nella Google Cloud console.

    Vai alle configurazioni di workstation

  2. Verifica che le dimensioni del pool di avvio rapido siano 2.

  3. Visualizza i log del servizio Cloud Run.

Libera spazio

Per evitare che al tuo account Google Cloud vengano addebitati costi relativi alle risorse utilizzate in questo tutorial, elimina il progetto che contiene le risorse oppure mantieni il progetto ed elimina le singole risorse.

Rimuovi il progetto di test

Per evitare addebiti aggiuntivi al tuo Google Cloud account, elimina tutte le risorse di cui hai eseguito il deployment con questa guida rapida.

Elimina il repository

Cloud Run non addebita costi quando il servizio di cui hai eseguito il deployment non è in uso. Tuttavia, potresti comunque ricevere addebiti per l'archiviazione dell'immagine container in Artifact Registry. Per eliminare i repository Artifact Registry, segui i passaggi descritti in Eliminare i repository nella documentazione di Artifact Registry.

Elimina il servizio

I servizi Cloud Run non comportano costi finché non ricevono richieste. Per eliminare il servizio Cloud Run, segui uno di questi passaggi:

Console

Per eliminare un servizio:

  1. Nella Google Cloud console, vai alla pagina Servizi di Cloud Run:

    Vai a Cloud Run

  2. Individua il servizio che vuoi eliminare nell'elenco dei servizi e fai clic sulla relativa casella di controllo per selezionarlo.

  3. Fai clic su Elimina. Verranno eliminate tutte le revisioni del servizio.

gcloud

Per eliminare un servizio, esegui questo comando:

gcloud run services delete SERVICE --region REGION

Sostituisci quanto segue:

  • SERVICE: nome del servizio.
  • REGION: Google Cloud regione del servizio.

Elimina il progetto di test

L'eliminazione del progetto interrompe la fatturazione di tutte le risorse del progetto. Google Cloud Per rilasciare tutte le Google Cloud risorse del progetto:

  1. Nella Google Cloud console, vai alla pagina Gestisci risorse.

    Vai a Gestisci risorse

  2. Nell'elenco dei progetti, seleziona il progetto che vuoi eliminare, quindi fai clic su Elimina.
  3. Nella finestra di dialogo, digita l'ID progetto e fai clic su Chiudi per eliminare il progetto.

Elimina i job Cloud Scheduler

Per eliminare le singole risorse Cloud Scheduler,

  1. Vai alla pagina Cloud Scheduler nella Google Cloud console.

    Vai a Cloud Scheduler

  2. Fai clic sulle caselle di controllo accanto ai job.

  3. Fai clic sul pulsante Elimina in alto nella pagina e conferma l'eliminazione.

Passaggi successivi

  • Esplora architetture di riferimento, diagrammi e best practice su Google Cloud. Consulta il nostro Cloud Architecture Center.