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 e utilizzando Terraform per il provisioning delle risorse. Terraform è uno strumento open source che consente di eseguire il provisioning Google Cloud delle risorse con file di configurazione dichiarativi

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

Obiettivi

  • Scopri come utilizzare Terraform per eseguire il deployment di una funzione Pub/Sub.

Costi

In questo documento utilizzi i seguenti componenti fatturabili di Google Cloud:

For details, see Cloud Run functions pricing.

Per generare una stima dei costi in base all'utilizzo previsto, utilizza il Calcolatore prezzi. I nuovi Google Cloud utenti potrebbero avere diritto a una prova gratuita.

Prima di iniziare

  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. Make sure 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. To initialize the gcloud CLI, run the following command:

    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. Make sure that billing is enabled for your Google Cloud project.

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

    Enable the APIs

  10. Install the Google Cloud CLI.
  11. To initialize the gcloud CLI, run the following command:

    gcloud init
  12. Se hai già installato gcloud CLI, aggiornalo eseguendo il seguente comando:

    gcloud components update
  13. Concedi roles/run.invoker e roles/cloudbuild.builds.builder all'account di servizio Compute predefinito.
  14. Prepara l'ambiente di sviluppo.

    Vai alla guida alla configurazione di Node.js

Configurazione dell'ambiente

In questo tutorial esegui i comandi in Cloud Shell. Cloud Shell è un ambiente shell in cui è già installato Google Cloud CLI, inclusi i 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 i seguenti passaggi:

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

    git clone https://github.com/GoogleCloudPlatform/nodejs-docs-samples.git
  2. Passa alla directory che contiene il codice di esempio delle funzioni Cloud Run:

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

    L'esempio Node.js utilizzato in questo tutorial è una funzione Pub/Sub di base "Hello World".

  3. Crea un file ZIP contenente il codice sorgente della funzione che Terraform carica in un bucket Cloud Storage:

    zip -r function-source.zip .

    Tieni presente che la directory principale del file ZIP deve essere la directory principale del codice sorgente della funzione, pertanto il comando riportato sopra include i file all'interno della directory helloworld, ma non la directory stessa.

Creare il file main.tf

  1. Nella directory nodejs-docs-samples/functions/, crea un file main.tf per la configurazione di Terraform:

    touch main.tf
    
  2. Copia questa configurazione Terraform nel 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     = "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. Modifica il file main.tf per assicurarti che contenga i valori corretti per i seguenti elementi. Devi modificare questo file ogni volta che la configurazione cambia (ad esempio per utilizzare un runtime o eseguire il deployment di una funzione diversi):

    • Tempo di esecuzione: in questo esempio, il tempo di esecuzione è nodejs16.
    • Entry point della funzione: in questo esempio, l'entry point della funzione è helloPubSub.
    • Percorso del file ZIP: in questo esempio, se hai inserito il file main.tf nella directory nodejs-docs-samples/functions/ come descritto sopra, il percorso è ./v2/helloPubSub/function-source.zip.

Inizializza Terraform

  1. In Cloud Shell, esegui il seguente comando per inizializzare Terraform:

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

    Utilizzi l'immagine Docker di Terraform pubblica. Docker è già installato in Cloud Shell. La directory di lavoro corrente viene montata come volume in modo che il container Docker possa leggere il file di configurazione di Terraform.

  2. Esegui questo comando per aggiungere i plug-in necessari e creare la directory .terraform:

    terraform init
    

Convalida la configurazione di 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 funzione (in questo esempio, il nome della funzione è semplicemente function):

    gcloud beta functions logs read FUNCTION_NAME --gen2

    Dovresti vedere l'output dei log che include il nuovo messaggio "Amico".

Esegui la pulizia

Dopo aver completato il tutorial, puoi eliminare tutto ciò che hai creato per evitare di 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.