Instructivo de Pub/Sub de Terraform


En este instructivo, se demuestra cómo implementar una función de Pub/Sub mediante la carga de un archivo ZIP de código fuente de función a un bucket de Cloud Storage mediante Terraform para aprovisionar los recursos. Terraform es una herramienta de código abierto que te permite aprovisionar Google Cloud recursos con archivos de configuración declarativos.

En este instructivo, se usa una función de Node.js como ejemplo, pero también se aplica a las funciones de Python, Go y Java. Las instrucciones son las mismas sin importar el entorno de ejecución que uses. Consulta las páginas de referencia de Hashicorp para obtener detalles sobre el uso de Terraform con la API de Cloud Functions v2.

Objetivos

  • Aprende a usar Terraform para implementar una función de Pub/Sub.

Costos

En este documento, usarás los siguientes componentes facturables de Google Cloud:

For details, see Cloud Run functions pricing.

Para generar una estimación de costos en función del uso previsto, usa la calculadora de precios.

Es posible que los usuarios Google Cloud nuevos cumplan con los requisitos para obtener una prueba gratuita.

Antes de comenzar

  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. Verify 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. Si usas un proveedor de identidad externo (IdP), primero debes acceder a gcloud CLI con tu identidad federada.

  7. Para inicializar la CLI de gcloud, ejecuta el siguiente comando:

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

    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.

    Enable the APIs

  11. Install the Google Cloud CLI.

  12. Si usas un proveedor de identidad externo (IdP), primero debes acceder a gcloud CLI con tu identidad federada.

  13. Para inicializar la CLI de gcloud, ejecuta el siguiente comando:

    gcloud init
  14. Si ya tienes instalado gcloud CLI, ejecuta el siguiente comando para actualizarla:

    gcloud components update
  15. Otorga roles/run.invoker y roles/cloudbuild.builds.builder a la cuenta de servicio de procesamiento predeterminada.
  16. Prepara tu entorno de desarrollo.

    Ir a la guía de configuración de Node.js

  17. Configure su entorno

    En este instructivo, ejecutarás comandos en Cloud Shell. Cloud Shell es un entorno de shell con Google Cloud CLI ya instalada, incluida Google Cloud CLI, y valores ya establecidos para el proyecto actual. La inicialización de Cloud Shell puede tomar varios minutos:

    Abra Cloud Shell

    Prepara la aplicación

    En Cloud Shell, sigue los siguientes pasos:

    1. Clona el repositorio de la app de muestra en tu instancia de Cloud Shell:

      git clone https://github.com/terraform-google-modules/terraform-docs-samples.git
    2. Ve al directorio que contiene el código de muestra de funciones de Cloud Run:

      cd terraform-docs-samples/functions/pubsub

      La muestra de Node.js que se usa en este instructivo es una función “Hello World” básica de Pub/Sub. Este es el archivo 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"
        }
      }

    Inicializa Terraform

    En el directorio terraform-docs-samples/functions/pubsub que contiene el archivo main.tf, ejecuta este comando para agregar los complementos necesarios y compilar el directorio .terraform:

    terraform init
    

    Valida la configuración de Terraform

    Obtén una vista previa de la configuración de Terraform. Este paso es opcional, pero te permite verificar que la sintaxis de main.tf sea correcta. Este comando muestra una vista previa de los recursos que se crearán:

    terraform plan
    

    Aplica la configuración de Terraform

    Aplica la configuración para implementar la función. Cuando se te solicite, ingresa yes:

    terraform apply
    

    Activa la función

    Para probar la función de Pub/Sub, sigue estos pasos:

    1. Publica un mensaje en el tema (en este ejemplo, el nombre del tema es functions2-topic):

      gcloud pubsub topics publish TOPIC_NAME --message="Friend"
    2. Lee los registros de la función para ver el resultado, en el que FUNCTION_NAME es el nombre de tu función (en este ejemplo, el nombre de la función es function):

      gcloud functions logs read FUNCTION_NAME

      Deberías ver un resultado de registro que incluya tu nuevo mensaje “Amigable”.

    Realiza una limpieza

    Después de completar el instructivo, puedes borrar todo lo que creaste para no incurrir en más costos.

    Terraform te permite quitar todos los recursos definidos en el archivo de configuración mediante la ejecución del comando terraform destroy:

    terraform destroy
    

    Ingresa yes para permitir que Terraform borre tus recursos.