Recevoir des événements à l'aide de messages Pub/Sub (Terraform)

Ce guide de démarrage rapide explique comment utiliser Terraform pour créer un déclencheur Eventarc qui reçoit des événements directs de Pub/Sub et les achemine vers un service Cloud Run. Pour en savoir plus sur l'utilisation de Terraform pour créer des déclencheurs Eventarc, consultez Créer un déclencheur à l'aide de Terraform.

Dans ce guide de démarrage rapide, vous allez :

  1. Préparez-vous à déployer Terraform.

  2. Définissez une configuration Terraform qui effectue les opérations suivantes :

    1. Activer des API
    2. Créez un compte de service.
    3. Créez un sujet Pub/Sub en tant que fournisseur d'événements.
    4. Déployez un service sur Cloud Run en tant que destination d'événement.
    5. Créer un déclencheur Eventarc.
  3. Appliquez votre configuration Terraform.

Cela vous permet de générer un événement en publiant un message dans le sujet Pub/Sub. Le déclencheur Eventarc achemine le message vers le service récepteur d'événements déployé sur Cloud Run. Le service consigne le message d'événement, ce qui vous fournit un exemple simple d'architecture événementielle.

Avant de commencer

Les contraintes de sécurité définies par votre organisation peuvent vous empêcher d'effectuer les étapes suivantes. Pour en savoir plus sur la résolution de ce problème, consultez Développer des applications dans un environnement Google Cloud limité.

  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 sans frais pour exécuter, tester et déployer des charges de travail.
  2. Installez la Google Cloud CLI.

  3. Si vous utilisez un fournisseur d'identité (IdP) externe, vous devez d'abord vous connecter à la gcloud CLI avec votre identité fédérée.

  4. Pour initialiser la gcloud CLI, exécutez la commande suivante :

    gcloud init
  5. Créez ou sélectionnez un projet Google Cloud .

    Rôles requis pour sélectionner ou créer un projet

    • Sélectionnez un projet : la sélection d'un projet ne nécessite pas de rôle IAM spécifique. Vous pouvez sélectionner n'importe quel projet pour lequel un rôle vous a été attribué.
    • Créer un projet : pour créer un projet, vous devez disposer du rôle Créateur de projet (roles/resourcemanager.projectCreator), qui contient l'autorisation resourcemanager.projects.create. Découvrez comment attribuer des rôles.
    • Créez un projet Google Cloud  :

      gcloud projects create PROJECT_ID

      Remplacez PROJECT_ID par le nom du projet Google Cloud que vous créez.

    • Sélectionnez le projet Google Cloud que vous avez créé :

      gcloud config set project PROJECT_ID

      Remplacez PROJECT_ID par le nom de votre projet Google Cloud .

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

  7. Activez les API Cloud Resource Manager et Identity and Access Management (IAM) :

    Rôles requis pour activer les API

    Pour activer les API, vous avez besoin du rôle IAM Administrateur Service Usage (roles/serviceusage.serviceUsageAdmin), qui contient l'autorisation serviceusage.services.enable. Découvrez comment attribuer des rôles.

    gcloud services enable cloudresourcemanager.googleapis.com iam.googleapis.com
  8. Si vous utilisez un shell local, créez des identifiants d'authentification locaux pour votre compte utilisateur :

    gcloud auth application-default login

    Vous n'avez pas besoin de le faire si vous utilisez Cloud Shell.

    Si une erreur d'authentification est renvoyée et que vous utilisez un fournisseur d'identité (IdP) externe, vérifiez que vous vous êtes connecté à la gcloud CLI avec votre identité fédérée.

  9. Installez la Google Cloud CLI.

  10. Si vous utilisez un fournisseur d'identité (IdP) externe, vous devez d'abord vous connecter à la gcloud CLI avec votre identité fédérée.

  11. Pour initialiser la gcloud CLI, exécutez la commande suivante :

    gcloud init
  12. Créez ou sélectionnez un projet Google Cloud .

    Rôles requis pour sélectionner ou créer un projet

    • Sélectionnez un projet : la sélection d'un projet ne nécessite pas de rôle IAM spécifique. Vous pouvez sélectionner n'importe quel projet pour lequel un rôle vous a été attribué.
    • Créer un projet : pour créer un projet, vous devez disposer du rôle Créateur de projet (roles/resourcemanager.projectCreator), qui contient l'autorisation resourcemanager.projects.create. Découvrez comment attribuer des rôles.
    • Créez un projet Google Cloud  :

      gcloud projects create PROJECT_ID

      Remplacez PROJECT_ID par le nom du projet Google Cloud que vous créez.

    • Sélectionnez le projet Google Cloud que vous avez créé :

      gcloud config set project PROJECT_ID

      Remplacez PROJECT_ID par le nom de votre projet Google Cloud .

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

  14. Activez les API Cloud Resource Manager et Identity and Access Management (IAM) :

    Rôles requis pour activer les API

    Pour activer les API, vous avez besoin du rôle IAM Administrateur Service Usage (roles/serviceusage.serviceUsageAdmin), qui contient l'autorisation serviceusage.services.enable. Découvrez comment attribuer des rôles.

    gcloud services enable cloudresourcemanager.googleapis.com iam.googleapis.com
  15. Si vous utilisez un shell local, créez des identifiants d'authentification locaux pour votre compte utilisateur :

    gcloud auth application-default login

    Vous n'avez pas besoin de le faire si vous utilisez Cloud Shell.

    Si une erreur d'authentification est renvoyée et que vous utilisez un fournisseur d'identité (IdP) externe, vérifiez que vous vous êtes connecté à la gcloud CLI avec votre identité fédérée.

  16. Si vous utilisez un projet existant pour ce guide, vérifiez que vous disposez des autorisations nécessaires pour suivre les instructions. Si vous avez créé un projet, vous disposez déjà des autorisations requises.

    Autorisations requises

    Pour obtenir les autorisations nécessaires pour suivre ce guide de démarrage rapide, demandez à votre administrateur de vous accorder les rôles IAM suivants sur votre projet :

    Pour en savoir plus sur l'attribution de rôles, consultez la page Gérer l'accès aux projets, aux dossiers et aux organisations.

    Vous pouvez également obtenir les autorisations requises avec des rôles personnalisés ou d'autres rôles prédéfinis.

Préparer le déploiement de Terraform

Avant de déployer des ressources Terraform, vous devez créer un fichier de configuration Terraform. Un fichier de configuration Terraform vous permet de définir l'état final souhaité pour votre infrastructure à l'aide de la syntaxe Terraform.

  1. Si vous utilisez un shell local, installez Terraform.

    Terraform est déjà intégré à l'environnement Cloud Shell. Vous pouvez utiliser Cloud Shell pour déployer vos ressources Terraform sans avoir à installer Terraform.

  2. Dans Cloud Shell ou votre shell local, définissez le projet Google Cloud par défaut dans lequel vous souhaitez appliquer votre configuration 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

    Remplacez PROJECT_ID par l'ID de votre projet Google Cloud .

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

  3. Chaque fichier de configuration Terraform doit avoir son propre répertoire (également appelé module racine). Créez un répertoire et un nouveau fichier dans ce répertoire :

    mkdir DIRECTORY && cd DIRECTORY && touch main.tf

    Remplacez DIRECTORY par le nom de votre répertoire Terraform.

    Le nom du fichier doit comporter l'extension .tf. Par exemple, dans ce démarrage rapide, le fichier de configuration est main.tf.

Définir votre configuration Terraform

Copiez les extraits de code Terraform suivants dans votre fichier main.tf. Vous pouvez également copier l'intégralité de l'exemple de code depuis GitHub. Pour ce faire, en haut à droite d'un extrait de code, cliquez sur > Afficher sur GitHub.

Activer les API

Pour activer les API requises pour appliquer la configuration Terraform, utilisez la ressource Terraform google_project_service :

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

Créer un compte de service

Chaque déclencheur Eventarc est associé à un compte de service IAM. Pour créer un compte de service dédié à des fins de test, utilisez la ressource Terraform google_service_account :

# Create a dedicated service account
resource "google_service_account" "eventarc" {
  account_id   = "eventarc-trigger-sa"
  display_name = "Eventarc trigger service account"
}

Si vous avez activé l'agent de service Pub/Sub le 8 avril 2021 ou avant cette date, attribuez-lui le rôle Créateur de jetons du compte de service (roles/iam.serviceAccountTokenCreator).

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

Créer un sujet Pub/Sub en tant que fournisseur d'événements

Pour créer un sujet Pub/Sub, utilisez la ressource Terraform google_pubsub_topic. Pour attribuer à votre compte de service le rôle Éditeur Pub/Sub (roles/pubsub.publisher) au niveau du sujet, utilisez la ressource Terraform google_pubsub_topic_iam_member :

# Create a Pub/Sub topic
resource "google_pubsub_topic" "default" {
  name = "pubsub_topic"
}

# Grant permission to publish messages to a Pub/Sub topic
resource "google_pubsub_topic_iam_member" "pubsubpublisher" {
  project    = google_pubsub_topic.default.project
  topic      = google_pubsub_topic.default.name
  member     = "serviceAccount:${google_service_account.eventarc.email}"
  role       = "roles/pubsub.publisher"
  depends_on = [google_pubsub_topic.default]
}

Déployer un récepteur d'événements sur Cloud Run

Pour créer un service Cloud Run en tant que destination d'événement, utilisez la ressource Terraform google_cloud_run_v2_service. Pour accorder à votre compte de service le rôle Demandeur Cloud Run (roles/run.invoker) au niveau du service, utilisez la ressource Terraform google_cloud_run_v2_service_iam_member :

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

  deletion_protection = false # set to "true" in production

  template {
    containers {
      # This sample container listens to HTTP requests and logs received events
      image = "us-docker.pkg.dev/cloudrun/container/hello"
    }
    service_account = google_service_account.eventarc.email
  }

  depends_on = [google_project_service.run]
}

# Grant permission to invoke Cloud Run services
resource "google_cloud_run_v2_service_iam_member" "runinvoker" {
  project    = google_cloud_run_v2_service.default.project
  location   = google_cloud_run_v2_service.default.location
  name       = google_cloud_run_v2_service.default.name
  role       = "roles/run.invoker"
  member     = "serviceAccount:${google_service_account.eventarc.email}"
  depends_on = [google_cloud_run_v2_service.default]
}

Créer un déclencheur Eventarc

Pour créer un déclencheur Eventarc afin d'écouter les messages Pub/Sub, utilisez la ressource Terraform google_eventarc_trigger :

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

  # Capture messages published to a Pub/Sub topic
  matching_criteria {
    attribute = "type"
    value     = "google.cloud.pubsub.topic.v1.messagePublished"
  }

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

  transport {
    pubsub {
      topic = google_pubsub_topic.default.id
    }
  }

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

Appliquer la configuration Terraform

Utilisez la CLI Terraform pour provisionner l'infrastructure en fonction du fichier de configuration. Pour en savoir plus, consultez Commandes Terraform de base.

  1. Initialisez Terraform. Vous ne devez effectuer cette opération 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
  2. Examinez la configuration et vérifiez que les ressources que Terraform va créer ou mettre à jour correspondent à vos attentes :

    terraform plan

    Corrigez la configuration si nécessaire.

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

    terraform apply

    En général, vous appliquez l'intégralité de la configuration en une seule fois. Cependant, vous pouvez également cibler une ressource spécifique. Exemple :

    terraform apply -target="google_eventarc_trigger.default"

    Après avoir activé les API, il peut s'écouler quelques minutes avant que l'action ne se propage et que vous puissiez déployer d'autres ressources. Si vous rencontrez un problème, réessayez d'appliquer la configuration Terraform.

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

Vérifier la création des ressources

  1. Vérifiez que le service Cloud Run a été créé :

    gcloud run services list --region us-central1
    

    La sortie devrait ressembler à ce qui suit :

    SERVICE: hello-events
    REGION: us-central1
    URL: https://hello-events-13335919645.us-central1.run.app
    LAST DEPLOYED BY: ...
    LAST DEPLOYED AT: 2024-12-16T15:00:52.606160Z
    
  2. Vérifiez que le déclencheur Eventarc a bien été créé :

    gcloud eventarc triggers list --location us-central1
    

    La sortie devrait ressembler à ce qui suit :

    NAME: trigger-pubsub-cloudrun-tf
    TYPE: google.cloud.pubsub.topic.v1.messagePublished
    DESTINATION: Cloud Run service: hello-events
    ACTIVE: Yes
    LOCATION: us-central1
    

Générer et afficher un événement de type sujet Pub/Sub.

Vous pouvez générer un événement en publiant un message dans le sujet Pub/Sub. Le déclencheur Eventarc achemine le message vers le service récepteur d'événements déployé sur Cloud Run, et le service consigne le message d'événement.

  1. Recherchez et définissez le sujet Pub/Sub en tant que variable d'environnement :

    gcloud config set eventarc/location us-central1
    export RUN_TOPIC=$(gcloud eventarc triggers describe trigger-pubsub-cloudrun-tf \
        --format='value(transport.pubsub.topic)')
    
  2. Pour générer un événement, publiez un message dans le sujet Pub/Sub :

    gcloud pubsub topics publish $RUN_TOPIC --message "Hello World!"
    

    L'événement est envoyé au service Cloud Run, qui consigne le message d'événement.

  3. Filtrez les entrées de journal créées par votre service :

    gcloud logging read 'jsonPayload.message: "Received event of type google.cloud.pubsub.topic.v1.messagePublished"'
    
  4. Recherchez une entrée de journal semblable à ceci :

    jsonPayload:
    ...
    message: 'Received event of type google.cloud.pubsub.topic.v1.messagePublished.
        Event data: Hello World!'
    

Vous avez utilisé Terraform pour déployer un service de récepteur d'événements sur Cloud Run et créer un déclencheur Eventarc. Après avoir généré un événement à partir de Pub/Sub, vous pouvez l'afficher dans les journaux Cloud Run.

Effectuer un nettoyage

Une fois que vous avez terminé les tâches décrites dans ce guide de démarrage rapide, vous pouvez éviter de continuer à payer des frais en supprimant les ressources que vous avez créées.

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.

Supprimer un projet Google Cloud  :

gcloud projects delete PROJECT_ID

Si vous envisagez d'explorer plusieurs tutoriels et guides de démarrage rapide, réutiliser des projets peut vous aider à ne pas dépasser les limites de quotas des projets.

Étapes suivantes