Tutorial do Pub/Sub do Terraform

Este tutorial demonstra como implementar uma função do Pub/Sub carregando um ficheiro ZIP do código fonte de uma função para um contentor do Cloud Storage, usando o Terraform para aprovisionar os recursos. O Terraform é uma ferramenta de código aberto que lhe permite aprovisionar recursos com ficheiros de configuração declarativos Google Cloud

Este tutorial usa uma função Node.js como exemplo, mas também funciona com funções Python, Go e Java. As instruções são as mesmas, independentemente de qual destes tempos de execução estiver a usar. Consulte as páginas de referência da Hashicorp para ver detalhes sobre a utilização do Terraform com a API Cloud Functions v2.

Configurar o seu ambiente

Neste tutorial, executa comandos no Cloud Shell. O Cloud Shell é um ambiente de shell com a CLI do Google Cloud já instalada, incluindo a CLI do Google Cloud, e com valores já definidos para o seu projeto atual. O Cloud Shell pode demorar vários minutos a inicializar:

Abra o Cloud Shell

A preparar a aplicação

No Cloud Shell, siga estes passos:

  1. Clone o repositório da app de exemplo para a sua instância do Cloud Shell:

    git clone https://github.com/terraform-google-modules/terraform-docs-samples.git
  2. Altere para o diretório que contém o código de exemplo das funções do Cloud Run:

    cd terraform-docs-samples/functions/pubsub

    O exemplo do Node.js usado neste tutorial é uma função básica do Pub/Sub "Hello World". Aqui está o ficheiro 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"
      }
    }

Inicialize o Terraform

No diretório terraform-docs-samples/functions/pubsub que contém o ficheiro main.tf, execute este comando para adicionar os plug-ins necessários e criar o diretório .terraform:

terraform init

Valide a configuração do Terraform

Pré-visualize a configuração do Terraform. Este passo é opcional, mas permite-lhe verificar se a sintaxe de main.tf está correta. Este comando mostra uma pré-visualização dos recursos que vão ser criados:

terraform plan

Aplique a configuração do Terraform

Implemente a função aplicando a configuração. Quando lhe for pedido, introduza yes:

terraform apply

Acionar a função

Para testar a função Pub/Sub:

  1. Publicar uma mensagem no tópico (neste exemplo, o nome do tópico é functions2-topic):

    gcloud pubsub topics publish TOPIC_NAME --message="Friend"
  2. Leia os registos de funções para ver o resultado, onde FUNCTION_NAME é o nome da sua função (neste exemplo, o nome da função é function):

    gcloud functions logs read FUNCTION_NAME

    Deve ver o resultado do registo que inclui a nova mensagem "Friend".

Limpar

Depois de concluir o tutorial, pode eliminar tudo o que criou para não incorrer em custos adicionais.

O Terraform permite-lhe remover todos os recursos definidos no ficheiro de configuração executando o comando terraform destroy:

terraform destroy

Introduza yes para permitir que o Terraform elimine os seus recursos.