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 funzioni Cloud Run: la prima funzione genera un numero casuale e lo passa alla seconda funzione che lo moltiplica.
- Utilizza Workflows per connettere 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
logper 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 consente
solo l'accesso autenticato. Il servizio restituisce il
math.floorper un numero specificato. - Utilizzando Workflows, connetti il servizio Cloud Run, esegui l'intero workflow 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 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
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.
-
Se utilizzi un provider di identità (IdP) esterno, devi prima accedere a gcloud CLI con la tua identità federata.
-
Per inizializzare gcloud CLI, esegui questo comando:
gcloud init -
Create or select 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 theresourcemanager.projects.createpermission. Learn how to grant roles.
-
Create a Google Cloud project:
gcloud projects create PROJECT_ID
Replace
PROJECT_IDwith 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_IDwith your Google Cloud project name.
-
Verify that billing is enabled for your Google Cloud project.
-
Enable the Artifact Registry, Cloud Build, Cloud Run, Cloud Run functions, Cloud Storage, and Workflows APIs:
Roles required to enable APIs
To enable APIs, you need the Service Usage Admin IAM role (
roles/serviceusage.serviceUsageAdmin), which contains theserviceusage.services.enablepermission. Learn how to grant roles.gcloud services enable artifactregistry.googleapis.com
cloudbuild.googleapis.com run.googleapis.com cloudfunctions.googleapis.com storage.googleapis.com workflows.googleapis.com -
Install the Google Cloud CLI.
-
Se utilizzi un provider di identità (IdP) esterno, devi prima accedere a gcloud CLI con la tua identità federata.
-
Per inizializzare gcloud CLI, esegui questo comando:
gcloud init -
Create or select 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 theresourcemanager.projects.createpermission. Learn how to grant roles.
-
Create a Google Cloud project:
gcloud projects create PROJECT_ID
Replace
PROJECT_IDwith 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_IDwith your Google Cloud project name.
-
Verify that billing is enabled for your Google Cloud project.
-
Enable the Artifact Registry, Cloud Build, Cloud Run, Cloud Run functions, Cloud Storage, and Workflows APIs:
Roles required to enable APIs
To enable APIs, you need the Service Usage Admin IAM role (
roles/serviceusage.serviceUsageAdmin), which contains theserviceusage.services.enablepermission. Learn how to grant roles.gcloud services enable artifactregistry.googleapis.com
cloudbuild.googleapis.com run.googleapis.com cloudfunctions.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
- 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
REGIONcon la posizione di Workflows supportata che preferisci. -
Se hai creato il progetto, ti viene assegnato il ruolo di base Proprietario (
roles/owner). Per impostazione predefinita, questo ruolo IAM include le autorizzazioni necessarie per l'accesso completo alla maggior parte delle risorse Google Cloud e puoi saltare questo passaggio.Se non sei il creatore del progetto, le autorizzazioni richieste devono essere concesse al principal appropriato. Ad esempio, un'entità può essere un Account Google (per gli utenti finali) o unaccount di serviziot (per le applicazioni e i carichi di lavoro di calcolo). Per saperne di più, consulta la pagina Ruoli e autorizzazioni per la destinazione eventi.
Autorizzazioni obbligatorie
Per ottenere le autorizzazioni necessarie per completare il tutorial, chiedi all'amministratore di concederti i seguenti ruoli IAM nel progetto:
-
Editor Cloud Build (
roles/cloudbuild.builds.editor) -
Cloud Functions Developer (
roles/cloudfunctions.developer) -
Cloud Run Admin (
roles/run.admin) -
Crea service account (
roles/iam.serviceAccountCreator) -
Project IAM Admin (
roles/resourcemanager.projectIamAdmin) -
Utente Service Account (
roles/iam.serviceAccountUser) -
Consumer Service Usage (
roles/serviceusage.serviceUsageConsumer) -
Storage Admin (
roles/storage.admin) -
Editor di workflow (
roles/workflows.editor)
Per saperne di più sulla concessione dei ruoli, consulta Gestisci l'accesso a progetti, cartelle e organizzazioni.
Potresti anche riuscire a ottenere le autorizzazioni richieste tramite i ruoli personalizzati o altri ruoli predefiniti.
-
Editor Cloud Build (
- Quando esegui il deployment del flusso di lavoro, lo associ a un account di servizio specificato. Crea un account di servizio da utilizzare per Workflows:
export SERVICE_ACCOUNT=workflows-sa gcloud iam service-accounts create ${SERVICE_ACCOUNT}
- Per impostazione predefinita, tutti i servizi Cloud Run vengono implementati privatamente e possono essere chiamati solo da proprietari del progetto, editor del progetto, amministratori Cloud Run e chiamanti Cloud Run. Per consentire al account di servizio di
chiamare un servizio Cloud Run autenticato, concedi il ruolo
run.invokeral 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"
Crea una directory denominata
randomgene passa a questa directory:mkdir ~/randomgen cd ~/randomgen
Crea un file di testo con il nome file
main.pycontenente 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 il nome
requirements.txte aggiungi quanto segue:Esegui il deployment della funzione con un trigger HTTP e consenti l'accesso non autenticato:
gcloud functions deploy randomgen-function \ --gen2 \ --runtime python310 \ --entry-point=randomgen \ --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
randomgen, puoi confermare la proprietàhttpsTrigger.url:gcloud functions describe randomgen-function \ --gen2 \ --format="value(serviceConfig.uri)"
Salva l'URL. Dovrai aggiungerlo al file di origine del flusso di lavoro negli esercizi successivi.
Puoi provare la funzione con il seguente comando curl:
curl $(gcloud functions describe randomgen-function \ --gen2 \ --format="value(serviceConfig.uri)")
Viene generato e restituito un numero casuale.
Torna alla tua home directory:
cd ~
Crea una directory denominata
multiplye passa a questa directory:mkdir ~/multiply cd ~/multiply
Crea un file di testo con il nome file
main.pycontenente 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 il nome
requirements.txte aggiungi quanto segue:Esegui il deployment della funzione con un trigger HTTP e consenti l'accesso non autenticato:
gcloud functions deploy multiply-function \ --gen2 \ --runtime python310 \ --entry-point=multiply \ --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
multiply, puoi confermare la proprietàhttpsTrigger.url:gcloud functions describe multiply-function \ --gen2\ --format="value(serviceConfig.uri)"
Salva l'URL. Dovrai aggiungerlo al file di origine del flusso di lavoro negli esercizi successivi.
Puoi provare la funzione con il seguente comando curl:
curl -X POST MULTIPLY_FUNCTION_URL \ -H "Authorization: Bearer $(gcloud auth print-identity-token)" \ -H "Content-Type: application/json" \ -d '{"input": 5}'
Deve essere restituito il numero 10.
Torna alla tua home directory:
cd ~
Crea un file di testo con il nome file
workflow.yamlcontenente il seguente contenuto:- randomgen_function: call: http.get args: url: RANDOMGEN_FUNCTION_URL result: randomgen_result - multiply_function: call: http.post args: url: MULTIPLY_FUNCTION_URL body: input: ${randomgen_result.body.random} result: multiply_result - return_result: return: ${multiply_result}- Sostituisci
RANDOMGEN_FUNCTION_URLcon l'URL della tua funzionerandomgen. - Sostituisci
MULTIPLY_FUNCTION_URLcon l'URL della tua funzionemultiply.
Questo file di origine collega le due funzioni HTTP e restituisce un risultato finale.
- Sostituisci
Dopo aver creato il flusso di lavoro, puoi eseguirne il deployment, rendendolo pronto per l'esecuzione.
gcloud workflows deploy WORKFLOW_NAME \ --source=workflow.yaml \ --service-account=${SERVICE_ACCOUNT}@PROJECT_ID.iam.gserviceaccount.com
Sostituisci
WORKFLOW_NAMEcon un nome per il flusso di lavoro.Esegui il workflow:
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 ...Modifica il file di origine del workflow e sostituiscilo con i seguenti contenuti:
- randomgen_function: call: http.get args: url: RANDOMGEN_FUNCTION_URL result: randomgen_result - multiply_function: call: http.post args: url: MULTIPLY_FUNCTION_URL 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}- Sostituisci
RANDOMGEN_FUNCTION_URLcon l'URL della tua funzionerandomgen. - Sostituisci
MULTIPLY_FUNCTION_URLcon l'URL della tua funzionemultiply.
Collega il servizio REST esterno alle funzioni Cloud Run e restituisce un risultato finale.
- Sostituisci
Esegui il deployment del workflow modificato:
gcloud workflows deploy WORKFLOW_NAME \ --source=workflow.yaml \ --service-account=${SERVICE_ACCOUNT}@PROJECT_ID.iam.gserviceaccount.com
Crea una directory denominata
floore passa a questa directory:mkdir ~/floor cd ~/floor
Crea un file di testo con il nome file
app.pycontenente il seguente codice Python:Nella stessa directory, crea un file
Dockerfilecon 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
REPOSITORYcon 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 \ --no-allow-unauthenticated
Torna alla tua home directory:
cd ~
Modifica il file di origine del workflow e sostituiscilo con i seguenti contenuti:
- randomgen_function: call: http.get args: url: RANDOMGEN_FUNCTION_URL result: randomgen_result - multiply_function: call: http.post args: url: MULTIPLY_FUNCTION_URL 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
RANDOMGEN_FUNCTION_URLcon l'URL della tua funzionerandomgen. - Sostituisci
MULTIPLY_FUNCTION_URLcon l'URL della tua funzionemultiply. - Sostituisci
CLOUD_RUN_SERVICE_URLcon l'URL del servizio Cloud Run.
In questo modo il servizio Cloud Run viene connesso nel workflow. Tieni presente che la chiave
authgarantisce che un token di autenticazione venga trasmesso nella chiamata al servizio Cloud Run. Per saperne di più, consulta Effettuare richieste autenticate da un flusso di lavoro.- Sostituisci
Esegui il deployment del workflow modificato:
gcloud workflows deploy WORKFLOW_NAME \ --source=workflow.yaml \ --service-account=${SERVICE_ACCOUNT}@PROJECT_ID.iam.gserviceaccount.com
Esegui il workflow finale:
gcloud workflows run WORKFLOW_NAME
L'output dovrebbe essere simile al seguente:
result: '{"floorResult":{"body":"4","code":200 ... "logResult":{"body":"4.02535169073515","code":200 ... "multiplyResult":{"body":{"multiplied":56},"code":200 ... "randomResult":{"body":{"random":28},"code":200 ... startTime: '2023-11-13T21:22:56.782669001Z' state: SUCCEEDED- 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.
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
Esegui il deployment della prima funzione Cloud Run
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.
Esegui il deployment della seconda funzione Cloud Run
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.
Connetti le due funzioni Cloud Run in un workflow
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.
Connetti un servizio REST pubblico nel workflow
Aggiorna il workflow 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 workflow, puoi modificarlo anche tramite la pagina Workflows della Google Cloud console.
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.
Quando vedi l'URL del servizio, il deployment è completato. Dovrai specificare questo URL quando aggiorni la definizione del workflow.
Connetti il servizio Cloud Run nel workflow
Aggiorna il flusso di lavoro esistente e specifica l'URL del servizio Cloud Run.
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 è eliminare il progetto creato per il tutorial.
Per eliminare il progetto: