1. Panoramica
In questo lab creerai un job Cloud Run e configurerai un job Cloud Scheduler. Esegui il deployment del servizio di menu Cymbal Eats utilizzando lo script di configurazione. Creerai un job Cloud Run che effettua chiamate API al servizio di menu di Cymbal Eats. Eseguirai il job utilizzando Google Cloud CLI e configurerai una pianificazione per il job. Verificherai l'esecuzione esaminando i log ed effettuando chiamate API al servizio di menu per confermare l'eliminazione delle voci di menu.
Che cosa sono i job Cloud Run?
Un job Cloud Run esegue un container che non gestisce richieste web, ma esegue attività operative o elaborazione dei dati. Il container eseguirà l'attività e uscirà al termine.
Job di servizio di pulizia
Il job del servizio di pulizia recupererà le voci di menu con stato Non riuscito ed eliminerà. Quando vengono creati nuovi elementi del menu, le immagini vengono analizzate utilizzando l'API Vision per rilevare se si tratta o meno di un alimento. Per le immagini che non superano questa convalida, lo stato delle voci di menu verrà aggiornato a Non riuscito e successivamente eliminato dal job di pulizia.

Cosa imparerai a fare
In questo lab imparerai a:
- Crea job Cloud Run
- Esegui job Cloud Run
- Crea job Cloud Scheduler
- Verifica 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
- 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.



- Il nome del progetto è il nome visualizzato per i partecipanti a questo progetto. È una stringa di caratteri non utilizzata dalle API di Google. Puoi aggiornarlo in qualsiasi momento.
- L'ID progetto è univoco in tutti i progetti Google Cloud ed è immutabile (non può essere modificato dopo l'impostazione). La console Cloud genera automaticamente una stringa univoca, di solito non ti interessa di cosa si tratta. Nella maggior parte dei codelab, devi fare riferimento all'ID progetto (in genere è identificato come
PROJECT_ID). Se non ti piace l'ID generato, puoi generarne un altro casuale. In alternativa, puoi provare a crearne uno e vedere se è disponibile. Non può essere modificato dopo questo passaggio e rimarrà per tutta la durata del progetto. - Per tua informazione, esiste un terzo valore, un numero di progetto, utilizzato da alcune API. Scopri di più su tutti e tre questi valori nella documentazione.
- Successivamente, devi abilitare la fatturazione in Cloud Console per utilizzare le risorse/API Cloud. L'esecuzione di questo codelab non dovrebbe costare molto, se non nulla. Per arrestare le risorse in modo da non incorrere in costi di fatturazione al termine di questo tutorial, puoi eliminare le risorse che hai creato o l'intero progetto. I nuovi utenti di Google Cloud possono beneficiare del programma prova senza costi di 300$.
Configurazione dell'ambiente
Attiva Cloud Shell facendo clic sull'icona a destra della barra di ricerca.

Da Cloud Shell, esegui questo 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
La creazione di tutti i componenti richiesti per il deployment richiede circa 10 minuti.
Continua con i passaggi successivi dopo aver eseguito il comando riportato sopra.
3. Esplora il codice del job Cloud Run
Apri una nuova scheda in Cloud Shell facendo clic sull'icona con il segno più.

Vai alla directory contenente il servizio di pulizia e rivedi 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 container 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 comandi per ottenere un elenco di voci di menu con stato non riuscito ed eliminarle 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 in merito allo script:
- Le variabili di ambiente
FAILED_ITEM_AGEeMENU_SERVICE_URLverranno 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 di 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 container utilizzando Cloud Build ed eseguine il push su 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 e rivedi l'immagine pubblicata:

Torna alla seconda scheda di Cloud Shell. Esegui questo 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 eliminare le voci di menu non riuscite precedenti a 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: STORICO, LOG, CONFIGURAZIONE e YAML.

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

(Facoltativo) Se vuoi modificare le variabili Età elemento non riuscito o URL servizio menu dopo la creazione del 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 eseguendo questo 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 visualizzare l'età dell'articolo non riuscito e l'URL del servizio di menu.

5. Configura 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 lavora con un job Cloud Scheduler consiste nell'eseguire ogni job con credenziali separate. In questo passaggio crea un service account da utilizzare per il job dello scheduler di pulizia.
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 a Cloud Run Jobs.
Concedi il ruolo Cloud Run Invoker al service account 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, configurerai una pianificazione per l'esecuzione del job del servizio di pulizia.
Cloud Scheduler supporta più tipi di target.
- HTTP
- Pub/Sub
- HTTP App Engine
Creerai un job di pianificazione utilizzando il tipo di target HTTP.
A scopo dimostrativo, pianificherai 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
Controlla il parametro uri utilizzato per chiamare Cloud Run Job:
REGIONePROJECT_ID: regione e ID progetto Cloud Run in cui viene eseguito il deployment del job del servizio di puliziacleanup-service: nome del job Cloud Run
Vai a Cloud Scheduler nella console per esaminare il job di pianificazione creato:

Esamina le opzioni disponibili nel menu Azioni.

6. Testa il job Cloud Run
Utilizzando gli endpoint del servizio di menu, esamina le voci di menu esistenti e il loro stato:
curl ${MENU_SERVICE_URL}/menu | jq
Output:
Vedrai tre voci di menu con lo stato Ready.
Modifica lo stato della voce di menu n. 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 avere 1 minuto di vita, come impostato dal parametro FAILED_ITEM_AGE.
Puoi attendere la prossima 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.
- Da Cloud Scheduler selezionando "Forza l'esecuzione di un job" dal menu Azioni.

- Da Cloud Run Job facendo clic sul pulsante "EXECUTE" (ESEGUI).

- Da Cloud Shell eseguendo questo comando:
gcloud beta run jobs execute cleanup-service --region=$REGION
Vai alla sezione Cloud Run JOBS, apri la scheda LOGS e verifica che la voce di menu sia stata eliminata.

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

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 due voci di menu con lo stato Ready.
7. Complimenti!
Congratulazioni, 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
Qual è il passaggio successivo?
Esplora altri codelab di Cymbal Eats:
- Attivazione di Cloud Workflows con Eventarc
- Attivazione dell'elaborazione degli eventi da Cloud Storage
- Connessione a Private CloudSQL da Cloud Run
- Connessione a database completamente gestiti da Cloud Run
- Proteggi l'applicazione serverless con Identity-Aware Proxy (IAP)
- Eseguire il deployment in Cloud Run in modo sicuro
- Protezione del traffico in entrata di Cloud Run
- Connessione ad AlloyDB privato da GKE Autopilot
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 creato per il tutorial.