Pub/Sub-Anleitung für Terraform

In dieser Anleitung wird gezeigt, wie Sie eine Pub/Sub-Funktion bereitstellen. Dazu laden Sie eine ZIP-Datei mit dem Funktionsquellcode in einen Cloud Storage-Bucket hoch und verwenden Terraform zum Bereitstellen der Ressourcen. Terraform ist ein Open-Source-Tool, mit dem Sie Google Cloud -Ressourcen mit deklarativen Konfigurationsdateien bereitstellen können.

In dieser Anleitung wird als Beispiel eine Funktion von Node.js verwendet. Sie funktioniert jedoch auch mit Python-, Go- und Java-Funktionen. Die Anleitungen sind identisch, unabhängig davon, welche dieser Laufzeiten Sie verwenden. Weitere Informationen zur Verwendung von Terraform mit der Cloud Functions v2 API finden Sie auf den Referenzseiten von HashiCorp.

Umgebung einrichten

In dieser Anleitung führen Sie Befehle in Cloud Shell aus. Cloud Shell ist eine Shell-Umgebung, in der das Google Cloud CLI einschließlich der Google Cloud-Befehlszeile vorinstalliert ist. Auch die Werte für Ihr aktuelles Projekt sind bereits festgelegt. Die Initialisierung von Cloud Shell kann mehrere Minuten dauern:

Cloud Shell öffnen

Anwendung vorbereiten

Führen Sie in Cloud Shell folgende Schritte aus:

  1. Klonen Sie das Repository der Beispielanwendung in Ihre Cloud Shell-Instanz:

    git clone https://github.com/terraform-google-modules/terraform-docs-samples.git
  2. Wechseln Sie in das Verzeichnis, das den Beispielcode für Cloud Run-Funktionen enthält:

    cd terraform-docs-samples/functions/pubsub

    Das in dieser Anleitung verwendete Node.js-Beispiel ist eine grundlegende Pub/Sub-Funktion "Hello World". Hier sehen Sie die Datei 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"
      }
    }

Terraform initialisieren

Führen Sie im terraform-docs-samples/functions/pubsub-Verzeichnis, das die main.tf-Datei enthält, diesen Befehl aus, um die erforderlichen Plug-ins hinzuzufügen und das .terraform-Verzeichnis zu erstellen:

terraform init

Terraform-Konfiguration validieren

Sehen Sie sich eine Vorschau der Terraform-Konfiguration an. Dieser Schritt ist optional, aber Sie können prüfen, ob die Syntax von main.tf korrekt ist. Dieser Befehl zeigt eine Vorschau der erstellten Ressourcen an:

terraform plan

Wenden Sie die Terraform-Konfiguration an:

Stellen Sie die Funktion bereit, indem Sie die Konfiguration anwenden. Geben Sie bei Aufforderung yes ein.

terraform apply

Funktion auslösen

So testen Sie die Pub/Sub-Funktion:

  1. Veröffentlichen Sie eine Nachricht zum Thema (in diesem Beispiel lautet der Themenname functions2-topic):

    gcloud pubsub topics publish TOPIC_NAME --message="Friend"
  2. Lesen Sie die Funktionslogs, um das Ergebnis anzuzeigen, wobei FUNCTION_NAME der Name Ihrer Funktion ist (in diesem Beispiel lautet der Funktionsname function):

    gcloud functions logs read FUNCTION_NAME

    Die Logging-Ausgabe sollte die neue Nachricht "Friend" enthalten.

Bereinigen

Nachdem Sie die Anleitung abgeschlossen haben, können Sie alle erstellten Elemente löschen, sodass keine weiteren Kosten anfallen.

Mit Terraform können Sie alle in der Konfigurationsdatei definierten Ressourcen mit dem Befehl terraform destroy entfernen:

terraform destroy

Geben Sie yes ein, damit Terraform Ihre Ressourcen löschen kann.