Tutorial su Terraform Pub/Sub

Questo tutorial mostra come eseguire il deployment di una funzione Pub/Sub caricando un file zip del codice sorgente della funzione in un bucket Cloud Storage utilizzando Terraform per il provisioning delle risorse. Terraform è uno strumento open source che consente di eseguire il provisioning delle risorse con file di configurazione dichiarativi. Google Cloud

Questo tutorial utilizza una funzione Node.js come esempio, ma funziona anche con le funzioni Python, Go e Java. Le istruzioni sono le stesse indipendentemente dal runtime che utilizzi. Consulta le pagine di riferimento di HashiCorp per informazioni dettagliate sull'utilizzo di Terraform con l'API Cloud Functions v2.

Configurazione dell'ambiente

In questo tutorial, esegui i comandi in Cloud Shell. Cloud Shell è un ambiente shell con Google Cloud CLI già installato, inclusa l'interfaccia a riga di comando Google Cloud, e con valori già impostati per il progetto corrente. L'inizializzazione di Cloud Shell può richiedere diversi minuti:

Apri Cloud Shell

Preparazione della richiesta

In Cloud Shell, esegui questi passaggi:

  1. Clona il repository dell'app di esempio nell'istanza di Cloud Shell:

    git clone https://github.com/terraform-google-modules/terraform-docs-samples.git
  2. Passa alla directory che contiene il codice campione delle funzioni Cloud Run:

    cd terraform-docs-samples/functions/pubsub

    L'esempio Node.js utilizzato in questo tutorial è una semplice funzione Pub/Sub "Hello World". Ecco il file 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"
      }
    }

Inizializza Terraform

Nella directory terraform-docs-samples/functions/pubsub contenente il file main.tf, esegui questo comando per aggiungere i plug-in necessari e creare la directory .terraform:

terraform init

Convalida la configurazione Terraform

Visualizza l'anteprima della configurazione Terraform. Questo passaggio è facoltativo, ma ti consente di verificare che la sintassi di main.tf sia corretta. Questo comando mostra un'anteprima delle risorse che verranno create:

terraform plan

Applica la configurazione Terraform

Esegui il deployment della funzione applicando la configurazione. Quando richiesto, inserisci yes:

terraform apply

Attivazione della funzione

Per testare la funzione Pub/Sub:

  1. Pubblica un messaggio nell'argomento (in questo esempio, il nome dell'argomento è functions2-topic):

    gcloud pubsub topics publish TOPIC_NAME --message="Friend"
  2. Leggi i log della funzione per visualizzare il risultato, dove FUNCTION_NAME è il nome della tua funzione (in questo esempio, il nome della funzione è function):

    gcloud functions logs read FUNCTION_NAME

    Dovresti visualizzare l'output di logging che include il nuovo messaggio "Amico".

Esegui la pulizia

Al termine del tutorial, puoi eliminare tutto ciò che hai creato per non incorrere in ulteriori costi.

Terraform ti consente di rimuovere tutte le risorse definite nel file di configurazione eseguendo il comando terraform destroy:

terraform destroy

Inserisci yes per consentire a Terraform di eliminare le risorse.