Exécuter un job Cloud Run à l'aide de Workflows


Workflows vous permet d'exécuter des tâches Cloud Run dans le cadre d'un workflow pour effectuer un traitement de données plus complexe ou orchestrer un système de tâches existantes.

Ce tutoriel explique comment utiliser Workflows pour exécuter une tâche Cloud Run qui traite les données transmises en tant que variables d'environnement à la tâche, en réponse à un événement provenant de Cloud Storage.

Notez que vous pouvez également stocker les données d'événement dans un bucket Cloud Storage, ce qui vous permet de les chiffrer à l'aide de clés de chiffrement gérées par le client. Pour en savoir plus, consultez la page Exécuter une tâche Cloud Run qui traite les données d'événement enregistrées dans Cloud Storage.

Objectifs

Au cours de ce tutoriel, vous allez :

  1. Créer un job Cloud Run qui traite les fichiers de données dans un bucket Cloud Storage
  2. Déployer un workflow qui :
    1. Accepte un événement Cloud Storage en tant qu'argument.
    2. Vérifie si le bucket Cloud Storage spécifié dans l'événement est le même que celui utilisé par la tâche Cloud Run.
    3. Le cas échéant, il utilise le connecteur de l'API Cloud Run Admin pour exécuter la tâche Cloud Run.
  3. Créez un déclencheur Eventarc qui exécute le workflow en réponse à des événements affectant le bucket Cloud Storage.
  4. Déclenchez le workflow en mettant à jour un fichier de données d'entrée dans le bucket Cloud Storage.

Coûts

Dans ce document, vous utilisez les composants facturables suivants de Google Cloud :

Obtenez une estimation des coûts en fonction de votre utilisation prévue à l'aide du simulateur de coût. Les nouveaux utilisateurs de Google Cloud peuvent bénéficier d'un essai gratuit.

Avant de commencer

Les contraintes de sécurité définies par votre organisation peuvent vous empêcher d'effectuer les étapes suivantes. Pour obtenir des informations de dépannage, consultez la page Développer des applications dans un environnement Google Cloud limité.

Console

  1. Connectez-vous à votre compte Google Cloud. Si vous débutez sur Google Cloud, créez un compte pour évaluer les performances de nos produits en conditions réelles. Les nouveaux clients bénéficient également de 300 $ de crédits gratuits pour exécuter, tester et déployer des charges de travail.
  2. Dans Google Cloud Console, sur la page de sélection du projet, sélectionnez ou créez un projet Google Cloud.

    Accéder au sélecteur de projet

  3. Vérifiez que la facturation est activée pour votre projet Google Cloud.

  4. Activer les API Artifact Registry, Cloud Build, Cloud Run, Cloud Storage, Eventarc, and Workflows.

    Activer les API

  5. Créez un compte de service :

    1. Dans la console Google Cloud, accédez à la page Créer un compte de service.

      Accéder à la page "Créer un compte de service"
    2. Sélectionnez votre projet.
    3. Dans le champ Nom du compte de service, saisissez un nom. La console Google Cloud remplit le champ ID du compte de service en fonction de ce nom.

      Dans le champ Description du compte de service, saisissez une description. Exemple : Service account for quickstart.

    4. Cliquez sur Créer et continuer.
    5. Attribuez les rôles suivants au compte de service : Cloud Run Admin, Eventarc Event Receiver, Logs Writer, Workflows Invoker.

      Pour attribuer un rôle, trouvez la liste Sélectionner un rôle, puis sélectionnez le rôle.

      Pour attribuer des rôles supplémentaires, cliquez sur Ajouter un autre rôle et ajoutez chaque rôle supplémentaire.

    6. Cliquez sur Continuer.
    7. Cliquez sur OK pour terminer la création du compte de service.

  6. Dans Google Cloud Console, sur la page de sélection du projet, sélectionnez ou créez un projet Google Cloud.

    Accéder au sélecteur de projet

  7. Vérifiez que la facturation est activée pour votre projet Google Cloud.

  8. Activer les API Artifact Registry, Cloud Build, Cloud Run, Cloud Storage, Eventarc, and Workflows.

    Activer les API

  9. Créez un compte de service :

    1. Dans la console Google Cloud, accédez à la page Créer un compte de service.

      Accéder à la page "Créer un compte de service"
    2. Sélectionnez votre projet.
    3. Dans le champ Nom du compte de service, saisissez un nom. La console Google Cloud remplit le champ ID du compte de service en fonction de ce nom.

      Dans le champ Description du compte de service, saisissez une description. Exemple : Service account for quickstart.

    4. Cliquez sur Créer et continuer.
    5. Attribuez les rôles suivants au compte de service : Cloud Run Admin, Eventarc Event Receiver, Logs Writer, Workflows Invoker.

      Pour attribuer un rôle, trouvez la liste Sélectionner un rôle, puis sélectionnez le rôle.

      Pour attribuer des rôles supplémentaires, cliquez sur Ajouter un autre rôle et ajoutez chaque rôle supplémentaire.

    6. Cliquez sur Continuer.
    7. Cliquez sur OK pour terminer la création du compte de service.

  10. Avant de créer un déclencheur pour les événements directs depuis Cloud Storage, accordez le rôle Éditeur Pub/Sub (roles/pubsub.publisher) à l'agent de service Cloud Storage, un compte de service géré par Google :
    1. Dans la console Google Cloud, accédez à la page IAM.

      Accéder à IAM

    2. Cochez la case Inclure les attributions de rôles fournies par Google.
    3. Dans la colonne Compte principal, recherchez l'agent de service Cloud Storage avec le formulaire service-PROJECT_NUMBER@gs-project-accounts.iam.gserviceaccount.com, puis cliquez sur Modifier le compte principal sur la ligne correspondante.
    4. Cliquez sur Ajouter un rôle ou Ajouter un autre rôle.
    5. Dans la liste Sélectionner un rôle, filtrez sur Éditeur Pub/Sub, puis sélectionnez le rôle.
    6. Cliquez sur Enregistrer.
  11. Si vous avez activé l'agent de service Cloud Pub/Sub le 8 avril 2021 ou avant cette date, pour accepter les requêtes push Pub/Sub authentifiées, accordez le rôle Créateur de jetons du compte de service (roles/iam.serviceAccountTokenCreator) au compte de service géré par Google. Sinon, ce rôle est attribué par défaut :
    1. Dans la console Google Cloud, accédez à la page IAM.

      Accéder à IAM

    2. Cochez la case Inclure les attributions de rôles fournies par Google.
    3. Dans la colonne Nom, recherchez le compte de service Cloud Pub/Sub, puis cliquez sur Modifier le compte principal dans la ligne correspondante.
    4. Cliquez sur Ajouter un rôle ou Ajouter un autre rôle.
    5. Dans la liste Sélectionner un rôle, filtrez sur Créateur de jetons du compte de service, puis sélectionnez le rôle.
    6. Cliquez sur Enregistrer.
  12. Dans la console Google Cloud, activez Cloud Shell.

    Activer Cloud Shell

    En bas de la fenêtre de la console Google Cloud, une session Cloud Shell démarre et affiche une invite de ligne de commande. Cloud Shell est un environnement shell dans lequel Google Cloud CLI est déjà installé, et dans lequel des valeurs sont déjà définies pour votre projet actuel. L'initialisation de la session peut prendre quelques secondes.

  13. Dans ce tutoriel, Cloud Shell accepte les commandes /dev/urandom qui génèrent des nombres pseudo-aléatoires.

gcloud

  1. Pour utiliser un terminal en ligne avec la gcloud CLI configurée, activez Cloud Shell:

    En bas de cette page, une session Cloud Shell démarre et affiche une invite de ligne de commande. L'initialisation de la session peut prendre quelques secondes.

    Cloud Shell accepte les commandes /dev/urandom de ce tutoriel qui génèrent des nombres pseudo-aléatoires.

  2. Créer ou sélectionner un projet Google Cloud
    • Créez un projet Google Cloud :

      gcloud projects create PROJECT_ID
    • Sélectionnez le projet Google Cloud que vous avez créé :

      gcloud config set project PROJECT_ID
  3. Vérifiez que la facturation est activée pour votre projet Google Cloud.
  4. Activez les 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. Créez un compte de service que votre workflow utilisera pour l'authentification avec d'autres services Google Cloud et attribuez-lui les rôles appropriés.
    1. Créez le compte de service :
      gcloud iam service-accounts create SERVICE_ACCOUNT_NAME
      

      Remplacez SERVICE_ACCOUNT_NAME par le nom du compte de service.

    2. Attribuez des rôles au compte de service géré par l'utilisateur que vous avez créé à l'étape précédente. Exécutez la commande suivante une fois pour chacun des rôles IAM ci-dessous, ou utilisez l'option --role plusieurs fois dans une même commande :
      • roles/eventarc.eventReceiver: pour recevoir des événements
      • roles/logging.logWriter: permet d'écrire des journaux.
      • roles/run.admin: permet d'exécuter la tâche Cloud Run.
      • roles/workflows.invoker: permet d'appeler des workflows.
      gcloud projects add-iam-policy-binding PROJECT_ID \
          --member=serviceAccount:SERVICE_ACCOUNT_NAME@PROJECT_ID.iam.gserviceaccount.com \
          --role=ROLE
      

      Remplacez les éléments suivants :

      • PROJECT_ID: ID du projet dans lequel vous avez créé le compte de service.
      • ROLE: rôle à attribuer au compte de service géré par l'utilisateur
  6. Avant de créer un déclencheur pour des événements directs à partir de Cloud Storage, attribuez le rôle Éditeur Pub/Sub (roles/pubsub.publisher) à l'agent de service Cloud Storage, un compte de service géré par Google :

    SERVICE_ACCOUNT="$(gsutil kms serviceaccount -p PROJECT_ID)"
    
    gcloud projects add-iam-policy-binding PROJECT_ID \
        --member="serviceAccount:${SERVICE_ACCOUNT}" \
        --role='roles/pubsub.publisher'
    
  7. Si vous avez activé l'agent de service Cloud Pub/Sub le 8 avril 2021 ou à une date antérieure, attribuez le rôle Créateur de jetons du compte de service (roles/iam.serviceAccountTokenCreator) au compte de service géré par Google pour accepter les requêtes push Pub/Sub authentifiées. Sinon, ce rôle est attribué par défaut :
    gcloud projects add-iam-policy-binding PROJECT_ID \
        --member=serviceAccount:service-PROJECT_NUMBER@gcp-sa-pubsub.iam.gserviceaccount.com \
        --role=roles/iam.serviceAccountTokenCreator
  8. Remplacez PROJECT_NUMBER par votre numéro de projet Google Cloud. Vous pouvez trouver le numéro de votre projet sur la page Bienvenue de la console Google Cloud ou en exécutant la commande suivante :

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

Terraform

  1. Pour utiliser un terminal en ligne avec la gcloud CLI configurée, activez Cloud Shell:

    En bas de cette page, une session Cloud Shell démarre et affiche une invite de ligne de commande. L'initialisation de la session peut prendre quelques secondes.

    Cloud Shell accepte les commandes /dev/urandom de ce tutoriel qui génèrent des nombres pseudo-aléatoires.

  2. Créer ou sélectionner un projet Google Cloud
    • Créez un projet Google Cloud :

      gcloud projects create PROJECT_ID
    • Sélectionnez le projet Google Cloud que vous avez créé :

      gcloud config set project PROJECT_ID
  3. Vérifiez que la facturation est activée pour votre projet Google Cloud.
  4. Activez les 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. Créez un compte de service que votre workflow utilisera pour l'authentification avec d'autres services Google Cloud et attribuez-lui les rôles appropriés. En outre, pour prendre en charge les événements directs depuis Cloud Storage, accordez le rôle Éditeur Pub/Sub (roles/pubsub.publisher) à l'agent de service Cloud Storage, un compte de service géré par Google.

    Modifiez votre fichier main.tf comme indiqué dans l'exemple suivant. Pour en savoir plus, consultez la documentation du fournisseur Google pour Terraform.

    Pour savoir comment appliquer ou supprimer une configuration Terraform, consultez la page Commandes Terraform de base.

    Notez que dans un workflow Terraform classique, vous devez appliquer l'intégralité du plan en une seule fois. Toutefois, pour les besoins de ce tutoriel, vous pouvez cibler une ressource spécifique. Exemple :

    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. Si vous avez activé l'agent de service Cloud Pub/Sub le 8 avril 2021 ou à une date antérieure, attribuez le rôle Créateur de jetons du compte de service (roles/iam.serviceAccountTokenCreator) au compte de service géré par Google pour accepter les requêtes push Pub/Sub authentifiées. Sinon, ce rôle est attribué par défaut :
    gcloud projects add-iam-policy-binding PROJECT_ID \
        --member=serviceAccount:service-PROJECT_NUMBER@gcp-sa-pubsub.iam.gserviceaccount.com \
        --role=roles/iam.serviceAccountTokenCreator
  7. Remplacez PROJECT_NUMBER par votre numéro de projet Google Cloud. Vous pouvez trouver le numéro de votre projet sur la page Bienvenue de la console Google Cloud ou en exécutant la commande suivante :

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

Créer un job Cloud Run

Ce tutoriel utilise un exemple de job Cloud Run provenant de GitHub. La tâche lit les données d'un fichier d'entrée dans Cloud Storage et effectue un traitement arbitraire pour chaque ligne du fichier.

  1. Récupérez l'exemple de code en clonant le dépôt de l'exemple d'application sur votre ordinateur local:

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

    Vous pouvez également télécharger l'exemple en tant que fichier ZIP et l'extraire.

  2. Accédez au répertoire qui contient l'exemple de code :

    cd jobs-demos/parallel-processing
    
  3. Créez un bucket Cloud Storage pour stocker un fichier d'entrée pouvant être écrit et déclencher un événement:

    Console

    1. Dans la console Google Cloud, accédez à la page Buckets Cloud Storage.

      Accéder à la page "Buckets"

    2. Cliquez sur add Créer.
    3. Sur la page Créer un bucket, saisissez le nom de votre bucket :
      input-PROJECT_ID
      Remplacez PROJECT_ID par l'ID de votre projet Google Cloud.
    4. Conservez les autres valeurs par défaut.
    5. Cliquez sur Créer.

    gcloud

    Exécutez la commande gcloud storage buckets create:

    gcloud storage buckets create gs://input-PROJECT_ID

    Si la requête aboutit, la commande renvoie le message suivant :

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

    Terraform

    Pour créer un bucket Cloud Storage, utilisez la ressource google_storage_bucket et modifiez le fichier main.tf, comme indiqué dans l'exemple suivant.

    Pour savoir comment appliquer ou supprimer une configuration Terraform, consultez la page Commandes Terraform de base.

    Notez que dans un workflow Terraform classique, vous appliquez le plan complet en une seule fois. Toutefois, pour les besoins de ce tutoriel, vous pouvez cibler une ressource spécifique. Exemple :

    terraform apply -target="random_id.bucket_name_suffix"
    et
    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. Créez un dépôt standard Artifact Registry dans lequel vous pouvez stocker votre image de conteneur:

    Console

    1. Dans la console Google Cloud, accédez à la page Dépôts d'Artifact Registry:

      Accédez aux dépôts.

    2. Cliquez sur Créer un dépôt.

    3. Saisissez un nom pour le dépôt, par exemple my-repo. Pour chaque emplacement de dépôt d'un projet, les noms de dépôt doivent être uniques.

    4. Conservez le format par défaut qui devrait être Docker.

    5. Conservez le mode par défaut qui devrait être Standard.

    6. Pour la région, sélectionnez us-central1 (Iowa).

    7. Conservez toutes les autres valeurs par défaut.

    8. Cliquez sur Créer.

    gcloud

    Exécutez la commande suivante :

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

    Remplacez REPOSITORY par un nom unique pour le dépôt, par exemple my-repo. Pour chaque emplacement de dépôt d'un projet, les noms de dépôt doivent être uniques.

    Terraform

    Pour créer un dépôt Artifact Registry, utilisez la ressource google_artifact_registry_repository et modifiez le fichier main.tf, comme indiqué dans l'exemple suivant.

    Notez que dans un workflow Terraform classique, vous devez appliquer l'intégralité du plan en une seule fois. Toutefois, pour les besoins de ce tutoriel, vous pouvez cibler une ressource spécifique. Exemple :

    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. Créez l'image de conteneur à l'aide d'un pack de création Google Cloud par défaut:

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

    Remplacez REPOSITORY par le nom de votre dépôt Artifact Registry.

    La compilation peut prendre quelques minutes.

  6. Créez une tâche Cloud Run qui déploie l'image du conteneur:

    Console

    1. Dans la console Google Cloud, accédez à la page Cloud Run:

      Accédez à Cloud Run

    2. Cliquez sur Créer une tâche pour afficher le formulaire Créer une tâche.

      1. Dans le formulaire, sélectionnez us-central1-docker.pkg.dev/PROJECT_ID/REPOSITORY/parallel-job:latest comme URL de l'image de conteneur Artifact Registry.
      2. Facultatif: Saisissez parallel-job comme nom de tâche.
      3. Facultatif: Pour la région, sélectionnez us-central1 (Iowa).
      4. Pour le nombre de tâches que vous souhaitez exécuter dans le job, saisissez 10. Toutes les tâches doivent réussir pour que le travail réussisse. Par défaut, les tâches s'exécutent en parallèle.
    3. Développez la section Conteneur, variables et secrets, connexions et sécurité et conservez toutes les valeurs par défaut à l'exception des paramètres suivants:

      1. Cliquez sur l'onglet Général.

        1. Pour la commande du conteneur, saisissez python.
        2. Pour l'argument de conteneur, saisissez process.py.
      2. Cliquez sur l'onglet Variables et secrets.

        1. Cliquez sur Ajouter une variable, puis saisissez INPUT_BUCKET pour le nom et input-PROJECT_ID pour la valeur.
        2. Cliquez sur Ajouter une variable, puis saisissez INPUT_FILE pour le nom et input_file.txt pour la valeur.
    4. Pour créer la tâche, cliquez sur Créer.

    gcloud

    1. Définissez la région Cloud Run par défaut:

      gcloud config set run/region us-central1
    2. Créez la tâche 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

      Notez que si vous ne spécifiez pas de tag d'image, Artifact Registry recherche l'image avec le tag latest par défaut.

      Pour obtenir la liste complète des options disponibles lors de la création d'une tâche, consultez la documentation sur la ligne de commande gcloud run jobs create.

      Une fois la tâche créée, un message confirmant le succès de l'opération doit s'afficher.

    Terraform

    Pour créer une tâche Cloud Run, utilisez la ressource google_cloud_run_v2_job et modifiez le fichier main.tf, comme indiqué dans l'exemple suivant.

    Notez que dans un workflow Terraform classique, vous devez appliquer l'intégralité du plan en une seule fois. Toutefois, pour les besoins de ce tutoriel, vous pouvez cibler une ressource spécifique. Exemple :

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

Déployer un workflow qui exécute le job Cloud Run

Définissez et déployez un workflow qui exécute la tâche Cloud Run que vous venez de créer. Une définition de workflow est composée d'une série d'étapes décrites à l'aide de la syntaxe Workflows.

Console

  1. Dans la console Google Cloud, accédez à la page Workflows:

    Accéder à "Workflows"

  2. Cliquez sur Créer.

  3. Saisissez un nom pour le nouveau workflow, par exemple cloud-run-job-workflow.

  4. Pour la région, sélectionnez us-central1 (Iowa).

  5. Dans le champ Compte de service, sélectionnez le compte de service que vous avez créé précédemment.

    Le compte de service sert d'identité au workflow. Vous devez avoir déjà attribué le rôle Administrateur Cloud Run au compte de service pour que le workflow puisse exécuter la tâche Cloud Run.

  6. Cliquez sur Suivant.

  7. Dans l'éditeur de workflow, saisissez la définition suivante pour votre 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. Cliquez sur Deploy (Déployer).

gcloud

  1. Créez un fichier de code source pour votre workflow:

    touch cloud-run-job-workflow.yaml
    
  2. Copiez la définition de workflow suivante dans le fichier de code source:

    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. Déployez le workflow en saisissant la commande suivante :

    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
    

    Remplacez les éléments suivants :

    • SERVICE_ACCOUNT_NAME: nom du compte de service que vous avez créé précédemment
    • PROJECT_ID: ID de votre projet Google Cloud

    Le compte de service sert d'identité au workflow. Vous devez avoir déjà attribué le rôle roles/run.admin au compte de service pour que le workflow puisse exécuter la tâche Cloud Run.

Terraform

Pour créer un workflow, utilisez la ressource google_workflows_workflow et modifiez le fichier main.tf comme indiqué dans l'exemple suivant.

Pour savoir comment appliquer ou supprimer une configuration Terraform, consultez la page Commandes Terraform de base.

Notez que dans un workflow Terraform classique, vous appliquez le plan complet en une seule fois. Toutefois, pour les besoins de ce tutoriel, vous pouvez cibler une ressource spécifique. Exemple :

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 effectue les opérations suivantes:

  1. Étape init : accepte un événement Cloud Storage en tant qu'argument, puis définit les variables nécessaires.

  2. Étape check_input_file : vérifie si le bucket Cloud Storage spécifié dans l'événement est celui utilisé par la tâche Cloud Run.

    • Si c'est le cas, le workflow passe à l'étape run_job.
    • Si ce n'est pas le cas, le workflow est arrêté, interrompant ainsi tout traitement ultérieur.
  3. Étape run_job : utilise la méthode googleapis.run.v1.namespaces.jobs.run du connecteur de l'API Cloud Run Admin pour exécuter la tâche. Les noms du bucket Cloud Storage et des fichiers de données sont transmis en tant que variables de remplacement du workflow à la tâche.

  4. Étape finish : renvoie des informations sur l'exécution de la tâche à la suite du workflow.

Créer un déclencheur Eventarc pour le workflow

Pour exécuter automatiquement le workflow, puis la tâche Cloud Run chaque fois que le fichier de données d'entrée est mis à jour, créez un déclencheur Eventarc qui répond aux événements Cloud Storage dans le bucket contenant le fichier de données d'entrée.

Console

  1. Dans la console Google Cloud, accédez à la page Workflows:

    Accéder à "Workflows"

  2. Cliquez sur le nom de votre workflow, par exemple cloud-run-job-workflow.

  3. Sur la page Workflow details (Détails du workflow), cliquez sur Edit (Modifier).

  4. Dans la section Déclencheurs de la page Modifier le workflow, cliquez sur Ajouter un déclencheur > Eventarc.

    Le volet Déclencheur Eventarc s'ouvre.

  5. Dans le champ Nom du déclencheur, saisissez un nom pour le déclencheur, par exemple cloud-run-job-workflow-trigger.

  6. Dans la liste Fournisseur d'événements, sélectionnez Cloud Storage.

  7. Dans la liste Événement, sélectionnez google.cloud.storage.object.v1.finalized.

  8. Dans le champ Bucket, sélectionnez le bucket contenant le fichier de données d'entrée. Le nom du bucket se présente sous la forme input-PROJECT_ID.

  9. Dans le champ Compte de service, sélectionnez le compte de service que vous avez créé précédemment.

    Le compte de service sert d'identité au déclencheur. Vous devez avoir déjà attribué les rôles suivants au compte de service:

    • Eventarc Event Receiver: permet de recevoir des événements
    • Demandeur de workflows: permet d'exécuter des workflows
  10. Cliquez sur Enregistrer le déclencheur.

    Le déclencheur Eventarc apparaît désormais dans la section Déclencheurs de la page Modifier le workflow.

  11. Cliquez sur Suivant.

  12. Cliquez sur Déployer.

gcloud

Créez un déclencheur Eventarc en exécutant la commande suivante:

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

Remplacez les éléments suivants :

  • PROJECT_ID : ID de votre projet Google Cloud
  • SERVICE_ACCOUNT_NAME: nom du compte de service que vous avez créé précédemment.

Le compte de service sert d'identité au déclencheur. Vous devez avoir déjà attribué les rôles suivants au compte de service:

  • roles/eventarc.eventReceiver: pour recevoir des événements
  • roles/workflows.invoker: permet d'exécuter des workflows.

Terraform

Pour créer un déclencheur, utilisez la ressource google_eventarc_trigger et modifiez le fichier main.tf comme indiqué dans l'exemple suivant.

Pour savoir comment appliquer ou supprimer une configuration Terraform, consultez la page Commandes Terraform de base.

Notez que dans un workflow Terraform classique, vous appliquez le plan complet en une seule fois. Toutefois, pour les besoins de ce tutoriel, vous pouvez cibler une ressource spécifique. Exemple :

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

}

Chaque fois qu'un fichier est importé ou écrasé dans le bucket Cloud Storage contenant le fichier de données d'entrée, le workflow est exécuté avec l'événement Cloud Storage correspondant en tant qu'argument.

Déclencher le workflow

Testez le système de bout en bout en mettant à jour le fichier de données d'entrée dans Cloud Storage.

  1. Générez de nouvelles données pour le fichier d'entrée et importez-le dans Cloud Storage à l'emplacement attendu par le job Cloud Run:

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

    Si vous avez créé un bucket Cloud Storage à l'aide de Terraform, vous pouvez récupérer le nom du bucket en exécutant la commande suivante:

    gcloud storage buckets list gs://input*
    

    L'exécution de la tâche Cloud Run peut prendre quelques minutes.

  2. Vérifiez que la tâche Cloud Run a été exécutée comme prévu en affichant ses exécutions:

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

    Une exécution de la tâche réussie doit s'afficher dans le résultat, indiquant que les tâches 10/10 sont terminées.

Découvrez comment déclencher un workflow avec des événements ou des messages Pub/Sub.

Effectuer un nettoyage

Si vous avez créé un projet pour ce tutoriel, supprimez-le. Si vous avez utilisé un projet existant et que vous souhaitez le conserver sans les modifications du présent tutoriel, supprimez les ressources créées pour ce tutoriel.

Supprimer le projet

Le moyen le plus simple d'empêcher la facturation est de supprimer le projet que vous avez créé pour ce tutoriel.

Pour supprimer le projet :

  1. Dans la console Google Cloud, accédez à la page Gérer les ressources.

    Accéder à la page Gérer les ressources

  2. Dans la liste des projets, sélectionnez le projet que vous souhaitez supprimer, puis cliquez sur Supprimer.
  3. Dans la boîte de dialogue, saisissez l'ID du projet, puis cliquez sur Arrêter pour supprimer le projet.

Supprimer les ressources du tutoriel

Supprimez les ressources que vous avez créées dans ce tutoriel:

  1. Supprimez le déclencheur Eventarc :

    gcloud eventarc triggers delete cloud-run-job-workflow-trigger --location=us
    
  2. Supprimez le workflow:

    gcloud workflows delete cloud-run-job-workflow --location=us-central1
    
  3. Supprimez la tâche Cloud Run:

    gcloud run jobs delete parallel-job
    
  4. Supprimez le bucket Cloud Storage créé pour les données d'entrée:

    gcloud storage rm --recursive gs://input-PROJECT_ID/
    
  5. Supprimez le dépôt Artifact Registry:

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

Étapes suivantes