Tutoriel sur Pub/Sub pour Terraform


Ce tutoriel explique comment déployer une fonction Pub/Sub en important un fichier ZIP de code source de fonction dans un bucket Cloud Storage, à l'aide de Terraform pour provisionner les ressources. Terraform est un outil Open Source qui vous permet de provisionner des ressources Google Cloud à l'aide de fichiers de configuration déclaratifs.

Ce tutoriel utilise une fonction Node.js comme exemple, mais il fonctionne également avec les fonctions Python, Go et Java. Les instructions sont identiques, quel que soit l'environnement d'exécution que vous utilisez. Pour en savoir plus sur l'utilisation de Terraform avec l'API Cloud Functions v2, consultez les pages de référence de Hashicorp.

Objectifs

  • Apprenez à utiliser Terraform pour déployer une fonction Pub/Sub.

Coûts

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

For details, see Cloud Run functions pricing.

Pour obtenir une estimation des coûts en fonction de votre utilisation prévue, utilisez le simulateur de coût.

Les nouveaux utilisateurs de Google Cloud peuvent bénéficier d'un essai gratuit.

Avant de commencer

  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 Cloud Functions, Cloud Build, Artifact Registry, and Cloud Storage APIs.

    Enable the APIs

  5. Install the Google Cloud CLI.

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

  7. Pour initialiser gcloudCLI, exécutez la commande suivante :

    gcloud init
  8. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

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

  10. Enable the Cloud Functions, Cloud Build, Artifact Registry, and Cloud Storage APIs.

    Enable the APIs

  11. Install the Google Cloud CLI.

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

  13. Pour initialiser gcloudCLI, exécutez la commande suivante :

    gcloud init
  14. Si la gcloud CLI est déjà installée, mettez-le à jour en exécutant la commande suivante :

    gcloud components update
  15. Attribuez roles/run.invoker et roles/cloudbuild.builds.builder au compte de service Compute par défaut.
  16. Préparez votre environnement de développement.

    Accéder au guide de configuration de Node.js

  17. Configurer votre environnement

    Dans ce tutoriel, vous exécutez des commandes dans Cloud Shell. Cloud Shell est un environnement de shell dans lequel Google Cloud CLI est déjà installée avec des valeurs prédéfinies pour votre projet actuel. L'initialisation de Cloud Shell peut prendre quelques minutes.

    Ouvrir Cloud Shell

    Préparer l'application

    Dans Cloud Shell, procédez comme suit :

    1. Clonez le dépôt de l'exemple d'application sur votre instance Cloud Shell:

      git clone https://github.com/terraform-google-modules/terraform-docs-samples.git
    2. Accédez au répertoire contenant l'exemple de code Cloud Run Functions :

      cd terraform-docs-samples/functions/pubsub

      L'exemple Node.js utilisé dans ce tutoriel est une fonction Pub/Sub de base "Hello". Voici le fichier main.tf :

      terraform {
        required_providers {
          google = {
            source  = "hashicorp/google"
            version = ">= 4.34.0"
          }
        }
      }
      
      resource "random_id" "bucket_prefix" {
        byte_length = 8
      }
      
      
      resource "google_service_account" "default" {
        account_id   = "test-gcf-sa"
        display_name = "Test Service Account"
      }
      
      resource "google_pubsub_topic" "default" {
        name = "functions2-topic"
      }
      
      resource "google_storage_bucket" "default" {
        name                        = "${random_id.bucket_prefix.hex}-gcf-source" # Every bucket name must be globally unique
        location                    = "US"
        uniform_bucket_level_access = true
      }
      
      data "archive_file" "default" {
        type        = "zip"
        output_path = "/tmp/function-source.zip"
        source_dir  = "function-source/"
      }
      
      resource "google_storage_bucket_object" "default" {
        name   = "function-source.zip"
        bucket = google_storage_bucket.default.name
        source = data.archive_file.default.output_path # Path to the zipped function source code
      }
      
      resource "google_cloudfunctions2_function" "default" {
        name        = "function"
        location    = "us-central1"
        description = "a new function"
      
        build_config {
          runtime     = "nodejs22"
          entry_point = "helloPubSub" # Set the entry point
          environment_variables = {
            BUILD_CONFIG_TEST = "build_test"
          }
          source {
            storage_source {
              bucket = google_storage_bucket.default.name
              object = google_storage_bucket_object.default.name
            }
          }
        }
      
        service_config {
          max_instance_count = 3
          min_instance_count = 1
          available_memory   = "256M"
          timeout_seconds    = 60
          environment_variables = {
            SERVICE_CONFIG_TEST = "config_test"
          }
          ingress_settings               = "ALLOW_INTERNAL_ONLY"
          all_traffic_on_latest_revision = true
          service_account_email          = google_service_account.default.email
        }
      
        event_trigger {
          trigger_region = "us-central1"
          event_type     = "google.cloud.pubsub.topic.v1.messagePublished"
          pubsub_topic   = google_pubsub_topic.default.id
          retry_policy   = "RETRY_POLICY_RETRY"
        }
      }

    Initialiser Terraform

    Dans le répertoire terraform-docs-samples/functions/pubsub contenant le fichier main.tf, exécutez cette commande pour ajouter les plug-ins nécessaires et créer le répertoire .terraform :

    terraform init
    

    Valider la configuration Terraform

    Prévisualisez la configuration Terraform. Bien que facultative, cette étape vous permet de vérifier que la syntaxe de main.tf est correcte. Cette commande affiche un aperçu des ressources qui seront créées:

    terraform plan
    

    Appliquer la configuration Terraform

    Déployez la fonction en appliquant la configuration. Lorsque vous y êtes invité, saisissez yes.

    terraform apply
    

    Déclencher la fonction

    Pour tester la fonction Pub/Sub, procédez comme suit :

    1. Publiez un message sur le sujet (dans cet exemple, le nom du sujet est functions2-topic) :

      gcloud pubsub topics publish TOPIC_NAME --message="Friend"
    2. Lisez les journaux de la fonction pour afficher le résultat, où FUNCTION_NAME correspond au nom de la fonction (dans cet exemple, le nom de la fonction est function) :

      gcloud functions logs read FUNCTION_NAME

      Les résultats de journalisation incluant votre nouveau message "Friend" doivent s'afficher.

    Effectuer un nettoyage

    Une fois le tutoriel terminé, vous pouvez supprimer tous les éléments que vous avez créés afin d'éviter tous frais supplémentaires.

    Terraform vous permet de supprimer toutes les ressources définies dans le fichier de configuration en exécutant la commande terraform destroy:

    terraform destroy
    

    Saisissez yes pour autoriser Terraform à supprimer vos ressources.