Utilizzare Workflows per collegare i servizi


Questo tutorial mostra come utilizzare i flussi di lavoro per collegare una serie di servizi. Collegando due servizi HTTP pubblici utilizzando le funzioni Cloud Run, un'API REST esterna e Cloud Run, puoi creare un'applicazione flessibile e serverless.

Obiettivi

In questo tutorial utilizzi Google Cloud CLI per creare un singolo flusso di lavoro, collegando un servizio alla volta:

  1. Eseguire il deployment di due servizi per le funzioni di Cloud Run: la prima funzione genera un numero casuale e lo passa alla seconda funzione il che la moltiplica.
  2. Utilizzando Workflows, collega le due funzioni HTTP. Esegui il flusso di lavoro e restituisci un risultato che viene poi passato a un'API esterna.
  3. Utilizzando Workflows, connetti un'API HTTP esterna che restituisce log per un determinato numero. Esegui il flusso di lavoro e restituisci un risultato che viene poi passato a un servizio Cloud Run.
  4. Esegui il deployment di un servizio Cloud Run che consente solo per l'accesso. Il servizio restituisce il valore math.floor per un determinato numero.
  5. 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:

Visualizzazione dei flussi di lavoro

Costi

In questo documento utilizzi i seguenti componenti fatturabili di Google Cloud:

Per generare una stima dei costi basata sull'utilizzo previsto, utilizza il Calcolatore prezzi. I nuovi utenti di Google Cloud potrebbero essere idonei per una prova gratuita.

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.

  1. 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.
  2. Install the Google Cloud CLI.
  3. To initialize the gcloud CLI, run the following command:

    gcloud init
  4. 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.

  5. Make sure that billing is enabled for your Google Cloud project.

  6. 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
  7. Install the Google Cloud CLI.
  8. To initialize the gcloud CLI, run the following command:

    gcloud init
  9. 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.

  10. Make sure that billing is enabled for your Google Cloud project.

  11. 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
  12. Aggiorna i componenti di Google Cloud CLI:
    gcloud components update
  13. Se stai eseguendo comandi in Cloud Shell, hai già eseguito l'autenticazione con l'interfaccia a riga di comando gcloud. In caso contrario, accedi utilizzando il tuo account:
    gcloud auth login
  14. Imposta la località 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.

  15. Se sei l'autore del progetto, puoi ricevere ruolo Proprietario di base (roles/owner). Per impostazione predefinita, questo ruolo IAM (Identity and Access Management) include le autorizzazioni necessarie per l'accesso completo alla maggior parte dei servizi Google Cloud e puoi saltare questo passaggio.

    Se non sei il creator del progetto, le autorizzazioni richieste devono essere concesse al principale appropriato. Ad esempio, un'entità può essere un Account Google (per gli utenti finali) o un account di servizio (per le applicazioni e i carichi di lavoro di calcolo). Per ulteriori informazioni, consulta Pagina Ruoli e autorizzazioni per la destinazione del tuo evento.

    Autorizzazioni obbligatorie

    Per ottenere le autorizzazioni necessarie per completare il tutorial, chiedi all'amministratore di concederti i seguenti ruoli IAM nel progetto:

    Per saperne di più sulla concessione dei ruoli, consulta Gestire l'accesso a progetti, cartelle e organizzazioni.

    Potresti anche riuscire a ottenere le autorizzazioni richieste tramite i ruoli personalizzati o altri ruoli predefiniti.

Esegui il deployment del primo servizio di funzioni 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.

  1. Crea una directory denominata randomgen e passa a quella directory:

    mkdir ~/randomgen
    cd ~/randomgen
  2. Crea un file di testo con il nome main.py che contenga quanto segue. Codice Python:

    import functions_framework
    import random
    from flask import jsonify
    
    
    @functions_framework.http
    def randomgen(request):
        randomNum = random.randint(1, 100)
        output = {"random": randomNum}
        return jsonify(output)
  3. Per supportare una dipendenza su Flask per l'elaborazione HTTP, crea un file di testo per il gestore di pacchetti pip. Assegna il nome requirements.txt al file e aggiungi quanto segue:

    flask>=1.0.2
    functions-framework==3.0.0
  4. Crea un account di servizio da utilizzare per i flussi di lavoro:

    export SERVICE_ACCOUNT=workflows-sa
    gcloud iam service-accounts create ${SERVICE_ACCOUNT}
  5. consentire all'account di servizio di chiamare Cloud Run autenticato assegna il ruolo run.invoker a Workflows account di servizio:

    gcloud projects add-iam-policy-binding PROJECT_ID \
        --member "serviceAccount:${SERVICE_ACCOUNT}@PROJECT_ID.iam.gserviceaccount.com" \
        --role "roles/run.invoker"
  6. 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 Usa l'interfaccia delle funzioni di Cloud Run nella console Google Cloud per eseguire il deployment della funzione.

  7. Una volta eseguita il deployment della funzione randomgen, puoi confermare la proprietà httpsTrigger.url:

    gcloud functions describe randomgen-function \
        --gen2 \
        --format="value(serviceConfig.uri)"
  8. Salva l'URL. Dovrai aggiungerlo al file di origine del flusso di lavoro in allenamenti successivi.

  9. 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.

Esegui il deployment del secondo servizio di funzioni 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.

  1. Torna alla home directory:

    cd ~
  2. Crea una directory denominata multiply e passa a quella directory:

    mkdir ~/multiply
    cd ~/multiply
  3. Crea un file di testo con il nome file main.py contenente il seguente codice Python:

    import functions_framework
    from flask import jsonify
    
    
    @functions_framework.http
    def multiply(request):
        request_json = request.get_json()
        output = {"multiplied": 2 * request_json['input']}
        return jsonify(output)
  4. Per supportare una dipendenza su Flask per l'elaborazione HTTP, crea un file di testo per il gestore di pacchetti pip. Assegna il nome requirements.txt al file e aggiungi quanto segue:

    flask>=1.0.2
    functions-framework==3.0.0
  5. 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 delle funzioni Cloud Run nella console Google Cloud per eseguire il deployment della funzione.

  6. Una volta eseguita il deployment della funzione multiply, puoi confermare la proprietà httpsTrigger.url:

    gcloud functions describe multiply-function \
        --gen2\
        --format="value(serviceConfig.uri)"
  7. Salva l'URL. Dovrai aggiungerlo al file di origine di Workflow negli esercizi successivi.

  8. 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.

Collega i due servizi di funzioni Cloud Run 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 Pagina Riferimento per la sintassi.

  1. Torna alla home directory:

    cd ~
  2. Crea un file di testo con il nome file workflow.yaml contenente 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}
    

    Questo file sorgente collega le due funzioni HTTP e restituisce un risultato finale.

  3. Dopo aver creato il flusso di lavoro, puoi eseguirne il deployment, in modo che sia pronto dell'esecuzione.

    gcloud workflows deploy WORKFLOW_NAME \
        --source=workflow.yaml

    Sostituisci WORKFLOW_NAME con un nome per il flusso di lavoro.

  4. Esegui il flusso di lavoro:

    gcloud workflows run WORKFLOW_NAME

    Un'esecuzione è una singola esecuzione della logica contenuta nella definizione di un flusso di lavoro. Tutte le esecuzioni dei flussi di lavoro sono indipendenti e la scalabilità rapida dei flussi di lavoro 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
    ...
    

Collega un servizio REST pubblico nel flusso di lavoro

Aggiorna il flusso di lavoro esistente e collega un'API REST pubblica (math.js) che può valutare le 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 Flussi di lavoro nella console Google Cloud.

  1. Modifica il file di origine per il flusso di lavoro e sostituiscilo con quanto segue 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}
    

    Questo collega il servizio REST esterno ai servizi delle funzioni Cloud Run e restituisce un risultato finale.

  2. Esegui il deployment del flusso di lavoro modificato:

    gcloud workflows deploy WORKFLOW_NAME \
        --source=workflow.yaml

Esegui il deployment di un servizio Cloud Run

Eseguire il deployment di un servizio Cloud Run che, dopo aver ricevuto un messaggio HTTP richiesta, estrae input dal corpo JSON, ne calcola math.floor e restituisce il risultato.

  1. Crea una directory denominata floor e passa a quella directory:

    mkdir ~/floor
    cd ~/floor
  2. Crea un file di testo con il nome app.py che contenga quanto segue. Codice Python:

    import json
    import logging
    import os
    import math
    
    from flask import Flask, request
    
    app = Flask(__name__)
    
    
    @app.route('/', methods=['POST'])
    def handle_post():
        content = json.loads(request.data)
        input = float(content['input'])
        return f"{math.floor(input)}", 200
    
    
    if __name__ != '__main__':
        # Redirect Flask logs to Gunicorn logs
        gunicorn_logger = logging.getLogger('gunicorn.error')
        app.logger.handlers = gunicorn_logger.handlers
        app.logger.setLevel(gunicorn_logger.level)
        app.logger.info('Service started...')
    else:
        app.run(debug=True, host='0.0.0.0', port=int(os.environ.get('PORT', 8080)))

  3. Nella stessa directory, crea un file Dockerfile con il seguente contenuto:

    # Use an official lightweight Python image.
    # https://hub.docker.com/_/python
    FROM python:3.7-slim
    
    # Install production dependencies.
    RUN pip install Flask gunicorn
    
    # Copy local code to the container image.
    WORKDIR /app
    COPY . .
    
    # Run the web service on container startup. Here we use the gunicorn
    # webserver, with one worker process and 8 threads.
    # For environments with multiple CPU cores, increase the number of workers
    # to be equal to the cores available.
    CMD exec gunicorn --bind 0.0.0.0:8080 --workers 1 --threads 8 app:app

  4. Crea un repository standard Artifact Registry in cui archiviare i tuoi Immagine container Docker:

    gcloud artifacts repositories create REPOSITORY \
        --repository-format=docker \
        --location=${REGION}

    Sostituisci REPOSITORY con un nome univoco per il repository.

  5. Crea l'immagine container:

    export SERVICE_NAME=floor
    gcloud builds submit --tag ${REGION}-docker.pkg.dev/PROJECT_ID/REPOSITORY/${SERVICE_NAME}
  6. 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

Quando viene visualizzato 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 per il servizio Cloud Run.

  1. Modifica il file di origine del flusso di lavoro 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_URL con l'URL del tuo Funzione randomgen.
    • Sostituisci MULTIPLY_FUNCTION_URL con l'URL della funzione multiply.
    • Sostituisci CLOUD_RUN_SERVICE_URL con 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 Eseguire richieste autenticate da un flusso di lavoro.

  2. Esegui il deployment del flusso di lavoro modificato:

    gcloud workflows deploy WORKFLOW_NAME \
        --source=workflow.yaml
  3. 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 ed eseguito un flusso di lavoro che collega un insieme di servizi.

Per creare flussi di lavoro più complessi utilizzando espressioni, salti condizionali, Codifica o decodifica Base64, flussi di lavoro secondari e altro ancora, fai riferimento all' Riferimento per la sintassi di Workflows e la panoramica della Libreria standard.

Esegui la pulizia

Se hai creato un nuovo progetto per questo tutorial, eliminalo. 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:

  1. In the Google Cloud console, go to the Manage resources page.

    Go to Manage resources

  2. In the project list, select the project that you want to delete, and then click Delete.
  3. In the dialog, type the project ID, and then click Shut down to delete the project.

Eliminare le risorse dei tutorial

Passaggi successivi