Créer un déclencheur à l'aide de Terraform

Ce document explique comment utiliser les ressources Google Cloud dans Terraform pour créer des déclencheurs Eventarc à l'aide des ressources google_eventarc_trigger pour les destinations suivantes:

Les exemples de ce tutoriel utilisent des événements directs à partir de Cloud Storage, mais peuvent être adaptés à n'importe quel fournisseur d'événements. Pour les besoins de ce tutoriel, de nouvelles ressources sont créées en tant que source d'événements.

Pour obtenir des ressources et des conseils sur l'utilisation de Terraform, consultez la documentation de Terraform sur Google Cloud.

Avant de commencer

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

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

  6. Activer les API Resource Manager and Identity and Access Management (IAM).

    Activer les API

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

  8. Cloud Shell est un environnement shell dans lequel Terraform est déjà intégré.

Créer des déclencheurs Eventarc

Vous pouvez créer des déclencheurs Eventarc à l'aide de Terraform pour différentes destinations.

Cet exemple utilise l'interpolation pour les substitutions, telles que les variables de référence, les attributs de ressources et les fonctions d'appel.

Cloud Run

Déployez vos ressources avec Terraform pour créer des déclencheurs Eventarc à l'aide de Cloud Shell.

1. Activer les API

Utilisez le code suivant pour activer les API requises:

# Enable Cloud Run API
resource "google_project_service" "run" {
  service            = "run.googleapis.com"
  disable_on_destroy = false
}

# Enable Eventarc API
resource "google_project_service" "eventarc" {
  service            = "eventarc.googleapis.com"
  disable_on_destroy = false
}

# Enable Pub/Sub API
resource "google_project_service" "pubsub" {
  service            = "pubsub.googleapis.com"
  disable_on_destroy = false
}

2. Créer un compte de service et configurer IAM

Utilisez le code suivant pour créer un compte de service dédié et des rôles IAM:

# Used to retrieve project information later
data "google_project" "project" {}

# Create a dedicated service account
resource "google_service_account" "eventarc" {
  account_id   = "eventarc-trigger-sa"
  display_name = "Eventarc Trigger 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.eventarc.email}"
}

# Grant permission to invoke Cloud Run services
resource "google_project_iam_member" "runinvoker" {
  project = data.google_project.project.id
  role    = "roles/run.invoker"
  member  = "serviceAccount:${google_service_account.eventarc.email}"
}

Si vous avez activé l'agent de service Pub/Sub le 8 avril 2021 ou à une date antérieure, attribuez le rôle iam.serviceAccountTokenCreator à l'agent de service :

resource "google_project_iam_member" "tokencreator" {
   project  = data.google_project.project.id
   role     = "roles/iam.serviceAccountTokenCreator"
   member   = "serviceAccount:service-${data.google_project.project.number}@gcp-sa-pubsub.iam.gserviceaccount.com"
}

3. Créer un bucket Cloud Storage faisant office de fournisseur d'événements

Utilisez le code suivant pour créer un bucket Cloud Storage, avec des autorisations associées à Eventarc:

# 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          = "trigger-cloudrun-${data.google_project.project.name}-${random_id.bucket_name_suffix.hex}"
  location      = google_cloud_run_v2_service.default.location
  force_destroy = true

  uniform_bucket_level_access = true
}

# Grant the Cloud Storage service account 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}"
}

4. Définir un service Cloud Run en tant que cible d'événement

Créez un service Cloud Run en tant que destination d'événement pour le déclencheur. Utilisez la ressource google_cloud_run_v2_service pour définir un service Cloud Run :

# Deploy Cloud Run service
resource "google_cloud_run_v2_service" "default" {
  name     = "hello-events"
  location = "us-central1"

  template {
    containers {
      # This container will log received events
      image = "us-docker.pkg.dev/cloudrun/container/hello"
    }
    service_account = google_service_account.eventarc.email
  }

  depends_on = [google_project_service.run]
}

5. Définir un déclencheur Eventarc

Un déclencheur Eventarc connecte le fournisseur d'événements à une destination d'événement. Utilisez la ressource google_eventarc_trigger pour définir le fournisseur d'événements directs Cloud Storage, en envoyant vers une destination Cloud Run.

Vous pouvez définir plusieurs matching_criteria avec des attributs CloudEvents compatibles avec Eventarc, qui agissent comme le event-filters que vous spécifiez lorsque vous créez un déclencheur. Pour en savoir plus, suivez les instructions lors de la création d'un déclencheur pour un fournisseur, un type d'événement et une destination Cloud Run spécifiques. Seuls les événements correspondant à tous les filtres sont envoyés à la destination.

# Create an Eventarc trigger, routing Cloud Storage events to Cloud Run
resource "google_eventarc_trigger" "default" {
  name     = "trigger-storage-cloudrun-tf"
  location = google_cloud_run_v2_service.default.location

  # 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 Cloud Run
  destination {
    cloud_run_service {
      service = google_cloud_run_v2_service.default.name
      region  = google_cloud_run_v2_service.default.location
    }
  }

  service_account = google_service_account.eventarc.email
  depends_on = [
    google_project_service.eventarc,
    google_project_iam_member.pubsubpublisher
  ]
}

6. Appliquer les modifications

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

Pour appliquer votre configuration Terraform dans un projet Google Cloud, suivez les procédures des sections suivantes.

Préparer Cloud Shell

  1. Lancez Cloud Shell.
  2. Définissez le projet Google Cloud par défaut dans lequel vous souhaitez appliquer vos configurations Terraform.

    Vous n'avez besoin d'exécuter cette commande qu'une seule fois par projet et vous pouvez l'exécuter dans n'importe quel répertoire.

    export GOOGLE_CLOUD_PROJECT=PROJECT_ID

    Les variables d'environnement sont remplacées si vous définissez des valeurs explicites dans le fichier de configuration Terraform.

Préparer le répertoire

Chaque fichier de configuration Terraform doit avoir son propre répertoire (également appelé module racine).

  1. Dans Cloud Shell, créez un répertoire et un nouveau fichier dans ce répertoire. Le nom du fichier doit comporter l'extension .tf, par exemple main.tf. Dans ce tutoriel, le fichier est appelé main.tf.
    mkdir DIRECTORY && cd DIRECTORY && touch main.tf
  2. Si vous suivez un tutoriel, vous pouvez copier l'exemple de code dans chaque section ou étape.

    Copiez l'exemple de code dans le fichier main.tf que vous venez de créer.

    Vous pouvez également copier le code depuis GitHub. Cela est recommandé lorsque l'extrait Terraform fait partie d'une solution de bout en bout.

  3. Examinez et modifiez les exemples de paramètres à appliquer à votre environnement.
  4. Enregistrez les modifications.
  5. Initialisez Terraform. Cette opération n'est à effectuer qu'une seule fois par répertoire.
    terraform init

    Vous pouvez également utiliser la dernière version du fournisseur Google en incluant l'option -upgrade :

    terraform init -upgrade

Appliquer les modifications

  1. Examinez la configuration et vérifiez que les ressources que Terraform va créer ou mettre à jour correspondent à vos attentes :
    terraform plan

    Corrigez les modifications de la configuration si nécessaire.

  2. Appliquez la configuration Terraform en exécutant la commande suivante et en saisissant yes lorsque vous y êtes invité :
    terraform apply

    Attendez que Terraform affiche le message "Apply completed!" (Application terminée).

  3. Ouvrez votre projet Google Cloud pour afficher les résultats. Dans la console Google Cloud, accédez à vos ressources dans l'interface utilisateur pour vous assurer que Terraform les a créées ou mises à jour.

7. Vérifier la création des ressources

Pour vérifier que le service a été créé, procédez comme suit:

gcloud run services list --region us-central1

Pour confirmer que le déclencheur a été créé, procédez comme suit:

gcloud eventarc triggers list --location us-central1

La sortie devrait ressembler à ce qui suit :

NAME: trigger-storage-cloudrun-tf
TYPE: google.cloud.storage.object.v1.finalized
DESTINATION: Cloud Run service: hello-events
ACTIVE: Yes
LOCATION: us-central1

GKE

Déployez vos ressources avec Terraform pour créer des déclencheurs Eventarc à l'aide de Cloud Shell.

Le déclencheur Eventarc nécessite un service Google Kubernetes Engine. Pour simplifier ce tutoriel, vous allez configurer ce service en dehors de Terraform, entre les configurations Terraform.

1. Créer un cluster GKE

Utilisez le code suivant pour activer les API requises:

# Enable GKE API
resource "google_project_service" "container" {
  service            = "container.googleapis.com"
  disable_on_destroy = false
}

# Enable Eventarc API
resource "google_project_service" "eventarc" {
  service            = "eventarc.googleapis.com"
  disable_on_destroy = false
}

# Enable Pub/Sub API
resource "google_project_service" "pubsub" {
  service            = "pubsub.googleapis.com"
  disable_on_destroy = false
}

Utilisez le code suivant pour créer un cluster GKE:

# Create an auto-pilot GKE cluster
resource "google_container_cluster" "gke_cluster" {
  name     = "eventarc-cluster"
  location = "us-central1"

  enable_autopilot = true

  depends_on = [
    google_project_service.container
  ]
}

2. Appliquer les modifications

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

Pour appliquer votre configuration Terraform dans un projet Google Cloud, suivez les procédures des sections suivantes.

Préparer Cloud Shell

  1. Lancez Cloud Shell.
  2. Définissez le projet Google Cloud par défaut dans lequel vous souhaitez appliquer vos configurations Terraform.

    Vous n'avez besoin d'exécuter cette commande qu'une seule fois par projet et vous pouvez l'exécuter dans n'importe quel répertoire.

    export GOOGLE_CLOUD_PROJECT=PROJECT_ID

    Les variables d'environnement sont remplacées si vous définissez des valeurs explicites dans le fichier de configuration Terraform.

Préparer le répertoire

Chaque fichier de configuration Terraform doit avoir son propre répertoire (également appelé module racine).

  1. Dans Cloud Shell, créez un répertoire et un nouveau fichier dans ce répertoire. Le nom du fichier doit comporter l'extension .tf, par exemple main.tf. Dans ce tutoriel, le fichier est appelé main.tf.
    mkdir DIRECTORY && cd DIRECTORY && touch main.tf
  2. Si vous suivez un tutoriel, vous pouvez copier l'exemple de code dans chaque section ou étape.

    Copiez l'exemple de code dans le fichier main.tf que vous venez de créer.

    Vous pouvez également copier le code depuis GitHub. Cela est recommandé lorsque l'extrait Terraform fait partie d'une solution de bout en bout.

  3. Examinez et modifiez les exemples de paramètres à appliquer à votre environnement.
  4. Enregistrez les modifications.
  5. Initialisez Terraform. Cette opération n'est à effectuer qu'une seule fois par répertoire.
    terraform init

    Vous pouvez également utiliser la dernière version du fournisseur Google en incluant l'option -upgrade :

    terraform init -upgrade

Appliquer les modifications

  1. Examinez la configuration et vérifiez que les ressources que Terraform va créer ou mettre à jour correspondent à vos attentes :
    terraform plan

    Corrigez les modifications de la configuration si nécessaire.

  2. Appliquez la configuration Terraform en exécutant la commande suivante et en saisissant yes lorsque vous y êtes invité :
    terraform apply

    Attendez que Terraform affiche le message "Apply completed!" (Application terminée).

  3. Ouvrez votre projet Google Cloud pour afficher les résultats. Dans la console Google Cloud, accédez à vos ressources dans l'interface utilisateur pour vous assurer que Terraform les a créées ou mises à jour.

3. Configurer GKE

Déployez sur GKE un service Kubernetes qui recevra les requêtes HTTP et les événements de journaux à l'aide d'une image Cloud Run prédéfinie, us-docker.pkg.dev/cloudrun/container/hello:

  1. Obtenez des identifiants d'authentification pour interagir avec le cluster :

    gcloud container clusters get-credentials eventarc-cluster \
       --region=us-central1
    
  2. Créez un déploiement nommé hello-gke:

    kubectl create deployment hello-gke \
       --image=us-docker.pkg.dev/cloudrun/container/hello
    
  3. Exposer le déploiement en tant que service Kubernetes:x

    kubectl expose deployment hello-gke \
       --type ClusterIP --port 80 --target-port 8080
    
  4. Assurez-vous que le pod est en cours d'exécution:

    kubectl get pods
    

    La sortie devrait ressembler à ce qui suit :

    NAME                        READY   STATUS
    hello-gke-df6469d4b-5vv22   1/1     Running
    

    Si l'état (STATUS) est défini sur Pending, le pod est en cours de déploiement. Attendez une minute pour que le déploiement soit terminé, puis vérifiez à nouveau l'état.

  5. Assurez-vous que le service est en cours d'exécution:

    kubectl get svc
    

    La sortie devrait ressembler à ce qui suit :

    NAME         TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)   AGE
    hello-gke    ClusterIP   34.118.226.144   <none>        80/TCP
    kubernetes   ClusterIP   34.118.224.1     <none>        443/TCP
    

4. Créer et configurer Eventarc

Utilisez la configuration suivante pour configurer un compte de service et lui attribuer des rôles spécifiques pour qu'Eventarc gère les événements pour GKE.

# Create a service account to be used by GKE trigger
resource "google_service_account" "eventarc_gke_trigger_sa" {
  account_id   = "eventarc-gke-trigger-sa"
  display_name = "Evenarc GKE Trigger 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.eventarc_gke_trigger_sa.email}"
}

# Grant permission to subscribe to Pub/Sub topics
resource "google_project_iam_member" "pubsubscriber" {
  project = data.google_project.project.id
  role    = "roles/pubsub.subscriber"
  member  = "serviceAccount:${google_service_account.eventarc_gke_trigger_sa.email}"
}

Utilisez le code suivant pour créer un bucket Cloud Storage, avec des autorisations associées à Eventarc:

# 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          = "trigger-gke-${data.google_project.project.name}-${random_id.bucket_name_suffix.hex}"
  location      = "us-central1"
  force_destroy = true

  uniform_bucket_level_access = true
}

# Grant the Cloud Storage service account 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}"
}

Utilisez la configuration suivante pour activer les API requises et initialiser les services de destination GKE Eventarc:

# Used to retrieve project_number later
data "google_project" "project" {}

# Enable Eventarc to manage GKE clusters
# This is usually done with: gcloud eventarc gke-destinations init
#
# Eventarc creates a separate Event Forwarder pod for each trigger targeting a
# GKE service, and  requires explicit permissions to make changes to the
# cluster. This is done by granting permissions to a special service account
# (the Eventarc P4SA) to manage resources in the cluster. This needs to be done
# once per Google Cloud project.

# This identity is created with: gcloud beta services identity create --service eventarc.googleapis.com
# This local variable is used for convenience
locals {
  eventarc_sa = "serviceAccount:service-${data.google_project.project.number}@gcp-sa-eventarc.iam.gserviceaccount.com"
}

resource "google_project_iam_member" "computeViewer" {
  project = data.google_project.project.id
  role    = "roles/compute.viewer"
  member  = local.eventarc_sa
}

resource "google_project_iam_member" "containerDeveloper" {
  project = data.google_project.project.id
  role    = "roles/container.developer"
  member  = local.eventarc_sa
}

resource "google_project_iam_member" "serviceAccountAdmin" {
  project = data.google_project.project.id
  role    = "roles/iam.serviceAccountAdmin"
  member  = local.eventarc_sa
}

Créer un déclencheur Eventarc qui achemine les événements Pub/Sub vers le service GKE hello-gke.

Vous pouvez définir plusieurs matching_criteria avec des attributs CloudEvents compatibles avec Eventarc, qui agissent comme le event-filters que vous spécifiez lorsque vous créez un déclencheur. Pour en savoir plus, suivez les instructions lors de la création d'un déclencheur pour un fournisseur, un type d'événement et une destination GKE spécifiques. Seuls les événements correspondant à tous les filtres sont envoyés à la destination.

# Create an Eventarc trigger, routing Storage events to GKE
resource "google_eventarc_trigger" "default" {
  name     = "trigger-storage-gke-tf"
  location = "us-central1"

  # 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 GKE service
  destination {
    gke {
      cluster   = "eventarc-cluster"
      location  = "us-central1"
      namespace = "default"
      path      = "/"
      service   = "hello-gke"
    }
  }

  service_account = google_service_account.eventarc_gke_trigger_sa.email
}

5. Appliquer les modifications supplémentaires

Pour appliquer la configuration Terraform supplémentaire dans un projet Google Cloud, procédez comme suit:

  1. Créez le compte d'identité Eventarc:

    gcloud beta services identity create --service eventarc.googleapis.com
    
  2. Ajoutez le nouveau code Terraform de l'étape précédente au fichier main.tf existant.

  3. Appliquez les configurations Terraform mises à jour:

    terraform plan
    terraform apply
    

    Attendez que Terraform affiche le message "Apply completed!" (Application terminée).

  4. Ouvrez votre projet Google Cloud pour afficher les résultats. Dans la console Google Cloud, accédez à vos ressources dans l'interface utilisateur pour vous assurer que Terraform les a créées ou mises à jour.

Workflows

Déployez vos ressources avec Terraform pour créer un workflow et un déclencheur Eventarc à l'aide de Cloud Shell.

1. Activer les API

Utilisez le code suivant pour activer les API requises:

# Enable Eventarc API
resource "google_project_service" "eventarc" {
  service            = "eventarc.googleapis.com"
  disable_on_destroy = false
}

# Enable Workflows API
resource "google_project_service" "workflows" {
  service            = "workflows.googleapis.com"
  disable_on_destroy = false
}

# Enable Pub/Sub API
resource "google_project_service" "pubsub" {
  service            = "pubsub.googleapis.com"
  disable_on_destroy = false
}

2. Créer un compte de service et configurer IAM

Utilisez le code suivant pour créer un compte de service dédié et ajouter des rôles IAM:

# Used to retrieve project information later
data "google_project" "project" {}

# Create a service account for Eventarc trigger and Workflows
resource "google_service_account" "eventarc" {
  account_id   = "eventarc-workflows-sa"
  display_name = "Eventarc Workflows Service Account"
}

# 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.eventarc.email}"
}

# Grant permission to receive events
resource "google_project_iam_member" "eventreceiver" {
  project = data.google_project.project.id
  role    = "roles/eventarc.eventReceiver"
  member  = "serviceAccount:${google_service_account.eventarc.email}"
}

Si vous avez activé l'agent de service Pub/Sub le 8 avril 2021 ou à une date antérieure, attribuez le rôle iam.serviceAccountTokenCreator à l'agent de service :

resource "google_project_iam_member" "tokencreator" {
   project  = data.google_project.project.id
   role     = "roles/iam.serviceAccountTokenCreator"
   member   = "serviceAccount:service-${data.google_project.project.number}@gcp-sa-pubsub.iam.gserviceaccount.com"
}

3. Créer un bucket Cloud Storage faisant office de fournisseur d'événements

Utilisez le code suivant pour créer un bucket Cloud Storage, avec des autorisations associées à Eventarc:

# 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          = "trigger-workflows-${data.google_project.project.name}-${random_id.bucket_name_suffix.hex}"
  location      = google_workflows_workflow.default.region
  force_destroy = true

  uniform_bucket_level_access = true
}

# Grant the Cloud Storage service account 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}"
}

4. Créer et déployer un workflow

Définissez et déployez un workflow qui est exécuté lorsqu'un objet est mis à jour dans le bucket créé:

# Create a workflow
resource "google_workflows_workflow" "default" {
  name        = "storage-workflow-tf"
  region      = "us-central1"
  description = "Workflow that returns information about storage events"

  # Note that $$ is needed for Terraform
  source_contents = <<EOF
  main:
    params: [event]
    steps:
      - log_event:
          call: sys.log
          args:
            text: $${event}
            severity: INFO
      - gather_data:
          assign:
            - bucket: $${event.data.bucket}
            - name: $${event.data.name}
            - message: $${"Received event " + event.type + " - " + bucket + ", " + name}
      - return_data:
          return: $${message}
  EOF

  depends_on = [
    google_project_service.workflows
  ]
}

5. Créer un déclencheur Eventarc

Créer un déclencheur Eventarc qui achemine les événements directs du bucket créé vers Workflows. Utilisez la ressource google_eventarc_trigger pour définir la ressource de déclencheur Eventarc.

Vous pouvez définir plusieurs matching_criteria avec des attributs CloudEvents compatibles avec Eventarc, qui agissent comme le event-filters que vous spécifiez lorsque vous créez un déclencheur. Pour en savoir plus, suivez les instructions lors de la création d'un déclencheur pour un fournisseur, un type d'événement et une destination Workflows spécifiques.

Seuls les événements correspondant à tous les filtres sont envoyés à la destination.

# Create an Eventarc trigger, routing Cloud Storage events to Workflows
resource "google_eventarc_trigger" "default" {
  name     = "trigger-storage-workflows-tf"
  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.eventarc.email

  depends_on = [
    google_project_service.eventarc,
    google_project_service.workflows,
  ]
}

6. Appliquer les modifications

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

Pour appliquer votre configuration Terraform dans un projet Google Cloud, suivez les procédures des sections suivantes.

Préparer Cloud Shell

  1. Lancez Cloud Shell.
  2. Définissez le projet Google Cloud par défaut dans lequel vous souhaitez appliquer vos configurations Terraform.

    Vous n'avez besoin d'exécuter cette commande qu'une seule fois par projet et vous pouvez l'exécuter dans n'importe quel répertoire.

    export GOOGLE_CLOUD_PROJECT=PROJECT_ID

    Les variables d'environnement sont remplacées si vous définissez des valeurs explicites dans le fichier de configuration Terraform.

Préparer le répertoire

Chaque fichier de configuration Terraform doit avoir son propre répertoire (également appelé module racine).

  1. Dans Cloud Shell, créez un répertoire et un nouveau fichier dans ce répertoire. Le nom du fichier doit comporter l'extension .tf, par exemple main.tf. Dans ce tutoriel, le fichier est appelé main.tf.
    mkdir DIRECTORY && cd DIRECTORY && touch main.tf
  2. Si vous suivez un tutoriel, vous pouvez copier l'exemple de code dans chaque section ou étape.

    Copiez l'exemple de code dans le fichier main.tf que vous venez de créer.

    Vous pouvez également copier le code depuis GitHub. Cela est recommandé lorsque l'extrait Terraform fait partie d'une solution de bout en bout.

  3. Examinez et modifiez les exemples de paramètres à appliquer à votre environnement.
  4. Enregistrez les modifications.
  5. Initialisez Terraform. Cette opération n'est à effectuer qu'une seule fois par répertoire.
    terraform init

    Vous pouvez également utiliser la dernière version du fournisseur Google en incluant l'option -upgrade :

    terraform init -upgrade

Appliquer les modifications

  1. Examinez la configuration et vérifiez que les ressources que Terraform va créer ou mettre à jour correspondent à vos attentes :
    terraform plan

    Corrigez les modifications de la configuration si nécessaire.

  2. Appliquez la configuration Terraform en exécutant la commande suivante et en saisissant yes lorsque vous y êtes invité :
    terraform apply

    Attendez que Terraform affiche le message "Apply completed!" (Application terminée).

  3. Ouvrez votre projet Google Cloud pour afficher les résultats. Dans la console Google Cloud, accédez à vos ressources dans l'interface utilisateur pour vous assurer que Terraform les a créées ou mises à jour.

7. Vérifier la création du workflow

Pour vérifier que le workflow a été créé, exécutez la commande suivante:

gcloud workflows list --location us-central1

8. Vérifier la création du déclencheur Eventarc

Pour vérifier que le déclencheur Eventarc a été créé, exécutez la commande suivante:

gcloud eventarc triggers list --location us-central1

La sortie devrait ressembler à ce qui suit :

NAME: trigger-storage-workflows-tf
TYPE: google.cloud.storage.object.v1.finalized
DESTINATION: Workflows: storage-workflow-tf
ACTIVE: Yes
LOCATION: us-central1

Générer et afficher un événement

Vous pouvez générer un événement et vérifier que le déclencheur Eventarc fonctionne comme prévu.

Cloud Run

  1. Pour générer un événement, procédez comme suit :

    Transférez un fichier texte vers Cloud Storage :

    echo "Hello World" > random.txt
    gsutil cp random.txt gs://trigger-cloudrun-PROJECT_ID/random.txt
    

    L'importation génère un événement, et le service Cloud Run consigne le message de l'événement.

  2. Pour vérifier qu'un événement a été reçu, procédez comme suit:

    1. Pour afficher les entrées de journal liées aux événements créées par votre service, procédez comme suit :
    gcloud logging read "resource.type=cloud_run_revision \
        AND resource.labels.service_name=hello-events"
    

    Vous pouvez également ouvrir la console Google Cloud, accéder à la ressource Cloud Run et afficher les journaux.

    1. Recherchez une entrée de journal semblable à ceci :
    Received event of type google.cloud.storage.object.v1.finalized.
    Event data: { "kind": "storage#object", "id": "trigger-cloudrun-PROJECT_ID/random.txt", ...}
    

GKE

  1. Pour générer un événement, procédez comme suit :

    Transférez un fichier texte vers Cloud Storage :

    echo "Hello World" > random.txt
    gsutil cp random.txt gs://trigger-gke-PROJECT_ID/random.txt
    

    L'importation génère un événement, et le service Cloud Run consigne le message de l'événement.

  2. Pour vérifier qu'un événement a été reçu, procédez comme suit:

    1. Recherchez l'ID du pod:

      POD_NAME=$(kubectl get pods -o custom-columns=":metadata.name" --no-headers)
      

      Cette commande utilise le résultat formaté de kubectl.

    2. Vérifiez les journaux du pod:

      kubectl logs $POD_NAME
      
    3. Recherchez une entrée de journal semblable à ceci :

      {"severity":"INFO","eventType":"google.cloud.pubsub.topic.v1.messagePublished",
      "message":"Received event of type google.cloud.pubsub.topic.v1.messagePublished.", [...]}
      

Workflows

  1. Pour générer un événement, procédez comme suit :

    Transférez un fichier texte vers Cloud Storage :

    echo "Hello World" > random.txt
    gsutil cp random.txt gs://trigger-workflows-PROJECT_ID/random.txt
    

    L'importation génère un événement, et le service Cloud Run consigne le message de l'événement.

  2. Pour vérifier qu'un événement a été reçu, procédez comme suit:

    1. Vérifiez qu'une exécution de workflow est déclenchée en répertoriant les cinq dernières exécutions:

      gcloud workflows executions list storage-workflow-tf --limit=5
      

      Le résultat doit inclure une liste d'exécutions avec les paramètres NAME, START_TIME, END_TIME et STATUS.

    2. Obtenez les résultats pour l'exécution la plus récente:

      EXECUTION_NAME=$(gcloud workflows executions list storage-workflow-tf --limit=1 --format "value(name)")
      gcloud workflows executions describe $EXECUTION_NAME
      
    3. Le résultat ressemble à ce qui suit :

      ...
      result: '"Received event google.cloud.storage.object.v1.finalized - trigger-workflows-PROJECT_ID, random.txt"'
      state: SUCCEEDED
      ...
      

      Recherchez state: SUCCEEDED et result: "Received event" dans le résultat des workflows.

Effectuer un nettoyage

Supprimez les ressources précédemment appliquées à votre configuration Terraform en exécutant la commande suivante et en saisissant yes à la requête :

terraform destroy

Vous pouvez également supprimer votre projet Google Cloud pour éviter des frais. La suppression de votre projet Google Cloud arrête la facturation de toutes les ressources utilisées dans ce 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.

Étapes suivantes