Tutorial do Pub/Sub no Terraform

Neste tutorial, você vai aprender a implantar uma função do Pub/Sub fazendo upload de um arquivo ZIP do código-fonte da função em um bucket do Cloud Storage usando o Terraform para provisionar os recursos. O Terraform é uma ferramenta de código aberto que permite provisionar recursos Google Cloud com arquivos de configuração declarativos

Neste tutorial, usamos uma função Node.js como exemplo, mas ela também funciona com funções Python, Go e Java. As instruções são as mesmas, independentemente do ambiente de execução usado. Consulte as páginas de referência do Hashicorp para mais detalhes sobre como usar o Terraform com a API Cloud Functions v2.

Objetivos

  • Saiba como usar o Terraform para implantar uma função Pub/Sub.

Custos

Neste documento, você vai usar os seguintes componentes faturáveis do Google Cloud:

For details, see Cloud Run functions pricing.

Para gerar uma estimativa de custo baseada na projeção de uso deste tutorial, use a calculadora de preços.

Novos usuários do Google Cloud podem estar qualificados para um teste sem custo financeiro.

Antes de começar

  1. Faça login na sua conta do Google Cloud . Se você começou a usar o Google Cloud, crie uma conta para avaliar o desempenho de nossos produtos em situações reais. Clientes novos também recebem US$ 300 em créditos para executar, testar e implantar cargas de trabalho.
  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Roles required to select or create a project

    • Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
    • Create a project: To create a project, you need the Project Creator role (roles/resourcemanager.projectCreator), which contains the resourcemanager.projects.create permission. Learn how to grant roles.

    Go to project selector

  3. Verify that billing is enabled for your Google Cloud project.

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

    Roles required to enable APIs

    To enable APIs, you need the Service Usage Admin IAM role (roles/serviceusage.serviceUsageAdmin), which contains the serviceusage.services.enable permission. Learn how to grant roles.

    Enable the APIs

  5. Instale a CLI do Google Cloud.

  6. Ao usar um provedor de identidade (IdP) externo, primeiro faça login na gcloud CLI com sua identidade federada.

  7. Para inicializar a gcloud CLI, execute o seguinte comando:

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

    Roles required to select or create a project

    • Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
    • Create a project: To create a project, you need the Project Creator role (roles/resourcemanager.projectCreator), which contains the resourcemanager.projects.create permission. Learn how to grant roles.

    Go to project selector

  9. Verify that billing is enabled for your Google Cloud project.

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

    Roles required to enable APIs

    To enable APIs, you need the Service Usage Admin IAM role (roles/serviceusage.serviceUsageAdmin), which contains the serviceusage.services.enable permission. Learn how to grant roles.

    Enable the APIs

  11. Instale a CLI do Google Cloud.

  12. Ao usar um provedor de identidade (IdP) externo, primeiro faça login na gcloud CLI com sua identidade federada.

  13. Para inicializar a gcloud CLI, execute o seguinte comando:

    gcloud init
  14. Se a gcloud CLI já estiver instalada, atualize-a executando o seguinte comando:

    gcloud components update
  15. Conceda roles/run.invoker e o roles/cloudbuild.builds.builder à conta de serviço de computação padrão.
  16. Prepare seu ambiente de desenvolvimento.

    Acessar o guia de configuração do Node.js

Como configurar o ambiente

Neste tutorial, você executa comandos no Cloud Shell. O Cloud Shell é um ambiente com a Google Cloud CLI pré-instalada, incluindo a Google Cloud CLI e os valores já definidos para o projeto atual. O Cloud Shell pode demorar vários minutos para ser inicializado.

Abra o Cloud Shell

Como preparar o aplicativo

No Cloud Shell, execute as seguintes etapas:

  1. Clone o repositório de aplicativos de amostra para sua instância do Cloud Shell:

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

    cd terraform-docs-samples/functions/pubsub

    A amostra Node.js usada neste tutorial é uma função básica do Pub/Sub "Hello World". Este é o arquivo 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 arquivo main.tf, execute este comando para adicionar os plug-ins necessários e criar o diretório .terraform:

terraform init

Validar a configuração do Terraform

Visualizar a configuração do Terraform. Essa etapa é opcional, mas permite verificar se a sintaxe de main.tf está correta. Este comando mostra uma prévia dos recursos que serão criados:

terraform plan

Aplique a configuração do Terraform:

Implante a função aplicando a configuração. Quando solicitado, digite yes.

terraform apply

Como acionar a função

Para testar a função do Pub/Sub:

  1. Publique 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 registros da função para ver o resultado, em que FUNCTION_NAME é o nome da função. Neste exemplo, o nome da função é function:

    gcloud functions logs read FUNCTION_NAME

    Você verá a saída de geração de registros que inclui a nova mensagem "Friend".

Limpar

Depois de concluir o tutorial, exclua tudo o que foi criado para que você não tenha custos adicionais.

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

terraform destroy

Digite yes para permitir que o Terraform exclua seus recursos.