Il tuo flusso di lavoro potrebbe dover attendere un processo esterno. Puoi utilizzare i callback HTTP per attendere che un altro servizio effettui una richiesta a un endpoint di callback; questa richiesta riprende l'esecuzione del flusso di lavoro. Puoi anche attendere l'uso del polling.
Anziché utilizzare il polling, questo tutorial mostra come attendere eventi o messaggi Pub/Sub utilizzando i callback HTTP e gli attivatori Eventarc. Sebbene sia possibile attivare un flusso di lavoro con eventi o messaggi Pub/Sub, è consigliabile interrompere l'esecuzione in modo da attendere un altro evento prima di continuare. Ad esempio, un evento attiva un flusso di lavoro per avviare un processo, ma il flusso di lavoro deve attendere un altro evento che segnali il completamento del processo. Per implementare questa funzione, un flusso di lavoro richiama un altro flusso di lavoro.
Obiettivi
In questo tutorial, si verifica quanto segue:
Viene eseguito il deployment e l'esecuzione di un flusso di lavoro principale che deve attendere per gli eventi. Poiché deve attendere il verificarsi degli eventi, archivia i dettagli di callback in un database Firestore in modo che il flusso di lavoro secondario possa recuperarli. Il flusso di lavoro principale attende quindi le chiamate HTTP.
Un flusso di lavoro secondario viene attivato dagli eventi e recupera i dettagli del callback dal database Firestore quando vengono generati gli eventi. Il flusso di lavoro secondario richiama quindi il flusso di lavoro principale che riprende l'esecuzione.
Ecco una panoramica dell'intero processo:
Flusso di lavoro principale:
- Un flusso di lavoro
callback-event-sample
crea endpoint di callback per due origini evento: un argomento Pub/Sub e un bucket Cloud Storage. - Questo flusso di lavoro archivia entrambi gli endpoint di callback in un documento Firestore.
- Questo flusso di lavoro interrompe la sua esecuzione e attende l'arrivo delle richieste HTTP agli endpoint di callback.
Eventi:
- Si verificano eventi: viene pubblicato un messaggio in un argomento Pub/Sub e viene caricato un file in un bucket Cloud Storage.
Flusso di lavoro secondario:
- Eventarc instrada gli eventi al flusso di lavoro
callback-event-listener
e ne attiva l'esecuzione. - Questo flusso di lavoro recupera gli URL appropriati degli endpoint di callback dal documento Firestore.
- Questo flusso di lavoro esegue i callback negli endpoint appropriati nel flusso di lavoro di esempio.
Flusso di lavoro principale:
- Il flusso di lavoro
callback-event-sample
riceve gli eventi negli endpoint di callback e riprende la sua esecuzione. - Questo flusso di lavoro elimina gli URL di callback dal documento Firestore e ne completa l'esecuzione.
Costi
In questo documento vengono utilizzati i seguenti componenti fatturabili di Google Cloud:
Per generare una stima dei costi in base all'utilizzo previsto,
utilizza il Calcolatore prezzi.
Prima di iniziare
Puoi eseguire i comandi seguenti nella console Google Cloud o utilizzando Google Cloud CLI nel terminale o in Cloud Shell.
I vincoli di sicurezza definiti dalla tua organizzazione potrebbero impedirti di completare i passaggi seguenti. Per informazioni sulla risoluzione dei problemi, vedi Sviluppare applicazioni in un ambiente Google Cloud vincolato.
Console
Nella pagina del selettore di progetti della console Google Cloud, seleziona o crea un progetto Google Cloud.
Verifica che la fatturazione sia attivata per il tuo progetto Google Cloud. Scopri come verificare se la fatturazione è abilitata in un progetto.
Abilita le API App Engine, Eventarc, Firestore, Pub/Sub e Workflows.
Crea un account di servizio per il tuo flusso di lavoro da utilizzare per l'autenticazione con altri servizi Google Cloud e concedigli i ruoli appropriati:
Nella console Google Cloud, vai alla pagina Account di servizio.
Per andare alla pagina Crea account di servizio, seleziona il tuo progetto.
Inserisci un nome nel campo Nome account di servizio. La console Google Cloud compila il campo ID account di servizio in base a questo nome.
Inserisci una descrizione nel campo Descrizione account di servizio. Ad esempio,
Service account for tutorial
.Fai clic su Crea e continua.
Nell'elenco Seleziona un ruolo, filtra in base ai seguenti ruoli da concedere all'account di servizio gestito dall'utente che hai creato nel passaggio precedente:
- Utente Cloud Datastore: per accedere ai dati in modalità Datastore (Datastore).
- Ricevitore eventi Eventarc: per ricevere eventi da provider di eventi.
- Writer log: per scrivere i log.
- Workflows Invoker: per eseguire flussi di lavoro e gestire le esecuzioni.
Per ulteriori ruoli, fai clic su
Aggiungi un altro ruolo e aggiungi ogni altro ruolo.Fai clic su Continua.
Per completare la creazione dell'account, fai clic su Fine.
Per creare un trigger Eventarc che instrada gli eventi da Cloud Storage, concedi il ruolo Publisher Pub/Sub all'agente di servizio Cloud Storage. In genere, questo è
service-PROJECT_NUMBER@gs-project-accounts.iam.gserviceaccount.com
. Puoi recuperare l'indirizzo email dell'agente di servizio Cloud Storage.Nella console Google Cloud, vai alla pagina IAM.
Nella riga dell'agente di servizio Cloud Storage, fai clic su
Modifica entità. Se l'agente di servizio non è presente nell'elenco, vai al passaggio successivo. Viene visualizzato il riquadro Modifica accesso.- Fai clic su addAggiungi un altro ruolo e cerca il ruolo Publisher Pub/Sub.
- Seleziona il ruolo.
- Fai clic su Salva.
Se l'agente di servizio non è presente nell'elenco, fai clic su
Concedi accesso. Viene visualizzato il riquadro Concedi l'accesso.- Nel campo Nuove entità, inserisci l'indirizzo email dell'agente di servizio.
- Nell'elenco Seleziona un ruolo, cerca il ruolo Publisher Pub/Sub.
- Seleziona il ruolo.
- Fai clic su Salva.
gcloud
Nella console Google Cloud, attiva Cloud Shell.
Nella parte inferiore della console Google Cloud viene avviata una sessione di Cloud Shell che mostra un prompt della riga di comando. Cloud Shell è un ambiente shell con Google Cloud CLI già installato e con valori già impostati per il progetto attuale. L'inizializzazione della sessione può richiedere alcuni secondi.
Verifica che la fatturazione sia attivata per il tuo progetto Google Cloud. Scopri come verificare se la fatturazione è abilitata in un progetto.
Abilita le API App Engine, Eventarc, Firestore, Pub/Sub e Workflows.
gcloud services enable \ appengine.googleapis.com \ eventarc.googleapis.com \ firestore.googleapis.com \ pubsub.googleapis.com \ workflows.googleapis.com
Crea un account di servizio per il tuo flusso di lavoro da utilizzare per l'autenticazione con altri servizi Google Cloud e assegna i ruoli appropriati.
Crea l'account di servizio:
gcloud iam service-accounts create SERVICE_ACCOUNT_NAME
Sostituisci
SERVICE_ACCOUNT_NAME
con un nome per l'account di servizio.Concedi i ruoli all'account di servizio gestito dall'utente che hai creato nel passaggio precedente. Esegui il comando seguente una volta per ognuno dei seguenti ruoli IAM:
roles/datastore.user
: per accedere ai dati in modalità Datastore (Datastore).roles/eventarc.eventReceiver
: per ricevere eventi da provider di eventi.roles/logging.logWriter
: per scrivere i log.roles/workflows.invoker
: per eseguire flussi di lavoro e gestire le esecuzioni.
gcloud projects add-iam-policy-binding PROJECT_ID \ --member=serviceAccount:SERVICE_ACCOUNT_NAME@PROJECT_ID.iam.gserviceaccount.com \ --role=ROLE
Sostituisci quanto segue:
PROJECT_ID
: l'ID progetto in cui hai creato l'account di servizioROLE
: il ruolo da concedere
Per creare un trigger Eventarc che instrada gli eventi da Cloud Storage, concedi il ruolo Publisher Pub/Sub all'agente di servizio Cloud Storage. In genere, questo è
service-PROJECT_NUMBER@gs-project-accounts.iam.gserviceaccount.com
. Utilizzagsutil kms serviceaccount
per recuperare l'agente di servizio Cloud Storage.SERVICE_ACCOUNT_STORAGE="$(gsutil kms serviceaccount -p PROJECT_ID)" gcloud projects add-iam-policy-binding PROJECT_ID \ --member=serviceAccount:$SERVICE_ACCOUNT_STORAGE \ --role=roles/pubsub.publisher
Crea un database Firestore
Firestore archivia i dati in documenti contenenti campi mappati a valori. Questi documenti sono archiviati in raccolte, container per i tuoi documenti che puoi utilizzare per organizzare i dati e creare query. Scopri di più su Firestore.
Tieni presente che ogni progetto Google Cloud ha un limite di un database Firestore. Completa i seguenti passaggi se devi creare un nuovo database.
Console
Nella console Google Cloud, vai alla pagina Inizia di Firestore.
Fai clic su Seleziona modalità nativa.
Per indicazioni sulla selezione di una modalità di database e per un confronto tra le singole funzionalità, consulta Scegliere tra la modalità Native e la modalità Datastore.
Nell'elenco Seleziona una località, scegli nam5 (Stati Uniti).
La località si applica sia al database Firestore sia all'applicazione App Engine nel tuo progetto Google Cloud. Una volta creato il database, non puoi modificare la località.
Fai clic su Crea database.
gcloud
Per creare un database Firestore, devi prima creare un'applicazione App Engine ed eseguire il comando gcloud firestore databases create
:
gcloud app create --region=us-central gcloud firestore databases create --region=us-central
Puoi ignorare l'avviso us-central is not a valid Firestore location
.
App Engine e Firestore supportano le stesse località,
ma la regione us-central
(Iowa) di App Engine viene mappata
con la regione multiregionale nam5
(Stati Uniti) di
Firestore.
crea un argomento Pub/Sub
Questo tutorial utilizza Pub/Sub come origine evento. Crea un argomento Pub/Sub in modo da potervi pubblicare un messaggio. Scopri di più sulla creazione e sulla gestione degli argomenti.
Console
Nella console Google Cloud, vai alla pagina Argomenti di Pub/Sub.
Fai clic su
Crea argomento.Nel campo ID argomento, inserisci
topic-callback
.Accetta gli altri valori predefiniti.
Fai clic su Crea argomento.
gcloud
Per creare un argomento, esegui il comando gcloud pubsub topics create
:
gcloud pubsub topics create topic-callback
Crea un bucket Cloud Storage
Questo tutorial utilizza Cloud Storage come origine evento. Creare un bucket Cloud Storage in cui caricare un file. Scopri di più sulla creazione di bucket di archiviazione.
Console
Nella console Google Cloud, vai alla pagina Bucket di Cloud Storage.
Fai clic su
Crea.In Nome del bucket, inserisci
PROJECT_ID-bucket-callback
.L'ID progetto viene utilizzato nel flusso di lavoro
callback-event-sample
per identificare il bucket.Fai clic su Continua.
In Tipo di località, seleziona Regione e poi us-central1 (Iowa).
Accetta gli altri valori predefiniti.
Fai clic su Crea.
gcloud
Per creare un bucket, esegui il comando gcloud storage buckets create
:
gcloud storage buckets create gs://PROJECT_ID-bucket-callback \ --location=us-central1
L'ID progetto viene utilizzato nel flusso di lavoro callback-event-sample
per identificare il bucket.
Dopo aver creato le origini eventi, puoi eseguire il deployment del flusso di lavoro relativo ai ricevitori di eventi.
Esegui il deployment di un flusso di lavoro che rimane in ascolto di eventi
Il flusso di lavoro callback-event-listener
viene attivato quando un messaggio viene pubblicato in un argomento Pub/Sub o quando un file viene caricato in un bucket Cloud Storage. Il flusso di lavoro riceve l'evento, recupera i dettagli appropriati del callback dal database Firestore e quindi invia una richiesta HTTP all'endpoint di callback.
Console
Nella console Google Cloud, vai alla pagina Flussi di lavoro:
Fai clic su
Crea.Inserisci un nome per il nuovo flusso di lavoro:
callback-event-listener
.Nell'elenco Regione, seleziona us-central1.
Seleziona l'Account di servizio creato in precedenza.
Tocca Avanti.
Nell'editor del flusso di lavoro, inserisci la definizione seguente per il flusso di lavoro:
Fai clic su Esegui il deployment.
gcloud
Crea un file di codice sorgente per il tuo flusso di lavoro:
touch callback-event-listener.yaml
In un editor di testo, copia il seguente flusso di lavoro nel file di codice sorgente:
Esegui il deployment del flusso di lavoro inserendo il seguente comando:
gcloud workflows deploy callback-event-listener \ --source=callback-event-listener.yaml \ --location=us-central1 \ --service-account=SERVICE_ACCOUNT_NAME@PROJECT_ID.iam.gserviceaccount.com
Sostituisci
SERVICE_ACCOUNT_NAME
con il nome dell'account di servizio che hai creato in precedenza.
Esegui il deployment di un flusso di lavoro che attende gli eventi
Il flusso di lavoro callback-event-sample
memorizza i dettagli del callback in un database Firestore, interrompe la sua esecuzione e attende che si verifichino eventi specifici.
Console
Nella console Google Cloud, vai alla pagina Flussi di lavoro:
Fai clic su
Crea.Inserisci un nome per il nuovo flusso di lavoro:
callback-event-sample
.Nell'elenco Regione, seleziona us-central1.
Seleziona l'Account di servizio creato in precedenza.
Tocca Avanti.
Nell'editor del flusso di lavoro, inserisci la definizione seguente per il flusso di lavoro:
Fai clic su Esegui il deployment.
gcloud
Crea un file di codice sorgente per il tuo flusso di lavoro:
touch callback-event-sample.yaml
In un editor di testo, copia il seguente flusso di lavoro nel file di codice sorgente:
Esegui il deployment del flusso di lavoro inserendo il seguente comando:
gcloud workflows deploy callback-event-sample \ --source=callback-event-sample.yaml \ --location=us-central1 \ --service-account=SERVICE_ACCOUNT_NAME@PROJECT_ID.iam.gserviceaccount.com
Sostituisci
SERVICE_ACCOUNT_NAME
con il nome dell'account di servizio che hai creato in precedenza.
Crea un trigger Eventarc per il routing degli eventi Pub/Sub
Un trigger Eventarc consente di instradare gli eventi specificando i filtri per il trigger, tra cui l'origine evento e il flusso di lavoro di destinazione.
Crea un trigger Eventarc per eseguire il flusso di lavoro callback-event-listener
dopo la pubblicazione di un messaggio in un argomento Pub/Sub.
Scopri di più sull'attivazione di un flusso di lavoro.
Console
Nella console Google Cloud, vai alla pagina Eventarc.
Fai clic su
Crea trigger.Digita un Nome trigger.
Ad esempio,
trigger-pubsub-events-listener
.Nell'elenco Provider di eventi, seleziona Cloud Pub/Sub.
Nell'elenco Evento, in Personalizzato, seleziona google.cloud.pubsub.topic.v1.messagePublished.
Nell'elenco Seleziona un argomento Cloud Pub/Sub, seleziona l'argomento creato in precedenza.
Nell'elenco Regione, seleziona us-central1 (Iowa).
Se richiesto, concedi il ruolo
iam.serviceAccountTokenCreator
all'account di servizio Pub/Sub.Seleziona l'Account di servizio creato in precedenza.
Nell'elenco Destinazione evento, seleziona Flussi di lavoro.
Nell'elenco Seleziona un flusso di lavoro, seleziona il flusso di lavoro callback-event-listener.
Fai clic su Crea.
gcloud
Per creare un trigger, esegui il comando gcloud eventarc triggers create
:
gcloud eventarc triggers create trigger-pubsub-events-listener \ --location=us-central1 \ --destination-workflow=callback-event-listener \ --destination-workflow-location=us-central1 \ --event-filters="type=google.cloud.pubsub.topic.v1.messagePublished" \ --transport-topic=topic-callback \ --service-account=SERVICE_ACCOUNT_NAME@PROJECT_ID.iam.gserviceaccount.com
Gli eventi vengono trasformati e passati all'esecuzione del flusso di lavoro come argomenti di runtime. Tieni presente che possono essere necessari fino a 2 minuti prima che il nuovo attivatore diventi attivo.
Crea un trigger Eventarc per il routing degli eventi di Cloud Storage
Un trigger Eventarc consente di instradare gli eventi specificando i filtri per il trigger, tra cui l'origine evento e il flusso di lavoro di destinazione.
Crea un trigger Eventarc per eseguire il flusso di lavoro callback-event-listener
dopo il caricamento di un file in un bucket Cloud Storage.
Scopri di più sull'attivazione di un flusso di lavoro.
Console
Nella console Google Cloud, vai alla pagina Eventarc.
Fai clic su
Crea trigger.Digita un Nome trigger.
Ad esempio,
trigger-storage-events-listener
.Nell'elenco Provider di eventi, seleziona Cloud Storage.
Nell'elenco Eventi, in Diretto, seleziona google.cloud.storage.object.v1.finalized.
Nell'elenco Bucket, cerca il bucket che hai creato in precedenza e selezionalo.
Nell'elenco Regione, in base al tuo bucket Cloud Storage, accetta il valore predefinito us-central1 (Iowa).
Se richiesto, concedi il ruolo
iam.serviceAccountTokenCreator
all'account di servizio Pub/Sub.Seleziona l'Account di servizio creato in precedenza.
Nell'elenco Destinazione evento, seleziona Flussi di lavoro.
Nell'elenco Seleziona un flusso di lavoro, seleziona il flusso di lavoro callback-event-listener.
Fai clic su Crea.
gcloud
Per creare un trigger, esegui il comando gcloud eventarc triggers create
:
gcloud eventarc triggers create trigger-storage-events-listener \ --location=us-central1 \ --destination-workflow=callback-event-listener \ --destination-workflow-location=us-central1 \ --event-filters="type=google.cloud.storage.object.v1.finalized" \ --event-filters="bucket=PROJECT_ID-bucket-callback" \ --service-account=SERVICE_ACCOUNT_NAME@PROJECT_ID.iam.gserviceaccount.com
Gli eventi vengono trasformati e passati all'esecuzione del flusso di lavoro come argomenti di runtime. Tieni presente che possono essere necessari fino a 2 minuti prima che il nuovo attivatore diventi attivo.
Esegui il flusso di lavoro principale
L'esecuzione di un flusso di lavoro esegue l'attuale definizione del flusso di lavoro associata al flusso di lavoro. Esegui il flusso di lavoro callback-event-sample
. Questo è il flusso di lavoro principale e attende che si verifichino eventi specifici, riprendendo l'esecuzione solo quando il flusso di lavoro secondario effettua le richieste di callback appropriate.
Console
Nella console Google Cloud, vai alla pagina Flussi di lavoro.
Nella pagina Flussi di lavoro, fai clic sul flusso di lavoro callback-event-sample per andare alla relativa pagina dei dettagli.
Nella pagina Dettagli flusso di lavoro, fai clic su play_arrow Esegui.
Fai di nuovo clic su Execute (Esegui).
Viene avviata l'esecuzione del flusso di lavoro. Durante l'esecuzione, dovresti vedere uno stato di esecuzione
Running
e una voce di log simile alla seguente:Started waiting 1hr for an event from source topic-callback
.
gcloud
Per eseguire un flusso di lavoro, esegui il comando gcloud workflows run
:
gcloud workflows run callback-event-sample \ --location=us-central1
Viene avviata l'esecuzione del flusso di lavoro. Durante l'esecuzione, dovresti vedere uno stato di esecuzione simile al seguente:
Waiting for execution [a848a164-268a-449c-b2fe-396f32f2ed66] to complete...working...
Genera eventi e controlla lo stato di esecuzione
Puoi confermare che i risultati siano quelli previsti generando eventi, visualizzando le voci di log e controllando lo stato di esecuzione del flusso di lavoro.
Pubblica un messaggio
Pubblica un messaggio nell'argomento Pub/Sub che hai creato in precedenza.
Console
Nella console Google Cloud, vai alla pagina Argomenti di Pub/Sub.
Fai clic su topic-callback.
Fai clic sulla scheda Messaggi.
Fai clic su Pubblica messaggio.
Nel campo Corpo del messaggio, inserisci
Hello World
.Fai clic su Pubblica.
gcloud
Per pubblicare un messaggio, utilizza il comando gcloud pubsub topics publish:
gcloud pubsub topics publish topic-callback \ --message="Hello World"
Caricamento di un oggetto
Carica un file nel bucket Cloud Storage che hai creato in precedenza.
Console
- Nella console Google Cloud, vai alla pagina Bucket di Cloud Storage.
Fai clic sul nome del bucket che hai creato in precedenza.
Nella scheda Oggetti, esegui una delle seguenti operazioni:
Trascina il file desiderato dal desktop o da gestore di file nel riquadro principale della console Google Cloud.
Fai clic su Carica file, seleziona il file che vuoi caricare e fai clic su Apri.
gcloud
Per caricare un file, esegui il comando gcloud storage cp
:
gcloud storage cp OBJECT_LOCATION gs://PROJECT_ID-bucket-callback/
Sostituisci OBJECT_LOCATION
con il percorso locale dell'oggetto. Ad esempio, random.txt
.
Visualizza le voci di log e lo stato di esecuzione
Verifica che il flusso di lavoro callback-event-sample
sia stato completato correttamente.
Console
Nella console Google Cloud, vai alla pagina Flussi di lavoro.
Nella pagina Flussi di lavoro, fai clic sul flusso di lavoro callback-event-sample per andare alla relativa pagina dei dettagli.
Nella pagina Dettagli flusso di lavoro, fai clic sull'ID esecuzione appropriato per recuperare i dettagli relativi a una determinata esecuzione.
Lo Stato di esecuzione deve essere Riuscito e, nel riquadro Output, dovresti vedere gli eventi Pub/Sub e Cloud Storage ricevuti.
gcloud
Filtra le voci di log e restituisci l'output in formato JSON:
gcloud logging read "resource.type=workflows.googleapis.com/Workflow AND textPayload:calling OR textPayload:waiting" \ --format=json
Cerca voci di log simili a:
"textPayload": "Stopped waiting for an event from source..." "textPayload": "Calling back url https://workflowexecutions.googleapis.com/v1/projects/..." "textPayload": "Started waiting 1hr for an event from source..."
Controlla lo stato dell'ultimo tentativo di esecuzione:
gcloud workflows executions wait-last
Il risultato dovrebbe essere simile al seguente:
Using cached execution name: projects/1085953646031/locations/us-central1/workflows/callback-event-sample/executions/79929e4e-82c1-4da1-b068-f828034c01b7 Waiting for execution [79929e4e-82c1-4da1-b068-f828034c01b7] to complete...done. [...] state: SUCCEEDED
Esegui la pulizia
Se hai creato un nuovo progetto per questo tutorial, elimina il progetto. Se hai utilizzato un progetto esistente e vuoi conservarlo senza le modifiche aggiunte in questo tutorial, elimina le risorse create per il tutorial.
Elimina il progetto
Il modo più semplice per eliminare la fatturazione è eliminare il progetto che hai creato per il tutorial.
Per eliminare il progetto:
- Nella console Google Cloud, vai alla pagina Gestisci risorse.
- Nell'elenco dei progetti, seleziona il progetto che vuoi eliminare, quindi fai clic su Elimina.
- Nella finestra di dialogo, digita l'ID del progetto e fai clic su Chiudi per eliminare il progetto.
Elimina le risorse create in questo tutorial
Passaggi successivi
- Prova il tutorial Crea un flusso di lavoro human-in-the-loop utilizzando i callback.