esegui un job Cloud Run utilizzando Workflows


Workflows consente di eseguire Job Cloud Run nell'ambito di un flusso di lavoro di eseguire elaborazioni dati più complesse o di orchestrare un sistema di job esistenti.

Questo tutorial illustra come utilizzare Workflows per eseguire una Job Cloud Run che elabora i dati passati come ambiente variabili al job, in risposta a un evento di Cloud Storage.

Tieni presente che puoi anche archiviare i dati sugli eventi in un che ti consente di criptare i dati usando chiavi di crittografia gestite dal cliente. Per ulteriori informazioni, vedi Esegui un job Cloud Run che elabora i dati degli eventi salvati in Cloud Storage.

Obiettivi

In questo tutorial, imparerai a:

  1. Crea un job Cloud Run che elabora i file di dati in un nel bucket Cloud Storage.
  2. Esegui il deployment di un flusso di lavoro che:
    1. Accetta un evento Cloud Storage come argomento.
    2. Controlla se il bucket Cloud Storage specificato nell'evento è lo stesso bucket utilizzato dal job Cloud Run.
    3. In tal caso, utilizza il connettore API Cloud Run Admin per eseguire il job Cloud Run.
  3. Crea un trigger Eventarc che esegua il flusso di lavoro in risposta agli eventi che interessano il bucket Cloud Storage.
  4. Per attivare il flusso di lavoro, aggiorna un file di dati di input nella nel bucket Cloud Storage.

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.

Console

  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. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  3. Assicurati che la fatturazione sia attivata per il tuo progetto Google Cloud.

  4. Abilita le API Artifact Registry, Cloud Build, Cloud Run, Cloud Storage, Eventarc, and Workflows.

    Abilita le API

  5. Create a service account:

    1. In the Google Cloud console, go to the Create service account page.

      Go to Create service account
    2. Select your project.
    3. In the Service account name field, enter a name. The Google Cloud console fills in the Service account ID field based on this name.

      In the Service account description field, enter a description. For example, Service account for quickstart.

    4. Click Create and continue.
    5. Grant the following roles to the service account: Cloud Run Admin, Eventarc Event Receiver, Logs Writer, Workflows Invoker.

      To grant a role, find the Select a role list, then select the role.

      To grant additional roles, click Add another role and add each additional role.

    6. Click Continue.
    7. Click Done to finish creating the service account.

  6. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  7. Assicurati che la fatturazione sia attivata per il tuo progetto Google Cloud.

  8. Abilita le API Artifact Registry, Cloud Build, Cloud Run, Cloud Storage, Eventarc, and Workflows.

    Abilita le API

  9. Create a service account:

    1. In the Google Cloud console, go to the Create service account page.

      Go to Create service account
    2. Select your project.
    3. In the Service account name field, enter a name. The Google Cloud console fills in the Service account ID field based on this name.

      In the Service account description field, enter a description. For example, Service account for quickstart.

    4. Click Create and continue.
    5. Grant the following roles to the service account: Cloud Run Admin, Eventarc Event Receiver, Logs Writer, Workflows Invoker.

      To grant a role, find the Select a role list, then select the role.

      To grant additional roles, click Add another role and add each additional role.

    6. Click Continue.
    7. Click Done to finish creating the service account.

  10. Prima di creare un trigger per gli eventi diretti da Cloud Storage, concedi il Pub/Sub Ruolo Publisher (roles/pubsub.publisher) per Agente di servizio Cloud Storage:
    1. Nella console Google Cloud, vai alla IAM.

      Vai a IAM.

    2. Seleziona Includi concessioni dei ruoli fornite da Google. casella di controllo.
    3. Nella colonna Entità, individua la colonna Cloud Storage Agente di servizio con il modulo service-PROJECT_NUMBER@gs-project-accounts.iam.gserviceaccount.com, e poi fai clic su Modifica principal nella riga corrispondente.
    4. Fai clic su Aggiungi ruolo o Aggiungi un altro ruolo.
    5. Nell'elenco Seleziona un ruolo, filtra per Pub/Sub Publisher, quindi seleziona ruolo.
    6. Fai clic su Salva.
  11. Se hai abilitato l'agente di servizio Cloud Pub/Sub su o prima dell'8 aprile 2021 per supportare il push autenticato di Pub/Sub richieste, concedi Servizio Ruolo Creatore token account (roles/iam.serviceAccountTokenCreator) all'agente di servizio. In caso contrario, questo ruolo viene concesso per impostazione predefinita:
    1. Nella console Google Cloud, vai alla IAM.

      Vai a IAM.

    2. Seleziona Includi concessioni dei ruoli fornite da Google. casella di controllo.
    3. Nella colonna Nome, individua la Account di servizio Cloud Pub/Sub quindi fai clic su Modifica principal nella riga corrispondente.
    4. Fai clic su Aggiungi ruolo o Aggiungi un altro ruolo.
    5. Nell'elenco Seleziona un ruolo, filtra per Creatore token account di servizio, quindi seleziona il ruolo.
    6. Fai clic su Salva.
  12. Nella console Google Cloud, attiva Cloud Shell.

    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.

  13. Cloud Shell supporta i comandi /dev/urandom in questo tutorial che genera numeri pseudocasuali.

gcloud

  1. Per utilizzare già un terminale online con gcloud CLI configura Cloud Shell:

    In fondo a questa pagina, viene avviata una sessione di Cloud Shell mostra un prompt della riga di comando. La sessione può richiedere alcuni secondi initialize.

    Cloud Shell supporta i comandi /dev/urandom in questo tutorial che genera numeri pseudocasuali.

  2. Crea o seleziona un progetto Google Cloud.
    • Crea un progetto Google Cloud:

      gcloud projects create PROJECT_ID
    • Seleziona il progetto Google Cloud che hai creato:

      gcloud config set project PROJECT_ID
  3. Assicurati che la fatturazione sia abilitata per il tuo progetto Google Cloud.
  4. Abilita le Artifact Registry, Cloud Build, Cloud Run, Cloud Storage, Eventarc, and Workflows API:
    gcloud services enable artifactregistry.googleapis.com \
        cloudbuild.googleapis.com \
        eventarc.googleapis.com \
        run.googleapis.com \
        storage.googleapis.com \
        workflows.googleapis.com
  5. Crea un account di servizio per il flusso di lavoro da utilizzare per l'autenticazione gli altri servizi Google Cloud e assegnargli i ruoli appropriati.
    1. Crea l'account di servizio:
      gcloud iam service-accounts create SERVICE_ACCOUNT_NAME
      

      Sostituisci SERVICE_ACCOUNT_NAME con il nome di l'account di servizio.

    2. Concedi i ruoli all'account di servizio gestito dall'utente che hai creato in passaggio precedente. Esegui questo comando una volta per ciascuno dei seguenti puoi usare i ruoli IAM oppure puoi usare il flag --role più volte con un solo comando:
      • roles/eventarc.eventReceiver: per ricevere eventi
      • roles/logging.logWriter: per scrivere i log
      • roles/run.admin: per eseguire Cloud Run offerta di lavoro
      • roles/workflows.invoker: per richiamare i flussi di lavoro
      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 servizio
      • ROLE: il ruolo da concedere all'account gestito dall'utente account di servizio
  6. Prima di creare un trigger per gli eventi diretti da Cloud Storage, concedi al publisher Pub/Sub Ruolo Publisher (roles/pubsub.publisher) per Agente di servizio Cloud Storage:

    SERVICE_ACCOUNT="$(gcloud storage service-agent --project=PROJECT_ID)"
    
    gcloud projects add-iam-policy-binding PROJECT_ID \
        --member="serviceAccount:${SERVICE_ACCOUNT}" \
        --role='roles/pubsub.publisher'
    
  7. Se hai abilitato l'agente di servizio Cloud Pub/Sub entro aprile 8 febbraio 2021, per supportare le richieste push di Pub/Sub autenticate, il Servizio Ruolo Creatore token account (roles/iam.serviceAccountTokenCreator) all'agente di servizio. In caso contrario, questo ruolo viene concesso per impostazione predefinita:
    gcloud projects add-iam-policy-binding PROJECT_ID \
        --member=serviceAccount:service-PROJECT_NUMBER@gcp-sa-pubsub.iam.gserviceaccount.com \
        --role=roles/iam.serviceAccountTokenCreator
  8. Sostituisci PROJECT_NUMBER con il tuo Google Cloud del progetto. Puoi trovare il numero del tuo progetto nella Ti diamo il benvenuto della console Google Cloud o eseguendo questo comando:

    gcloud projects describe PROJECT_ID --format='value(projectNumber)'

Terraform

  1. Per utilizzare già un terminale online con gcloud CLI configura Cloud Shell:

    In fondo a questa pagina, viene avviata una sessione di Cloud Shell mostra un prompt della riga di comando. La sessione può richiedere alcuni secondi initialize.

    Cloud Shell supporta i comandi /dev/urandom in questo tutorial che genera numeri pseudocasuali.

  2. Crea o seleziona un progetto Google Cloud.
    • Crea un progetto Google Cloud:

      gcloud projects create PROJECT_ID
    • Seleziona il progetto Google Cloud che hai creato:

      gcloud config set project PROJECT_ID
  3. Assicurati che la fatturazione sia abilitata per il tuo progetto Google Cloud.
  4. Abilita le Artifact Registry, Cloud Build, Cloud Run, Cloud Storage, Eventarc, and Workflows API:
    gcloud services enable artifactregistry.googleapis.com \
        cloudbuild.googleapis.com \
        eventarc.googleapis.com \
        run.googleapis.com \
        storage.googleapis.com \
        workflows.googleapis.com
  5. Crea un account di servizio per il flusso di lavoro da utilizzare per l'autenticazione gli altri servizi Google Cloud e assegnargli i ruoli appropriati. Inoltre, per supportare gli eventi diretti da Cloud Storage, concedi al publisher Pub/Sub Publisher (roles/pubsub.publisher) alla Agente di servizio Cloud Storage.

    Modifica il file main.tf come mostrato nell'esempio seguente. Per ulteriori informazioni, consulta Documentazione del provider Google per Terraform.

    Per scoprire come applicare o rimuovere una configurazione Terraform, consulta: Comandi Terraform di base.

    Tieni presente che in un tipico flusso di lavoro Terraform, applichi l'intero piano una volta sola. Tuttavia, ai fini di questo tutorial, puoi scegliere come target una risorsa specifica. Ad esempio:

    terraform apply -target="google_service_account.workflows"

    # Used to retrieve project information later
    data "google_project" "project" {}
    
    # Create a dedicated service account
    resource "google_service_account" "workflows" {
      account_id   = "workflows-run-job-sa"
      display_name = "Workflows Cloud Run Job Service Account"
    }
    
    # Grant permission to receive Eventarc events
    resource "google_project_iam_member" "eventreceiver" {
      project = data.google_project.project.id
      role    = "roles/eventarc.eventReceiver"
      member  = "serviceAccount:${google_service_account.workflows.email}"
    }
    
    # Grant permission to write logs
    resource "google_project_iam_member" "logwriter" {
      project = data.google_project.project.id
      role    = "roles/logging.logWriter"
      member  = "serviceAccount:${google_service_account.workflows.email}"
    }
    
    # Grant permission to execute Cloud Run jobs
    resource "google_project_iam_member" "runadmin" {
      project = data.google_project.project.id
      role    = "roles/run.admin"
      member  = "serviceAccount:${google_service_account.workflows.email}"
    }
    
    # Grant permission to invoke workflows
    resource "google_project_iam_member" "workflowsinvoker" {
      project = data.google_project.project.id
      role    = "roles/workflows.invoker"
      member  = "serviceAccount:${google_service_account.workflows.email}"
    }
    
    # Grant the Cloud Storage service agent permission to publish Pub/Sub topics
    data "google_storage_project_service_account" "gcs_account" {}
    resource "google_project_iam_member" "pubsubpublisher" {
      project = data.google_project.project.id
      role    = "roles/pubsub.publisher"
      member  = "serviceAccount:${data.google_storage_project_service_account.gcs_account.email_address}"
    }
    
  6. Se hai abilitato l'agente di servizio Cloud Pub/Sub entro aprile 8 febbraio 2021, per supportare le richieste push di Pub/Sub autenticate, il Servizio Ruolo Creatore token account (roles/iam.serviceAccountTokenCreator) all'agente di servizio. In caso contrario, questo ruolo viene concesso per impostazione predefinita:
    gcloud projects add-iam-policy-binding PROJECT_ID \
        --member=serviceAccount:service-PROJECT_NUMBER@gcp-sa-pubsub.iam.gserviceaccount.com \
        --role=roles/iam.serviceAccountTokenCreator
  7. Sostituisci PROJECT_NUMBER con il tuo Google Cloud del progetto. Puoi trovare il numero del tuo progetto nella Ti diamo il benvenuto della console Google Cloud o eseguendo questo comando:

    gcloud projects describe PROJECT_ID --format='value(projectNumber)'

Crea un job Cloud Run

Questo tutorial utilizza un job Cloud Run di esempio da GitHub. Il job legge i dati da un file di input in Cloud Storage ed esegue per ciascuna riga del file.

  1. Recupera il codice campione clonando il repository dell'app di esempio nel tuo locale macchina:

    git clone https://github.com/GoogleCloudPlatform/jobs-demos.git
    

    In alternativa, puoi scarica l'esempio come file ZIP ed estrarlo.

  2. Passa alla directory che contiene il codice di esempio:

    cd jobs-demos/parallel-processing
    
  3. Creare un bucket Cloud Storage per archiviare un file di input che può essere vengono scritte e attivano un evento:

    Console

    1. Nella console Google Cloud, vai alla pagina Bucket di Cloud Storage.

      Vai a Bucket

    2. Fai clic su aggiungi Crea.
    3. Nella pagina Crea un bucket, inserisci un nome per il bucket:
      input-PROJECT_ID
      Sostituisci PROJECT_ID con l'ID del tuo progetto Google Cloud.
    4. Mantieni le altre impostazioni predefinite.
    5. Fai clic su Crea.

    gcloud

    Esegui Comando gcloud storage buckets create:

    gcloud storage buckets create gs://input-PROJECT_ID

    Se la richiesta ha esito positivo, il comando restituisce il seguente messaggio:

    Creating gs://input-PROJECT_ID/...

    Terraform

    Per creare un bucket Cloud Storage, utilizza google_storage_bucket risorsa e modifica il file main.tf come mostrato in nell'esempio riportato di seguito.

    Per scoprire come applicare o rimuovere una configurazione Terraform, consulta: Comandi Terraform di base.

    Tieni presente che in un tipico flusso di lavoro Terraform, viene applicato l'intero piano contemporaneamente. Tuttavia, ai fini di questo tutorial, puoi scegliere come target una risorsa specifica. Ad esempio:

    terraform apply -target="random_id.bucket_name_suffix"
    e
    terraform apply -target="google_storage_bucket.default"

    # Cloud Storage bucket names must be globally unique
    resource "random_id" "bucket_name_suffix" {
      byte_length = 4
    }
    
    # Create a Cloud Storage bucket
    resource "google_storage_bucket" "default" {
      name                        = "input-${data.google_project.project.name}-${random_id.bucket_name_suffix.hex}"
      location                    = "us-central1"
      storage_class               = "STANDARD"
      force_destroy               = false
      uniform_bucket_level_access = true
    }
  4. Crea un repository standard Artifact Registry in cui archiviare i tuoi immagine container:

    Console

    1. Nella console Google Cloud, vai ad Artifact Registry Pagina Repository:

      Vai a Repositories

    2. Fai clic su Crea repository:

    3. Inserisci un nome per il repository, ad esempio my-repo. Per ogni posizione del repository in un progetto, i nomi dei repository devono essere univoci.

    4. Conserva il formato predefinito, che dovrebbe essere Docker.

    5. Mantieni la modalità predefinita, che deve essere Standard.

    6. Come regione, seleziona us-central1 (Iowa)

    7. Conserva tutte le altre impostazioni predefinite.

    8. Fai clic su Crea.

    gcloud

    Esegui il comando:

    gcloud artifacts repositories create REPOSITORY \
        --repository-format=docker \
        --location=us-central1

    Sostituisci REPOSITORY con un nome univoco per un repository attendibile, ad esempio my-repo. Per ogni posizione del repository i nomi dei repository devono essere univoci.

    Terraform

    Per creare un repository Artifact Registry, utilizza google_artifact_registry_repository risorsa e modifica il file main.tf come illustrato nell'esempio seguente.

    Tieni presente che in un tipico flusso di lavoro Terraform, applichi l'intero piano una volta sola. Tuttavia, ai fini di questo tutorial, puoi scegliere come target una risorsa specifica. Ad esempio:

    terraform apply -target="google_artifact_registry_repository.default"

    # Create an Artifact Registry repository
    resource "google_artifact_registry_repository" "default" {
      location      = "us-central1"
      repository_id = "my-repo"
      format        = "docker"
    }
  5. Crea l'immagine container utilizzando un buildpack di Google Cloud predefinito:

    export SERVICE_NAME=parallel-job
    gcloud builds submit \
        --pack image=us-central1-docker.pkg.dev/PROJECT_ID/REPOSITORY/${SERVICE_NAME}
    

    Sostituisci REPOSITORY con il nome del tuo repository Artifact Registry.

    Il completamento della build può richiedere un paio di minuti.

  6. Crea un job Cloud Run che esegue il deployment dell'immagine container:

    Console

    1. Nella console Google Cloud, vai a Cloud Run. pagina:

      Vai a Cloud Run

    2. Fai clic su Crea job per visualizzare il modulo Crea job.

      1. Nel modulo, seleziona us-central1-docker.pkg.dev/PROJECT_ID/REPOSITORY/parallel-job:latest come URL dell'immagine container di Artifact Registry.
      2. (Facoltativo) Per il nome del job, inserisci parallel-job.
      3. (Facoltativo) Per la regione, seleziona us-central1 (Iowa)
      4. Per il numero di attività che vuoi eseguire nel job, inserisci 10. Tutte le attività devono avere esito positivo affinché il job abbia esito positivo. Di per impostazione predefinita, le attività vengono eseguite in parallelo.
    3. Espandi Container, variabili e Secret, connessioni, sicurezza e mantenere tutti i valori predefiniti, ad eccezione di quanto segue impostazioni:

      1. Fai clic sulla scheda Generale.

        1. Per il comando container, inserisci python.
        2. Per l'argomento container, inserisci process.py.
      2. Fai clic sul pulsante Variabili e Scheda Secret.

        1. Fai clic su Aggiungi variabile e inserisci INPUT_BUCKET per la nome e input-PROJECT_ID per valore.
        2. Fai clic su Aggiungi variabile e inserisci INPUT_FILE per la e input_file.txt per il valore.
    4. Per creare il job, fai clic su Crea.

    gcloud

    1. Imposta la regione Cloud Run predefinita:

      gcloud config set run/region us-central1
    2. Crea il job Cloud Run:

      gcloud run jobs create parallel-job \
          --image us-central1-docker.pkg.dev/PROJECT_ID/REPOSITORY/parallel-job:latest \
          --command python \
          --args process.py \
          --tasks 10 \
          --set-env-vars=INPUT_BUCKET=input-PROJECT_ID,INPUT_FILE=input_file.txt

      Tieni presente che se non specifichi tag immagine, Artifact Registry cerca l'immagine con il tag latest predefinito.

      Per un elenco completo delle opzioni disponibili durante la creazione di un job, fai riferimento a il comando gcloud run job create della riga di comando.

      Una volta creato il job, dovresti vedere un messaggio che indica successo.

    Terraform

    Per creare un job Cloud Run, utilizza la classe google_cloud_run_v2_job risorsa e modifica il file main.tf come illustrato nell'esempio seguente.

    Tieni presente che in un tipico flusso di lavoro Terraform, applichi l'intero piano una volta sola. Tuttavia, ai fini di questo tutorial, puoi scegliere come target una risorsa specifica. Ad esempio:

    terraform apply -target="google_cloud_run_v2_job.default"

    # Create a Cloud Run job
    resource "google_cloud_run_v2_job" "default" {
      name     = "parallel-job"
      location = "us-central1"
    
      template {
        task_count = 10
        template {
          containers {
            image   = "us-central1-docker.pkg.dev/${data.google_project.project.name}/${google_artifact_registry_repository.default.repository_id}/parallel-job:latest"
            command = ["python"]
            args    = ["process.py"]
            env {
              name  = "INPUT_BUCKET"
              value = google_storage_bucket.default.name
            }
            env {
              name  = "INPUT_FILE"
              value = "input_file.txt"
            }
          }
        }
      }
    }

Esegui il deployment di un flusso di lavoro che esegue il job Cloud Run

definisci ed esegui il deployment di un flusso di lavoro che esegue il job Cloud Run che hai appena creato. Una definizione di flusso di lavoro è composta da una serie di passaggi descritti utilizzando Sintassi di Workflows.

Console

  1. Nella console Google Cloud, vai alla Pagina Flussi di lavoro:

    Vai a Flussi di lavoro

  2. Clic Crea.

  3. Inserisci un nome per il nuovo flusso di lavoro, ad esempio cloud-run-job-workflow.

  4. Come regione, seleziona us-central1 (Iowa)

  5. Nel campo Account di servizio, seleziona l'account di servizio creati in precedenza.

    L'account di servizio funge da identità del flusso di lavoro. Dovresti avere ha già concesso il ruolo Amministratore Cloud Run all'account di servizio, quindi in modo che il flusso di lavoro possa eseguire il job Cloud Run.

  6. Fai clic su Avanti.

  7. Nell'editor del flusso di lavoro, inserisci la seguente definizione per il tuo flusso di lavoro personalizzato:

    main:
        params: [event]
        steps:
            - init:
                assign:
                    - project_id: ${sys.get_env("GOOGLE_CLOUD_PROJECT_ID")}
                    - event_bucket: ${event.data.bucket}
                    - event_file: ${event.data.name}
                    - target_bucket: ${"input-" + project_id}
                    - job_name: parallel-job
                    - job_location: us-central1
            - check_input_file:
                switch:
                    - condition: ${event_bucket == target_bucket}
                      next: run_job
                    - condition: true
                      next: end
            - run_job:
                call: googleapis.run.v1.namespaces.jobs.run
                args:
                    name: ${"namespaces/" + project_id + "/jobs/" + job_name}
                    location: ${job_location}
                    body:
                        overrides:
                            containerOverrides:
                                env:
                                    - name: INPUT_BUCKET
                                      value: ${event_bucket}
                                    - name: INPUT_FILE
                                      value: ${event_file}
                result: job_execution
            - finish:
                return: ${job_execution}
  8. Fai clic su Esegui il deployment.

gcloud

  1. Crea un file di codice sorgente per il tuo flusso di lavoro:

    touch cloud-run-job-workflow.yaml
    
  2. Copia la seguente definizione di flusso di lavoro nel file del codice sorgente:

    main:
        params: [event]
        steps:
            - init:
                assign:
                    - project_id: ${sys.get_env("GOOGLE_CLOUD_PROJECT_ID")}
                    - event_bucket: ${event.data.bucket}
                    - event_file: ${event.data.name}
                    - target_bucket: ${"input-" + project_id}
                    - job_name: parallel-job
                    - job_location: us-central1
            - check_input_file:
                switch:
                    - condition: ${event_bucket == target_bucket}
                      next: run_job
                    - condition: true
                      next: end
            - run_job:
                call: googleapis.run.v1.namespaces.jobs.run
                args:
                    name: ${"namespaces/" + project_id + "/jobs/" + job_name}
                    location: ${job_location}
                    body:
                        overrides:
                            containerOverrides:
                                env:
                                    - name: INPUT_BUCKET
                                      value: ${event_bucket}
                                    - name: INPUT_FILE
                                      value: ${event_file}
                result: job_execution
            - finish:
                return: ${job_execution}
  3. Esegui il deployment del flusso di lavoro inserendo il comando seguente:

    gcloud workflows deploy cloud-run-job-workflow \
        --location=us-central1 \
        --source=cloud-run-job-workflow.yaml \
        --service-account=SERVICE_ACCOUNT_NAME@PROJECT_ID.iam.gserviceaccount.com
    

    Sostituisci quanto segue:

    • SERVICE_ACCOUNT_NAME: il nome di l'account di servizio che hai creato in precedenza
    • PROJECT_ID: l'ID del tuo Progetto Google Cloud

    L'account di servizio funge da identità del flusso di lavoro. Dovresti avere ha già concesso il ruolo roles/run.admin all'account di servizio, quindi in modo che il flusso di lavoro possa eseguire il job Cloud Run.

Terraform

Per creare un flusso di lavoro, utilizza google_workflows_workflow risorsa e modifica il file main.tf come illustrato nell'esempio seguente.

Per scoprire come applicare o rimuovere una configurazione Terraform, consulta: Comandi Terraform di base.

Tieni presente che in un tipico flusso di lavoro Terraform, viene applicato l'intero piano contemporaneamente. Tuttavia, ai fini di questo tutorial, puoi scegliere come target una specifica risorsa. Ad esempio:

terraform apply -target="google_workflows_workflow.default"

# Create a workflow
resource "google_workflows_workflow" "default" {
  name        = "cloud-run-job-workflow"
  region      = "us-central1"
  description = "Workflow that routes a Cloud Storage event and executes a Cloud Run job"

  # Note that $$ is needed for Terraform
  source_contents = <<EOF
  main:
      params: [event]
      steps:
          - init:
              assign:
                  - project_id: $${sys.get_env("GOOGLE_CLOUD_PROJECT_ID")}
                  - event_bucket: $${event.data.bucket}
                  - event_file: $${event.data.name}
                  - target_bucket: "${google_storage_bucket.default.name}"
                  - job_name: parallel-job
                  - job_location: us-central1
          - check_input_file:
              switch:
                  - condition: $${event_bucket == target_bucket}
                    next: run_job
                  - condition: true
                    next: end
          - run_job:
              call: googleapis.run.v1.namespaces.jobs.run
              args:
                  name: $${"namespaces/" + project_id + "/jobs/" + job_name}
                  location: $${job_location}
                  body:
                      overrides:
                          containerOverrides:
                              env:
                                  - name: INPUT_BUCKET
                                    value: $${event_bucket}
                                  - name: INPUT_FILE
                                    value: $${event_file}
              result: job_execution
          - finish:
              return: $${job_execution}
  EOF
}

Il flusso di lavoro effettua le seguenti operazioni:

  1. Passaggio init: accetta un evento Cloud Storage come argomento e imposta le variabili necessarie.

  2. check_input_file passaggio: controlla se il bucket Cloud Storage specificato nell'evento è il bucket utilizzato dal job Cloud Run.

    • In caso affermativo, il flusso di lavoro procede al passaggio run_job.
    • In caso contrario, il flusso di lavoro termina e si interrompe ogni ulteriore elaborazione.
  3. Passaggio run_job: utilizza la classe del connettore dell'API Cloud Run Admin Metodo googleapis.run.v1.namespaces.jobs.run per eseguire il job. I nomi dei file di dati e del bucket Cloud Storage passate come variabili di override dal flusso di lavoro al job.

  4. Passaggio finish: restituisce informazioni sull'esecuzione del job in seguito a nel flusso di lavoro.

Crea un trigger Eventarc per il flusso di lavoro

Eseguire automaticamente il flusso di lavoro e, a sua volta, Cloud Run ogni volta che il file di dati di input viene aggiornato, crea un evento Eventarc trigger che risponde agli eventi Cloud Storage nel bucket contenente il file di dati di input.

Console

  1. Nella console Google Cloud, vai alla Pagina Flussi di lavoro:

    Vai a Flussi di lavoro

  2. Fai clic sul nome del flusso di lavoro, ad esempio cloud-run-job-workflow.

  3. Nella pagina Dettagli flusso di lavoro, fai clic su Modifica.

  4. Nella sezione Trigger della pagina Modifica flusso di lavoro, fai clic su Aggiungi nuovo trigger > Eventarc.

    Si apre il riquadro Trigger Eventarc.

  5. Nel campo Nome trigger, inserisci un nome per l'attivatore, ad esempio cloud-run-job-workflow-trigger.

  6. Dall'elenco Provider di eventi, seleziona Cloud Storage.

  7. Nell'elenco Evento, seleziona google.cloud.storage.object.v1.finalized

  8. Nel campo Bucket, seleziona il bucket contenente i dati di input. . Il nome del bucket è nel formato input-PROJECT_ID.

  9. Nel campo Account di servizio, seleziona l'account di servizio creati in precedenza.

    L'account di servizio funge da identità del trigger. Dovresti avere sono già stati concessi i seguenti ruoli all'account di servizio:

    • Ricevitore eventi Eventarc: per ricevere gli eventi
    • Invoker dei flussi di lavoro: per eseguire flussi di lavoro
  10. Fai clic su Salva trigger.

    Il trigger Eventarc ora viene visualizzato nella sezione Trigger della pagina Modifica flusso di lavoro.

  11. Fai clic su Avanti.

  12. Fai clic su Esegui il deployment.

gcloud

Crea un trigger Eventarc eseguendo questo comando:

gcloud eventarc triggers create cloud-run-job-workflow-trigger \
    --location=us \
    --destination-workflow=cloud-run-job-workflow  \
    --destination-workflow-location=us-central1 \
    --event-filters="type=google.cloud.storage.object.v1.finalized" \
    --event-filters="bucket=input-PROJECT_ID" \
    --service-account=SERVICE_ACCOUNT_NAME@PROJECT_ID.iam.gserviceaccount.com

Sostituisci quanto segue:

  • PROJECT_ID: l'ID del tuo progetto Google Cloud
  • SERVICE_ACCOUNT_NAME: il nome del servizio creato in precedenza.

L'account di servizio funge da identità del trigger. Dovresti avere sono già stati concessi i seguenti ruoli all'account di servizio:

  • roles/eventarc.eventReceiver: per ricevere eventi
  • roles/workflows.invoker: per eseguire flussi di lavoro

Terraform

Per creare un trigger, utilizza google_eventarc_trigger risorsa e modifica il file main.tf come illustrato nell'esempio seguente.

Per scoprire come applicare o rimuovere una configurazione Terraform, consulta: Comandi Terraform di base.

Tieni presente che in un tipico flusso di lavoro Terraform, viene applicato l'intero piano contemporaneamente. Tuttavia, ai fini di questo tutorial, puoi scegliere come target una specifica risorsa. Ad esempio:

terraform apply -target="google_eventarc_trigger.default"

# Create an Eventarc trigger that routes Cloud Storage events to Workflows
resource "google_eventarc_trigger" "default" {
  name     = "cloud-run-job-trigger"
  location = google_workflows_workflow.default.region

  # Capture objects changed in the bucket
  matching_criteria {
    attribute = "type"
    value     = "google.cloud.storage.object.v1.finalized"
  }
  matching_criteria {
    attribute = "bucket"
    value     = google_storage_bucket.default.name
  }

  # Send events to Workflows
  destination {
    workflow = google_workflows_workflow.default.id
  }

  service_account = google_service_account.workflows.email

}

Ogni volta che un file viene caricato o sovrascritto in Cloud Storage bucket contenente il file di dati di input, il flusso di lavoro viene eseguito dell'evento Cloud Storage corrispondente come argomento.

Attiva il flusso di lavoro

Testa il sistema end-to-end aggiornando il file di dati di input in di archiviazione ideale in Cloud Storage.

  1. Genera nuovi dati per il file di input e caricalo su Cloud Storage nella posizione prevista dal job Cloud Run:

    base64 /dev/urandom | head -c 100000 >input_file.txt
    gsutil cp input_file.txt gs://input-PROJECT_ID/input_file.txt
    

    Se hai creato un bucket Cloud Storage utilizzando Terraform, puoi recupera il nome del bucket eseguendo questo comando:

    gcloud storage buckets list gs://input*
    

    L'esecuzione del job Cloud Run può richiedere alcuni minuti.

  2. Conferma che il job Cloud Run sia stato eseguito come previsto visualizzando le esecuzioni del job:

    gcloud config set run/region us-central1
    gcloud run jobs executions list --job=parallel-job
    

    Nell'output dovresti vedere un'esecuzione del job riuscita, a indicare che 10/10 attività sono state completate.

Scopri di più su l'attivazione di un flusso di lavoro con eventi o messaggi Pub/Sub.

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

Elimina le risorse che hai creato in questo tutorial:

  1. Elimina il trigger Eventarc:

    gcloud eventarc triggers delete cloud-run-job-workflow-trigger --location=us
    
  2. Elimina il flusso di lavoro:

    gcloud workflows delete cloud-run-job-workflow --location=us-central1
    
  3. Elimina il job Cloud Run:

    gcloud run jobs delete parallel-job
    
  4. Elimina il bucket Cloud Storage creato per i dati di input:

    gcloud storage rm --recursive gs://input-PROJECT_ID/
    
  5. Elimina il repository Artifact Registry:

    gcloud artifacts repositories delete REPOSITORY --location=us-central1
    

Passaggi successivi