Esegui un job Cloud Run utilizzando Workflows


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

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

Tieni presente che puoi anche archiviare i dati sugli eventi in un bucket Cloud Storage, il che ti consente di criptarli utilizzando le chiavi di crittografia gestite dal cliente. Per saperne di più, consulta Eseguire 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 bucket Cloud Storage.
  2. Esegui il deployment di un workflow che:
    1. Accetta un evento Cloud Storage come argomento.
    2. Verifica se il bucket Cloud Storage specificato nell'evento è lo stesso utilizzato dal job Cloud Run.
    3. In caso affermativo, utilizza il connettore dell'API Cloud Run Admin per eseguire il job Cloud Run.
  3. Crea un trigger Eventarc che esegue il flusso di lavoro in risposta agli eventi che interessano il bucket Cloud Storage.
  4. Attiva il flusso di lavoro aggiornando un file di dati di input nel bucket Cloud Storage.

Costi

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

Per generare una stima dei costi in base all'utilizzo previsto, utilizza il calcolatore prezzi.

I nuovi utenti di Google Cloud potrebbero avere diritto a 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. 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. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  3. Verify that billing is enabled for your Google Cloud project.

  4. Enable the Artifact Registry, Cloud Build, Cloud Run, Cloud Storage, Eventarc, and Workflows APIs.

    Enable the APIs

  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. Verify that billing is enabled for your Google Cloud project.

  8. Enable the Artifact Registry, Cloud Build, Cloud Run, Cloud Storage, Eventarc, and Workflows APIs.

    Enable the APIs

  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 ruolo Publisher Pub/Sub (roles/pubsub.publisher) all'agente di servizio Cloud Storage:
    1. Nella console Google Cloud , vai alla pagina IAM.

      Vai a IAM

    2. Seleziona la casella di controllo Includi concessioni di ruoli fornite da Google.
    3. Nella colonna Entità, trova l'agente di servizio Cloud Storage con il modulo service-PROJECT_NUMBER@gs-project-accounts.iam.gserviceaccount.com, quindi fai clic su Modifica entità 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 il ruolo.
    6. Fai clic su Salva.
  11. Se hai attivato l'agente di servizio Cloud Pub/Sub l'8 aprile 2021 o in una data precedente, per supportare le richieste push Pub/Sub autenticate, concedi il ruolo Creatore token service 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 pagina IAM.

      Vai a IAM

    2. Seleziona la casella di controllo Includi concessioni di ruoli fornite da Google.
    3. Nella colonna Nome, trova l'account di servizio Cloud Pub/Sub e fai clic su Modifica entità 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. In the Google Cloud console, activate Cloud Shell.

    Activate Cloud Shell

    At the bottom of the Google Cloud console, a Cloud Shell session starts and displays a command-line prompt. Cloud Shell is a shell environment with the Google Cloud CLI already installed and with values already set for your current project. It can take a few seconds for the session to initialize.

  13. Cloud Shell supporta i comandi /dev/urandom di questo tutorial che generano numeri pseudocasuali.

    gcloud

    1. Per utilizzare un terminale online con gcloud CLI già configurato, attiva Cloud Shell:

      Nella parte inferiore di questa pagina viene avviata una sessione di Cloud Shell e viene visualizzato un prompt della riga di comando. L'inizializzazione della sessione può richiedere alcuni secondi.

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

    2. Crea o seleziona un Google Cloud progetto.
      • Creare 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 attivata per il tuo progetto Google Cloud .
    4. Attiva le API Artifact Registry, Cloud Build, Cloud Run, Cloud Storage, Eventarc, and Workflows :
      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 da utilizzare per l'autenticazione con altri servizi Google Cloud e concedigli i ruoli appropriati.
      1. Crea l'account di servizio:
        gcloud iam service-accounts create SERVICE_ACCOUNT_NAME

        Sostituisci SERVICE_ACCOUNT_NAME con un nome per ilaccount di serviziot.

      2. Concedi ruoli al account di servizio gestito dall'utente che hai creato nel passaggio precedente. Esegui il seguente comando una volta per ciascuno dei seguenti ruoli IAM oppure puoi utilizzare il flag --role più volte in un singolo comando:
        • roles/eventarc.eventReceiver: per ricevere eventi
        • roles/logging.logWriter: per scrivere i log
        • roles/run.admin: per eseguire il job Cloud Run
        • roles/workflows.invoker: per richiamare i workflow
        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 il account di servizio
        • ROLE: il ruolo da concedere al account di servizio gestito dall'utente
    6. Prima di creare un trigger per gli eventi diretti da Cloud Storage, concedi il ruolo Publisher Pub/Sub (roles/pubsub.publisher) all'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 attivato l'agente di servizio Cloud Pub/Sub l'8 aprile 2021 o in una data precedente, per supportare le richieste push Pub/Sub autenticate, concedi il ruolo Creatore token account di servizio (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 numero del tuo progetto Google Cloud. Puoi trovare il numero di progetto nella pagina Benvenuto della console Google Cloud o eseguendo questo comando:

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

    Terraform

    1. Per utilizzare un terminale online con gcloud CLI già configurato, attiva Cloud Shell:

      Nella parte inferiore di questa pagina viene avviata una sessione di Cloud Shell e viene visualizzato un prompt della riga di comando. L'inizializzazione della sessione può richiedere alcuni secondi.

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

    2. Crea o seleziona un Google Cloud progetto.
      • Creare 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 attivata per il tuo progetto Google Cloud .
    4. Attiva le API Artifact Registry, Cloud Build, Cloud Run, Cloud Storage, Eventarc, and Workflows :
      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 da utilizzare per l'autenticazione con altri servizi Google Cloud e concedigli i ruoli appropriati. Inoltre, per supportare gli eventi diretti da Cloud Storage, concedi il ruolo Publisher Pub/Sub (roles/pubsub.publisher) all'agente di servizio Cloud Storage.

      Modifica il file main.tf come mostrato nell'esempio seguente. Per saperne di più, consulta la 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 contemporaneamente. 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 attivato l'agente di servizio Cloud Pub/Sub l'8 aprile 2021 o in una data precedente, per supportare le richieste push Pub/Sub autenticate, concedi il ruolo Creatore token account di servizio (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 numero del tuo progetto Google Cloud. Puoi trovare il numero di progetto nella pagina 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 di GitHub. Il job legge i dati da un file di input in Cloud Storage ed esegue un'elaborazione arbitraria per ogni riga del file.

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

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

    In alternativa, puoi scaricare il campione come file ZIP ed estrarlo.

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

    cd jobs-demos/parallel-processing
  3. Crea un bucket Cloud Storage per archiviare un file di input che può essere scritto e attivare un evento:

    Console

    1. Nella console Google Cloud , vai alla pagina Bucket in 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 gli altri valori predefiniti.
    5. Fai clic su Crea.

    gcloud

    Esegui il comando gcloud storage buckets create:

    gcloud storage buckets create gs://input-PROJECT_ID

    Se la richiesta riesce, il comando restituisce il seguente messaggio:

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

    Terraform

    Per creare un bucket Cloud Storage, utilizza la risorsa google_storage_bucket e modifica il file main.tf come mostrato 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, applichi 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 di Artifact Registry in cui archiviare l'immagine container:

    Console

    1. Nella console Google Cloud , vai alla pagina Repository di Artifact Registry:

      Vai a Repository

    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. Mantieni il formato predefinito, che deve essere Docker.

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

    6. Per la regione, seleziona us-central1 (Iowa).

    7. Mantieni tutti gli altri valori predefiniti.

    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 il repository, ad esempio my-repo. Per ogni posizione del repository in un progetto, i nomi dei repository devono essere univoci.

    Terraform

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

    Tieni presente che in un tipico flusso di lavoro Terraform, applichi l'intero piano contemporaneamente. 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 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 alla pagina Cloud Run:

      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 riesca. Per impostazione predefinita, le attività vengono eseguite in parallelo.
    3. Espandi la sezione Container, variabili e secret, connessioni, sicurezza e mantieni tutti i valori predefiniti, ad eccezione delle seguenti impostazioni:

      1. Fai clic sulla scheda Generale.

        1. Per il comando del container, inserisci python.
        2. Per l'argomento container, inserisci process.py.
      2. Fai clic sulla scheda Variabili e secret.

        1. Fai clic su Aggiungi variabile e inserisci INPUT_BUCKET per il nome e input-PROJECT_ID per il valore.
        2. Fai clic su Aggiungi variabile e inserisci INPUT_FILE per il nome 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 un 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, consulta la documentazione della riga di comando gcloud run jobs create.

      Una volta creato il job, dovresti visualizzare un messaggio che indica la riuscita dell'operazione.

    Terraform

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

    Tieni presente che in un tipico flusso di lavoro Terraform, applichi l'intero piano contemporaneamente. 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 workflow è costituita da una serie di passaggi descritti utilizzando la sintassi dei workflow.

Console

  1. Nella console Google Cloud , vai alla pagina Workflows:

    Vai a Flussi di lavoro

  2. Fai clic su Crea.

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

  4. Per la regione, seleziona us-central1 (Iowa).

  5. Nel campo Service account, seleziona il account di servizio che hai creato in precedenza.

    L'account di servizio funge da identità del flusso di lavoro. Dovresti aver già concesso il ruolo Amministratore di Cloud Run al account di servizio in modo che il workflow possa eseguire il job Cloud Run.

  6. Fai clic su Avanti.

  7. Nell'editor del workflow, inserisci la seguente definizione per il workflow:

    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 workflow:

    touch cloud-run-job-workflow.yaml
  2. Copia la seguente definizione del workflow 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 questo comando:

    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 delaccount di serviziot che hai creato in precedenza
    • PROJECT_ID: l'ID del tuo Google Cloud progetto

    L'account di servizio funge da identità del flusso di lavoro. Dovresti aver già concesso il ruolo roles/run.admin al account di servizio in modo che il workflow possa eseguire il job Cloud Run.

Terraform

Per creare un flusso di lavoro, utilizza la risorsa google_workflows_workflow e modifica il file main.tf come mostrato 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, applichi l'intero piano contemporaneamente. Tuttavia, ai fini di questo tutorial, puoi scegliere come target una risorsa specifica. 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"    deletion_protection = false # set to "true" in production    # 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 esegue le seguenti operazioni:

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

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

    • In caso affermativo, il flusso di lavoro passa al passaggio run_job.
    • In caso contrario, il flusso di lavoro termina, interrompendo qualsiasi ulteriore elaborazione.
  3. Il passaggio run_job utilizza il metodo googleapis.run.v1.namespaces.jobs.run del connettore dell'API Cloud Run Admin per eseguire il job. I nomi del bucket Cloud Storage e dei file di dati vengono trasmessi come variabili di override dal flusso di lavoro al job.

  4. Passaggio finish: restituisce informazioni sull'esecuzione del job come risultato del workflow.

Crea un trigger Eventarc per il flusso di lavoro

Per eseguire automaticamente il flusso di lavoro e, di conseguenza, il job Cloud Run ogni volta che il file di dati di input viene aggiornato, crea un trigger Eventarc che risponde agli eventi Cloud Storage nel bucket contenente il file di dati di input.

Console

  1. Nella console Google Cloud , vai alla pagina Workflows:

    Vai a Flussi di lavoro

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

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

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

    Si apre il riquadro Trigger Eventarc.

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

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

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

  8. Nel campo Bucket, seleziona il bucket contenente il file di dati di input. Il nome del bucket ha il formato input-PROJECT_ID.

  9. Nel campo Service account, seleziona il account di servizio che hai creato in precedenza.

    L'account di servizio funge da identità del trigger. Dovresti aver già concesso i seguenti ruoli al account di servizio:

    • Eventarc Event Receiver: per ricevere eventi
    • Workflows Invoker: per eseguire i workflow
  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 il seguente 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 Google Cloud progetto
  • SERVICE_ACCOUNT_NAME: il nome del service account che hai creato in precedenza.

L'account di servizio funge da identità del trigger. Dovresti aver già concesso i seguenti ruoli al account di servizio:

  • roles/eventarc.eventReceiver: per ricevere eventi
  • roles/workflows.invoker: per eseguire i workflow

Terraform

Per creare un trigger, utilizza la risorsa google_eventarc_trigger e modifica il file main.tf come mostrato 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, applichi l'intero piano contemporaneamente. Tuttavia, ai fini di questo tutorial, puoi scegliere come target una risorsa specifica. 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 nel bucket Cloud Storage contenente il file di dati di input, il flusso di lavoro viene eseguito con l'evento Cloud Storage corrispondente come argomento.

Attivare il workflow

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

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

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

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

    gcloud storage buckets list gs://input*

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

  2. Verifica 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 visualizzare l'esecuzione corretta del job, che indica che 10/10 attività sono state completate.

Scopri di più su come attivare 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 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:

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