Questo tutorial mostra come utilizzare Workflows per collegare una serie di servizi. Se colleghi due servizi HTTP pubblici (utilizzando le funzioni Cloud Run), un'API REST esterna e un servizio Cloud Run privato, puoi creare un'applicazione serverless flessibile.
Obiettivi
In questo tutorial utilizzi Google Cloud CLI per creare un singolo flusso di lavoro, collegando un servizio alla volta:
- Esegui il deployment di due servizi di funzioni Cloud Run: la prima funzione genera un numero casuale e lo passa alla seconda funzione che lo moltiplica.
- Utilizzando Workflows, collega le due funzioni HTTP. Esegui il workflow e restituisci un risultato che viene poi passato a un'API esterna.
- Utilizzando Workflows, connetti un'API HTTP esterna
che restituisce il
log
per un determinato numero. Esegui il flusso di lavoro e restituisci un risultato che viene poi passato a un servizio Cloud Run. - Esegui il deployment di un servizio Cloud Run che consenta solo l'accesso autenticato. Il servizio restituisce il
math.floor
per un numero specificato. - Utilizzando Workflows, connetti il servizio Cloud Run, esegui l'intero flusso di lavoro e restituisci un risultato finale.
Il seguente diagramma mostra sia una panoramica della procedura sia una visualizzazione del flusso di lavoro finale:
Costi
In questo documento, utilizzi 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
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.
- Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
-
Install the Google Cloud CLI.
-
If you're using an external identity provider (IdP), you must first sign in to the gcloud CLI with your federated identity.
-
To initialize the gcloud CLI, run the following command:
gcloud init
-
Create or select a Google Cloud project.
-
Create a Google Cloud project:
gcloud projects create PROJECT_ID
Replace
PROJECT_ID
with a name for the Google Cloud project you are creating. -
Select the Google Cloud project that you created:
gcloud config set project PROJECT_ID
Replace
PROJECT_ID
with your Google Cloud project name.
-
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the Artifact Registry, Cloud Build, Cloud Run functions, Cloud Run, Cloud Storage, and Workflows APIs:
gcloud services enable artifactregistry.googleapis.com
cloudbuild.googleapis.com cloudfunctions.googleapis.com run.googleapis.com storage.googleapis.com workflows.googleapis.com -
Install the Google Cloud CLI.
-
If you're using an external identity provider (IdP), you must first sign in to the gcloud CLI with your federated identity.
-
To initialize the gcloud CLI, run the following command:
gcloud init
-
Create or select a Google Cloud project.
-
Create a Google Cloud project:
gcloud projects create PROJECT_ID
Replace
PROJECT_ID
with a name for the Google Cloud project you are creating. -
Select the Google Cloud project that you created:
gcloud config set project PROJECT_ID
Replace
PROJECT_ID
with your Google Cloud project name.
-
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the Artifact Registry, Cloud Build, Cloud Run functions, Cloud Run, Cloud Storage, and Workflows APIs:
gcloud services enable artifactregistry.googleapis.com
cloudbuild.googleapis.com cloudfunctions.googleapis.com run.googleapis.com storage.googleapis.com workflows.googleapis.com - Aggiorna i componenti di Google Cloud CLI:
gcloud components update
- Se esegui i comandi all'interno di Cloud Shell, l'autenticazione con gcloud CLI è già
stata eseguita. In caso contrario, accedi utilizzando il tuo
account:
gcloud auth login
- Crea un account di servizio da utilizzare per Workflows:
export SERVICE_ACCOUNT=workflows-sa gcloud iam service-accounts create ${SERVICE_ACCOUNT}
- Per consentire al account di servizio di chiamare i servizi Cloud Run autenticati, concedi il ruolo
run.invoker
al account di servizio Workflows:gcloud projects add-iam-policy-binding PROJECT_ID \ --member "serviceAccount:${SERVICE_ACCOUNT}@PROJECT_ID.iam.gserviceaccount.com" \ --role "roles/run.invoker"
Sostituisci
PROJECT_ID
con l'ID del tuo progetto Google Cloud . - Imposta la posizione predefinita utilizzata in questo tutorial:
gcloud config set project PROJECT_ID export REGION=REGION gcloud config set functions/region ${REGION} gcloud config set run/region ${REGION} gcloud config set workflows/location ${REGION}
Sostituisci
REGION
con la posizione di Workflows supportata che preferisci.
Esegui il deployment del primo servizio Cloud Run Functions
Dopo aver ricevuto una richiesta HTTP, questa funzione HTTP genera un numero casuale compreso tra 1 e 100, quindi restituisce il numero in formato JSON.
Crea una directory denominata
randomgen
e passa a questa directory:mkdir ~/randomgen cd ~/randomgen
Crea un file di testo con il nome file
main.py
contenente il seguente codice Python:Per supportare una dipendenza da Flask per l'elaborazione HTTP, crea un file di testo per il gestore di pacchetti pip. Assegna al file il nome
requirements.txt
e aggiungi quanto segue:Esegui il deployment della funzione con un trigger HTTP e consenti l'accesso non autenticato:
gcloud functions deploy randomgen \ --runtime python37 \ --trigger-http \ --allow-unauthenticated
Il deployment della funzione potrebbe richiedere alcuni minuti. In alternativa, puoi utilizzare l'interfaccia Cloud Run Functions nella console Google Cloud per eseguire il deployment della funzione.
Una volta eseguito il deployment della funzione, puoi confermare la proprietà
httpsTrigger.url
:gcloud functions describe randomgen
Puoi provare la funzione con il seguente comando curl:
curl $(gcloud functions describe randomgen --format='value(httpsTrigger.url)')
Viene generato e restituito un numero casuale.
Esegui il deployment del secondo servizio Cloud Run Functions
Dopo aver ricevuto una richiesta HTTP, questa funzione HTTP estrae input
dal corpo JSON, lo moltiplica per 2 e restituisce il risultato in formato JSON.
Crea una directory denominata
multiply
e passa a questa directory:mkdir ~/multiply cd ~/multiply
Crea un file di testo con il nome file
main.py
contenente il seguente codice Python:Per supportare una dipendenza da Flask per l'elaborazione HTTP, crea un file di testo per il gestore di pacchetti pip. Assegna al file il nome
requirements.txt
e aggiungi quanto segue:Esegui il deployment della funzione con un trigger HTTP e consenti l'accesso non autenticato:
gcloud functions deploy multiply \ --runtime python37 \ --trigger-http \ --allow-unauthenticated
Il deployment della funzione potrebbe richiedere alcuni minuti.In alternativa, puoi utilizzare l'interfaccia di Cloud Run Functions nella console Google Cloud per eseguire il deployment della funzione.
Una volta eseguito il deployment della funzione, puoi confermare la proprietà
httpsTrigger.url
:gcloud functions describe multiply
Puoi provare la funzione con il seguente comando curl:
curl $(gcloud functions describe multiply --format='value(httpsTrigger.url)') \ -X POST \ -H "content-type: application/json" \ -d '{"input": 5}'
Deve essere restituito il numero 10.
Collega i due servizi Cloud Run Functions in un flusso di lavoro
Un flusso di lavoro è costituito da una serie di passaggi descritti utilizzando la sintassi di Workflows, che può essere scritta in formato YAML o JSON. Questa è la definizione del flusso di lavoro. Per una spiegazione dettagliata, consulta la pagina Riferimento alla sintassi.
Torna alla tua home directory:
cd ~
Crea un file di testo con il nome file
workflow.yaml
contenente il seguente contenuto:- randomgen_function: call: http.get args: url: https://REGION-PROJECT_ID.cloudfunctions.net/randomgen result: randomgen_result - multiply_function: call: http.post args: url: https://REGION-PROJECT_ID.cloudfunctions.net/multiply body: input: ${randomgen_result.body.random} result: multiply_result - return_result: return: ${multiply_result}
In questo modo, le due funzioni HTTP vengono collegate e viene restituito un risultato finale.
Dopo aver creato il flusso di lavoro, puoi eseguirne il deployment, rendendolo pronto per l'esecuzione.
gcloud workflows deploy WORKFLOW_NAME --source=workflow.yaml
Sostituisci
WORKFLOW_NAME
con un nome per il flusso di lavoro.Esegui il flusso di lavoro:
gcloud workflows run WORKFLOW_NAME
Un'esecuzione è una singola esecuzione della logica contenuta nella definizione di un workflow. Tutte le esecuzioni del flusso di lavoro sono indipendenti e la scalabilità rapida di Workflows consente un numero elevato di esecuzioni simultanee.
Dopo l'esecuzione del flusso di lavoro, l'output dovrebbe essere simile al seguente:
result: '{"body":{"multiplied":120},"code":200,"headers":{"Alt-Svc":"h3-29=\":443\"; ... startTime: '2021-05-05T14:17:39.135251700Z' state: SUCCEEDED ...
Connettere un servizio REST pubblico nel flusso di lavoro
Aggiorna il flusso di lavoro esistente e connetti un'API REST pubblica
(math.js)
che può valutare espressioni matematiche. Ad esempio,
curl https://api.mathjs.org/v4/?'expr=log(56)'
.
Tieni presente che, dopo aver eseguito il deployment del flusso di lavoro, puoi modificarlo anche tramite la pagina Workflows della Google Cloud console.
Modifica il file di origine del flusso di lavoro e sostituiscilo con i seguenti contenuti:
- randomgen_function: call: http.get args: url: https://REGION-PROJECT_ID.cloudfunctions.net/randomgen result: randomgen_result - multiply_function: call: http.post args: url: https://REGION-PROJECT_ID.cloudfunctions.net/multiply body: input: ${randomgen_result.body.random} result: multiply_result - log_function: call: http.get args: url: https://api.mathjs.org/v4/ query: expr: ${"log(" + string(multiply_result.body.multiplied) + ")"} result: log_result - return_result: return: ${log_result}
Collega il servizio REST esterno ai servizi Cloud Run Functions e restituisce un risultato finale.
Esegui il deployment del workflow modificato:
gcloud workflows deploy WORKFLOW_NAME --source=workflow.yaml
Esegui il deployment di un servizio Cloud Run
Esegui il deployment di un servizio Cloud Run che, dopo aver ricevuto una richiesta HTTP, estrae input
dal corpo JSON, ne calcola math.floor
e restituisce il risultato.
Crea una directory denominata
floor
e passa a questa directory:mkdir ~/floor cd ~/floor
Crea un file di testo con il nome file
app.py
contenente il seguente codice Python:Nella stessa directory, crea un file
Dockerfile
con il seguente contenuto:Crea un repository standard di Artifact Registry in cui puoi archiviare l'immagine container Docker:
gcloud artifacts repositories create REPOSITORY \ --repository-format=docker \ --location=${REGION}
Sostituisci
REPOSITORY
con un nome univoco per il repository.Crea l'immagine container:
export SERVICE_NAME=floor gcloud builds submit --tag ${REGION}-docker.pkg.dev/PROJECT_ID/REPOSITORY/${SERVICE_NAME}
Esegui il deployment dell'immagine container in Cloud Run, assicurandoti che accetti solo chiamate autenticate:
gcloud run deploy ${SERVICE_NAME} \ --image ${REGION}-docker.pkg.dev/PROJECT_ID/REPOSITORY/${SERVICE_NAME}:latest \ --platform managed \ --no-allow-unauthenticated
Quando vedi l'URL del servizio, il deployment è completato. Dovrai specificare questo URL quando aggiorni la definizione del flusso di lavoro.
Connetti il servizio Cloud Run nel flusso di lavoro
Aggiorna il flusso di lavoro esistente e specifica l'URL del servizio Cloud Run.
Modifica il file di origine del flusso di lavoro e sostituiscilo con i seguenti contenuti:
- randomgen_function: call: http.get args: url: https://REGION-PROJECT_ID.cloudfunctions.net/randomgen result: randomgen_result - multiply_function: call: http.post args: url: https://REGION-PROJECT_ID.cloudfunctions.net/multiply body: input: ${randomgen_result.body.random} result: multiply_result - log_function: call: http.get args: url: https://api.mathjs.org/v4/ query: expr: ${"log(" + string(multiply_result.body.multiplied) + ")"} result: log_result - floor_function: call: http.post args: url: CLOUD_RUN_SERVICE_URL auth: type: OIDC body: input: ${log_result.body} result: floor_result - create_output_map: assign: - outputMap: randomResult: ${randomgen_result} multiplyResult: ${multiply_result} logResult: ${log_result} floorResult: ${floor_result} - return_output: return: ${outputMap}
Sostituisci
CLOUD_RUN_SERVICE_URL
con l'URL del servizio Cloud Run.In questo modo viene collegato il servizio Cloud Run nel flusso di lavoro. Tieni presente che la chiave
auth
garantisce che un token di autenticazione venga passato nella chiamata al servizio Cloud Run. Per saperne di più, consulta Effettuare richieste autenticate da un flusso di lavoro.Esegui il deployment del workflow modificato:
gcloud workflows deploy WORKFLOW_NAME \ --source=workflow.yaml
Esegui il flusso di lavoro finale:
gcloud workflows run WORKFLOW_NAME
L'output dovrebbe essere simile al seguente:
result: '{"Floor":{"body":"4","code":200 ... "Log":{"body":"4.02535169073515","code":200 ... "Multiply":{"body":{"multiplied":56},"code":200 ... "Random":{"body":{"random":28},"code":200 ... startTime: '2023-11-13T21:22:56.782669001Z' state: SUCCEEDED
Complimenti! Hai eseguito il deployment e l'esecuzione di un flusso di lavoro che connette una serie di servizi.
Per creare workflow più complessi utilizzando espressioni, salti condizionali, codifica o decodifica Base64, subworkflow e altro ancora, consulta i riferimenti alla sintassi di Workflows e la panoramica della libreria standard.
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 è quello di eliminare il progetto creato per il tutorial.
Per eliminare il progetto:
- In the Google Cloud console, go to the Manage resources page.
- In the project list, select the project that you want to delete, and then click Delete.
- In the dialog, type the project ID, and then click Shut down to delete the project.
Eliminare le risorse del tutorial
Elimina il servizio Cloud Run di cui hai eseguito il deployment in questo tutorial.
Elimina il flusso di lavoro che hai creato in questo tutorial.
Elimina l'immagine container da Artifact Registry.
Rimuovi le configurazioni predefinite di Google Cloud CLI che hai aggiunto durante la configurazione del tutorial:
gcloud config unset functions/region gcloud config unset run/region gcloud config unset workflows/location gcloud config unset project