Tutorial di Workflows (1ª generazione)


Questo tutorial mostra come utilizzare Workflows per collegare una serie servizi insieme. Collegando due servizi HTTP pubblici (utilizzando Cloud Functions), un'API REST esterna e un servizio Cloud Run privato, per creare un'applicazione flessibile e serverless.

Obiettivi

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

  1. Esegui il deployment di due servizi Cloud Functions: la prima funzione genera un numero casuale, e poi lo passa alla seconda funzione il che la moltiplica.
  2. Utilizzando Workflows, connetti le due funzioni HTTP. Eseguire il flusso di lavoro e restituire un risultato che viene poi passato a un API.
  3. Utilizzando Workflows, connetti un'API HTTP esterna che restituisce log per un determinato numero. Esegui il flusso di lavoro per restituire un risultato che viene poi passato a Cloud Run completamente gestito di Google Cloud.
  4. Esegui il deployment di un servizio Cloud Run che consente solo per l'accesso. Il servizio restituisce math.floor per un determinato numero.
  5. Utilizzando Workflows, connetti Cloud Run eseguire l'intero flusso di lavoro e restituire un risultato finale.

Il seguente diagramma mostra una panoramica del processo e una visualizzazione del flusso di lavoro finale:

Visualizzazione di Workflows

Costi

In questo documento vengono utilizzati 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. Accedi al tuo account Google Cloud. Se non conosci Google Cloud, crea un account per valutare le prestazioni dei nostri prodotti in scenari reali. I nuovi clienti ricevono anche 300 $di crediti gratuiti per l'esecuzione, il test e il deployment dei carichi di lavoro.
  2. Installa Google Cloud CLI.
  3. Per initialize gcloud CLI, esegui questo comando:

    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. Assicurati che la fatturazione sia attivata per il tuo progetto Google Cloud.

  6. Abilita le API Artifact Registry, Cloud Build, Cloud Functions, Cloud Run, Cloud Storage, and Workflows.

    gcloud services enable artifactregistry.googleapis.com cloudbuild.googleapis.com cloudfunctions.googleapis.com run.googleapis.com storage.googleapis.com workflows.googleapis.com
  7. Installa Google Cloud CLI.
  8. Per initialize gcloud CLI, esegui questo comando:

    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. Assicurati che la fatturazione sia attivata per il tuo progetto Google Cloud.

  11. Abilita le API Artifact Registry, Cloud Build, Cloud Functions, Cloud Run, Cloud Storage, and Workflows.

    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 esegui comandi all'interno di Cloud Shell, stai già autenticati con gcloud CLI; altrimenti accedi con :
    gcloud auth login
  14. Crea un account di servizio da utilizzare per Workflows:

    export SERVICE_ACCOUNT=workflows-sa
    gcloud iam service-accounts create ${SERVICE_ACCOUNT}
    

  15. 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"
    

    Sostituisci PROJECT_ID con l'ID del tuo progetto Google Cloud.

  16. 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 i Workflows supportati posizione di tua scelta.

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

  1. Crea una directory denominata randomgen e passa a questa 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. Assegnagli il nome file requirements.txt e aggiungi seguenti:

    flask>=1.0.2
    functions-framework==3.0.0
  4. 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 usare l'interfaccia di Cloud Functions nella console Google Cloud per eseguire il deployment della funzione.

  1. Una volta eseguito il deployment della funzione, puoi confermare la proprietà httpsTrigger.url:

    gcloud functions describe randomgen
    
  2. Puoi provare la funzione con il seguente comando curl:

    curl $(gcloud functions describe randomgen --format='value(httpsTrigger.url)')
    

    Viene generato e restituito un numero casualmente.

Esegui il deployment del secondo servizio Cloud Functions

Dopo aver ricevuto una richiesta HTTP, questa funzione HTTP estrae input da il corpo JSON, lo moltiplica per 2 e restituisce il risultato in formato JSON.

  1. Crea una directory denominata multiply e passa a questa directory:

    mkdir ~/multiply
    cd ~/multiply
    
  2. Crea un file di testo con il nome main.py che contenga quanto segue. 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)
  3. Per supportare una dipendenza su Flask per l'elaborazione HTTP, crea un file di testo per il gestore di pacchetti pip. Assegnagli il nome file requirements.txt e aggiungi seguenti:

    flask>=1.0.2
    functions-framework==3.0.0
  4. 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 usare l'interfaccia di Cloud Functions nella console Google Cloud per eseguire il deployment della funzione.

  1. Una volta eseguito il deployment della funzione, puoi confermare la proprietà httpsTrigger.url:

    gcloud functions describe multiply
    
  2. 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.

connetti i due servizi Cloud Functions in un flusso di lavoro

Un flusso di lavoro è costituito da una serie di passaggi descritti utilizzando Sintassi di Workflows, che può essere scritta in formato YAML o JSON formato. 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 workflow.yaml che contenga quanto segue. 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
    - return_result:
        return: ${multiply_result}
    

    In questo modo le due funzioni HTTP vengono collegate e viene restituito 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 rapida scalabilità Workflows consente un numero elevato di esecuzioni simultanee.

    Dopo aver eseguito il 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
    ...
    

Connetti un servizio REST pubblico nel flusso di lavoro

Aggiorna il flusso di lavoro esistente e connetti un'API REST pubblica (math.js) in grado di valutare espressioni matematiche. Ad esempio: curl https://api.mathjs.org/v4/?'expr=log(56)'.

Nota che, poiché hai eseguito il deployment del flusso di lavoro, puoi anche modificarlo tramite il 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: 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}
    

    Questo collega il servizio REST esterno ai servizi Cloud Functions, 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 questa 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 elemento Dockerfile con i seguenti contenuti:

    # 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 repository Git.

  5. Crea l'immagine container:

    export SERVICE_NAME=floor
    gcloud builds submit --tag ${REGION}-docker.pkg.dev/PROJECT_ID/REPOSITORY/${SERVICE_NAME}
    
  6. Eseguire il deployment dell'immagine container in Cloud Run, assicurandosi che venga accetta 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 durante l'aggiornamento della 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 Cloud Run completamente gestito di 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: 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 URL del servizio Cloud Run.

    Questa operazione connette il servizio Cloud Run nel flusso di lavoro. Nota che la chiave auth garantisca il passaggio di un token di autenticazione la chiamata al servizio Cloud Run. Per ulteriori informazioni, consulta Effettuare 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, elimina il progetto. Se hai utilizzato un progetto esistente e vuoi mantenerlo senza l'aggiunta delle modifiche In questo tutorial, elimina le risorse create per il tutorial.

Elimina il progetto

Il modo più semplice per eliminare la fatturazione creato per il tutorial.

Per eliminare il progetto:

  1. Nella console Google Cloud, vai alla pagina Gestisci risorse.

    Vai a Gestisci risorse

  2. Nell'elenco dei progetti, seleziona il progetto che vuoi eliminare, quindi fai clic su Elimina.
  3. Nella finestra di dialogo, digita l'ID del progetto e fai clic su Chiudi per eliminare il progetto.

Elimina le risorse del tutorial

Passaggi successivi