Tutoriel Terraform pour Pub/Sub (2e génération)


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.

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 :

Pour en savoir plus, consultez la page Tarifs de Cloud Functions.

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

  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. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

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

  4. Activer les API Cloud Functions, Cloud Build, Artifact Registry, and Cloud Storage.

    Activer les API

  5. Installez Google Cloud CLI.
  6. Pour initialiser gcloudCLI, exécutez la commande suivante :

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

    Go to project selector

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

  9. Activer les API Cloud Functions, Cloud Build, Artifact Registry, and Cloud Storage.

    Activer les API

  10. Installez Google Cloud CLI.
  11. Pour initialiser gcloudCLI, exécutez la commande suivante :

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

    gcloud components update
  13. Préparez votre environnement de développement.

    Accéder au guide de configuration de Node.js

Configurer votre environnement

Dans ce tutoriel, vous exécutez des commandes dans Cloud Shell. Cloud Shell est un environnement shell dans lequel Google Cloud CLI est déjà installé 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/GoogleCloudPlatform/nodejs-docs-samples.git
  2. Accédez au répertoire qui contient l'exemple de code de Cloud Functions :

    cd nodejs-docs-samples/functions/v2/helloPubSub/

    L'exemple Node.js utilisé dans ce tutoriel est une fonction Pub/Sub de base "Hello".

  3. Créez un fichier ZIP contenant le code source de la fonction que Terraform importera dans un bucket Cloud Storage:

    zip -r function-source.zip .
    

    Notez que la racine du fichier ZIP doit être le répertoire racine du code source de votre fonction. Par conséquent, la commande ci-dessus inclut les fichiers dans le répertoire helloworld, mais n'inclut pas le répertoire lui-même.

Créer le fichier main.tf

  1. Dans le répertoire nodejs-docs-samples/functions/, créez un fichier main.tf pour la configuration Terraform:

    touch main.tf
    
  2. Copiez cette configuration Terraform dans votre 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     = "nodejs16"
        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"
      }
    }
  3. Modifiez le fichier main.tf pour vous assurer qu'il contient les valeurs adéquates pour les éléments suivants. Vous devez modifier ce fichier chaque fois que votre configuration change (par exemple, pour utiliser un environnement d'exécution différent ou déployer une fonction différente):

    • Environnement d'exécution : dans cet exemple, l'environnement d'exécution est nodejs16.
    • Point d'entrée de la fonction : dans cet exemple, le point d'entrée de la fonction est helloPubSub.
    • Chemin d'accès au fichier ZIP : dans cet exemple, si vous avez placé votre fichier main.tf dans le répertoire nodejs-docs-samples/functions/ comme décrit ci-dessus, le chemin d'accès est ./v2/helloPubSub/function-source.zip.

Initialiser Terraform

  1. Dans Cloud Shell, exécutez la commande suivante pour initialiser Terraform:

    docker run -v $(pwd):/app -w /app hashicorp/terraform:0.12.0 init
    

    Vous devez utiliser l'image Docker Terraform publique. Docker est déjà installé dans Cloud Shell. Le répertoire de travail actuel est installé en tant que volume afin que le conteneur Docker puisse lire le fichier de configuration Terraform.

  2. Exécutez cette commande pour ajouter les plug-ins nécessaires et créez 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 simplement function) :

    gcloud beta functions logs read FUNCTION_NAME --gen2

    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.