Attivazione di job Cloud Run con Cloud Scheduler

1. Panoramica

In questo lab, creerai un job Cloud Run e configurerai un job Cloud Scheduler. Eseguirai il deployment di Cymbal Eats Menu Service utilizzando lo script di configurazione. Creerai un job Cloud Run che effettua chiamate API al servizio di menu Cymbal Eats. Eseguirai il job utilizzando Google Cloud CLI e ne configurerai una pianificazione. Verificherai l'esecuzione esaminando i log ed effettuando chiamate API al servizio di menu per confermare che gli elementi del menu siano stati eliminati.

Che cosa sono i job Cloud Run?

Il job Cloud Run esegue un contenitore che non gestisce le richieste web, ma esegue attività operative o di elaborazione dei dati. Il contenitore eseguirà l'attività ed uscirà al termine.

Job del servizio di pulizia

Il job del servizio di pulizia recupererà gli elementi del menu nello stato Non riuscito ed li eliminerà. Quando vengono creati nuovi elementi del menu, le immagini vengono analizzate utilizzando l'API Vision per rilevare se si tratta di un alimento o meno. Per le immagini che non superano questa convalida, lo stato degli elementi del menu verrà aggiornato in Non riuscito ed eliminato successivamente dal job di pulizia.

d74200f0bd14d350.png

Cosa imparerai a fare

In questo lab imparerai a:

  • Creare job Cloud Run
  • Esegui job Cloud Run
  • Creare job Cloud Scheduler
  • Verificare l'esecuzione dei job

Prerequisiti

  • Questo lab presuppone familiarità con la console Cloud e gli ambienti shell.
  • L'esperienza pregressa con Cloud Run e Cloud Scheduler è utile, ma non obbligatoria.

2. Configurazione e requisiti

Configurazione del progetto cloud

  1. Accedi alla console Google Cloud e crea un nuovo progetto o riutilizzane uno esistente. Se non hai ancora un account Gmail o Google Workspace, devi crearne uno.

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

  • Il nome del progetto è il nome visualizzato per i partecipanti al progetto. Si tratta di una stringa di caratteri non utilizzata dalle API di Google. Puoi aggiornarlo in qualsiasi momento.
  • L'ID progetto è univoco per tutti i progetti Google Cloud ed è immutabile (non può essere modificato dopo essere stato impostato). La console Cloud genera automaticamente una stringa univoca; in genere non è importante quale sia. Nella maggior parte dei codelab, dovrai fare riferimento all'ID progetto (in genere identificato come PROJECT_ID). Se l'ID generato non ti piace, puoi generarne un altro casuale. In alternativa, puoi provare il tuo e vedere se è disponibile. Non può essere modificato dopo questo passaggio e rimarrà invariato per tutta la durata del progetto.
  • Per tua informazione, esiste un terzo valore, un Numero progetto, utilizzato da alcune API. Scopri di più su tutti e tre questi valori nella documentazione.
  1. Successivamente, dovrai abilitare la fatturazione nella console Cloud per utilizzare le API/risorse Cloud. L'esecuzione di questo codelab non dovrebbe costare molto, se non del tutto. Per arrestare le risorse in modo da non generare costi oltre questo tutorial, puoi eliminare le risorse che hai creato o l'intero progetto. I nuovi utenti di Google Cloud possono partecipare al programma Prova senza costi di 300$.

Configurazione dell'ambiente

Attiva Cloud Shell facendo clic sull'icona a destra della barra di ricerca.

eb0157a992f16fa3.png

Da Cloud Shell, esegui il seguente comando per clonare il codice dell'applicazione da questo repository e vai alla directory contenente il servizio di menu:

git clone https://github.com/GoogleCloudPlatform/cymbal-eats.git && cd cymbal-eats/menu-service

Esegui il deployment del servizio Menu utilizzando lo script di configurazione in Cloud Run. Il servizio Menu è un microservizio basato su Java creato con il framework Quarkus che utilizza il database Cloud SQL Postgres per il backend. Il servizio Menu è una dipendenza di runtime per il job Cloud Run che creerai nei passaggi successivi.

./setup.sh

Il deployment richiederà circa 10 minuti per creare tutti i componenti richiesti.

Continua con i passaggi successivi dopo aver eseguito il comando precedente.

3. Esplora il codice del job Cloud Run

Apri una nuova scheda in Cloud Shell facendo clic sull'icona con il segno Più.

45f480cd1b9a995.png

Vai alla directory contenente il servizio di pulizia e controlla i file che compongono il job:

cd ~/cymbal-eats/cleanup-service

Il servizio di pulizia in questa directory contiene un file Dockerfile che definisce l'immagine del contenitore per il job del servizio di pulizia con le dipendenze richieste(httpie, jq).

Dockerfile

FROM ubuntu:latest 
RUN apt-get update && apt-get install -y httpie jq && apt-get clean
COPY script.sh /
RUN chmod +x /script.sh
CMD ["/script.sh"]
ENTRYPOINT ["/bin/bash"]

Lo script di pulizia effettivo, elencato di seguito, contiene i comandi per ottenere un elenco di voci di menu in stato di errore ed eliminarli effettuando chiamate API al servizio Menu.

script.sh

echo "FAILED_ITEM_AGE=$FAILED_ITEM_AGE"
echo "MENU_SERVICE_URL=$MENU_SERVICE_URL"
# Failed items older than FAILED_ITEM_AGE in minutes
for id in $(http GET $MENU_SERVICE_URL/menu/failed | jq '[.[] | select(.updateDateTime < ((now - 60 * (env.FAILED_ITEM_AGE | tonumber) )| strftime("%Y-%m-%dT%H:%M:%S.%f")))]'| jq '.[].id'); do
  echo "Deleting Menu Item : $MENU_SERVICE_URL/menu/$id"
  http GET $MENU_SERVICE_URL/menu/$id
  http DELETE $MENU_SERVICE_URL/menu/$id
done

# Processing items older than FAILED_ITEM_AGE in minutes
for id in $(http GET $MENU_SERVICE_URL/menu/processing | jq '[.[] | select(.updateDateTime < ((now - 60 * (env.FAILED_ITEM_AGE | tonumber))| strftime("%Y-%m-%dT%H:%M:%S.%f")))]'| jq '.[].id'); do
  echo "Deleting Menu Item : $MENU_SERVICE_URL/menu/$id"
  http GET $MENU_SERVICE_URL/menu/$id
  http DELETE $MENU_SERVICE_URL/menu/$id
done

Tieni presente quanto segue sullo script:

  • Le variabili di ambiente FAILED_ITEM_AGE e MENU_SERVICE_URL verranno impostate durante il deployment e passate dal job Cloud Run.
  • FAILED_ITEM_AGE: numero di minuti prima dell'eliminazione dell'elemento non riuscito.
  • MENU_SERVICE_URL - URL del servizio del menu Cymbal Eats.

4. Crea job Cloud Run

Successivamente, creerai un'immagine container e la pubblicherai in Artifact Registry.

Questa immagine container verrà utilizzata per creare un job Cloud Run.

Abilita le API di servizio:

gcloud services enable \
    run.googleapis.com \
    artifactregistry.googleapis.com \
    cloudscheduler.googleapis.com \
    --quiet

Imposta le variabili di ambiente:

export PROJECT_ID=$(gcloud config get-value project)
export PROJECT_NUMBER=$(gcloud projects describe $PROJECT_ID --format='value(projectNumber)')
export PROJECT_NAME=$(gcloud projects describe $PROJECT_ID --format='value(name)')
export REGION=us-east1
export MENU_SERVICE_NAME=menu-service

Crea un nuovo repository Artifact Registry per archiviare le immagini Docker per il job di pulizia:

gcloud artifacts repositories create cymbal-eats --repository-format=docker --location=$REGION

Crea l'immagine del contenitore utilizzando Cloud Build ed eseguine il push in Artifact Registry con un unico comando:

gcloud builds submit -t $REGION-docker.pkg.dev/$PROJECT_NAME/cymbal-eats/cleanup-service:latest

Output di esempio:

DURATION: 35S
SOURCE: gs://cymbal-eats-14906-569_cloudbuild/source/1657126400.933586-dc3e91ec85934a55bb6d2f7012611365.tgz
IMAGES: us-east1-docker.pkg.dev/cymbal-eats-14906-569/cymbal-eats/cleanup-service (+1 more)
STATUS: SUCCESS

Al termine della pubblicazione, vai ad Artifact Registry ed esamina l'immagine pubblicata:

fb95ae38baa7c543.png

Torna alla seconda scheda di Cloud Shell. Esegui il seguente comando per descrivere il servizio Menu e salvare l'URL nella variabile di ambiente. Questa variabile di ambiente verrà utilizzata per configurare il job Cloud Run.

MENU_SERVICE_URL=$(gcloud run services describe $MENU_SERVICE_NAME \
 --region=$REGION \
 --format=json | jq \
 --raw-output ".status.url")

Crea un job Cloud Run per ripulire gli elementi del menu non riusciti più vecchi di 1 minuto [impostato da FAILED_ITEM_AGE].

gcloud beta run jobs create cleanup-service \
  --image=$REGION-docker.pkg.dev/$PROJECT_NAME/cymbal-eats/cleanup-service:latest \
  --set-env-vars MENU_SERVICE_URL=$MENU_SERVICE_URL \
  --set-env-vars FAILED_ITEM_AGE=1 \
  --region $REGION

Output di esempio:

Creating Cloud Run job [cleanup-service] in project [cymbal-eats] region [us-east1]
OK Creating job... Done.
Done.
Job [cleanup-service] has successfully been created.

Vai alla sezione JOB di Cloud Run nella console e controlla il job creato.

Fai clic sul job ed esplora le schede disponibili: STORIA, LOG, CONFIGURAZIONE e YAML.

b12c8e312de3b66.png

Verifica che le variabili di ambiente siano state impostate esaminando la sezione CONFIGURAZIONE del job nella console:

724c2919d05349c8.png

(Facoltativo) Se vuoi modificare le variabili Età articolo non riuscito o URL servizio menu, dopo aver creato il job Cloud Run, puoi utilizzare il comando di aggiornamento:

gcloud beta run jobs update cleanup-service \
  --image=$REGION-docker.pkg.dev/$PROJECT_NAME/cymbal-eats/cleanup-service:latest \
  --set-env-vars MENU_SERVICE_URL=$MENU_SERVICE_URL \
  --set-env-vars FAILED_ITEM_AGE=1 \
  --region $REGION

Per convalidare il job, esegui il job Cloud Run con il seguente comando:

gcloud beta run jobs execute cleanup-service --region=$REGION

Output di esempio:

OK Creating execution... Done.                                   
  OK Provisioning resources...
Done.
Execution [cleanup-service-rlxs4] has successfully started running.

View details about this execution by running:
gcloud beta run jobs executions describe cleanup-service-rlxs4
 

Passa alla scheda LOG per esaminare l'output del job. Nei log dovresti vedere l'età dell'articolo non riuscito e l'URL del servizio di menu.

518cb00036a2561f.png

5. Configurare una pianificazione per il job Cloud Run

Cloud Scheduler è un servizio di livello aziendale completamente gestito per la pianificazione di cron job. Consente di pianificare praticamente qualsiasi job, inclusi job batch, job per big data, operazioni dell'infrastruttura cloud e molto altro ancora.

Una best practice di sicurezza quando si utilizza un job Cloud Scheduler consiste nell'eseguire ogni job con credenziali separate. In questo passaggio, crea un account di servizio da utilizzare dal job di pianificazione del cleanup.

export SCHEDULER_SERVICE_ACCOUNT=cleanup-scheduler-job-sa

gcloud iam service-accounts create ${SCHEDULER_SERVICE_ACCOUNT}

Il job Cloud Scheduler avrà bisogno delle autorizzazioni per effettuare chiamate ai job Cloud Run.

Concedi il ruolo Cloud Run Invoker all'account di servizio utilizzato nel job Cloud Scheduler:

gcloud projects add-iam-policy-binding ${PROJECT_ID} \
  --member="serviceAccount:${SCHEDULER_SERVICE_ACCOUNT}@${PROJECT_ID}.iam.gserviceaccount.com" \
  --role="roles/run.invoker"

Successivamente, dovrai configurare una pianificazione per l'esecuzione del job del servizio di pulizia.

Cloud Scheduler supporta diversi tipi di target.

  • HTTP
  • Pub/Sub
  • HTTP App Engine

Creerai un job di pianificazione utilizzando il tipo di target HTTP.

A scopo dimostrativo, la pianificherà per l'esecuzione ogni 5 minuti.

gcloud scheduler jobs create http cleanup-schedule \
    --location $REGION \
    --schedule="*/5 * * * *" \
    --uri="https://$REGION-run.googleapis.com/apis/run.googleapis.com/v1/namespaces/$PROJECT_ID/jobs/cleanup-service:run" \
    --http-method POST \
    --oauth-service-account-email ${SCHEDULER_SERVICE_ACCOUNT}@${PROJECT_ID}.iam.gserviceaccount.com

Esamina il parametro uri utilizzato per chiamare il job Cloud Run:

  • REGION e PROJECT_ID: regione Cloud Run e ID progetto in cui è dipiegato il job del servizio di pulizia
  • cleanup-service: il nome del job Cloud Run

Vai a Cloud Scheduler nella console per esaminare il job di pianificazione creato:

3bc9120df7fc6ed.png

Esamina le opzioni disponibili nel menu Azioni.

7945908025dd2f2b.png

6. Testa il job Cloud Run

Utilizzando gli endpoint del servizio di menu, controlla le voci di menu esistenti e il relativo stato:

curl ${MENU_SERVICE_URL}/menu | jq

Output:

Vedrai 3 voci di menu con stato Ready.

Modifica lo stato dell'elemento del menu 1 in Failed:

curl -X PUT "${MENU_SERVICE_URL}/menu/1" \
  -H 'Content-Type: application/json' \
  -d '{"status": "Failed"}' | jq

Attendi 1 minuto. Affinché l'elemento del menu venga eliminato, deve essere trascorso 1 minuto, come impostato dal parametro FAILED_ITEM_AGE.

Puoi attendere la successiva esecuzione pianificata o forzare l'esecuzione del job dalla console.

Esistono diversi modi per attivare un job, tramite l'interfaccia utente o dalla riga di comando.

Per questo esempio, esegui il comando in Cloud Shell(opzione 3) per attivare il job.

  1. Da Cloud Scheduler selezionando "Forza l'esecuzione di un job" dal menu Azioni.

6c8cbeae6165ba4a.png

  1. Da Job Cloud Run facendo clic sul pulsante "ESEGUI".

229c22288882b5c3.png

  1. Da Cloud Shell, esegui il seguente comando:
gcloud beta run jobs execute cleanup-service --region=$REGION

Vai alla sezione JOB di Cloud Run, apri la scheda LOG e verifica che l'elemento del menu sia stato eliminato.

50829ae27b135b2d.png

Filtra i log per la parola chiave "eliminazione" per trovarli.

d94fb9e444b1c1b8.png

Utilizza gli endpoint del servizio di menu per controllare le voci di menu esistenti tramite l'endpoint REST.

curl ${MENU_SERVICE_URL}/menu | jq

Output:

Vedrai 2 voci di menu con stato Ready.

7. Complimenti!

Complimenti, hai completato il codelab.

Argomenti trattati:

  • Come creare job Cloud Run
  • Come eseguire i job Cloud Run
  • Come creare job Cloud Scheduler
  • Come verificare l'esecuzione dei job

Passaggi successivi

Esplora altri codelab di Cymbal Eats:

Esegui la pulizia

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.

Elimina il progetto

Il modo più semplice per eliminare la fatturazione è eliminare il progetto che hai creato per il tutorial.