Crea un activador con Terraform

En este documento, se describe cómo usar Terraform y el recurso google_eventarc_trigger para crear activadores de Eventarc para los siguientes destinos de Google Cloud:

Para obtener más información sobre el uso de Terraform, consulta la documentación de Terraform en Google Cloud.

Las muestras de código de esta guía enrutan eventos directos desde Cloud Storage, pero se pueden adaptar a cualquier proveedor de eventos. Por ejemplo, para aprender a enrutar eventos directos de Pub/Sub a Cloud Run, consulta la Guía de inicio rápido de Terraform.

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

  4. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  5. Make sure that billing is enabled for your Google Cloud project.

  6. Enable the Cloud Resource Manager and Identity and Access Management (IAM) APIs.

    Enable the APIs

  7. In the Google Cloud console, activate Cloud Shell.

    Activate Cloud Shell

    At the bottom of the Google Cloud console, a Cloud Shell session starts and displays a command-line prompt. Cloud Shell is a shell environment with the Google Cloud CLI already installed and with values already set for your current project. It can take a few seconds for the session to initialize.

  8. Terraform está integrado en el entorno de Cloud Shell y puedes usar Cloud Shell para implementar tus recursos de Terraform sin tener que instalarlo.

Prepárate para implementar Terraform

Antes de implementar cualquier recurso de Terraform, debes crear un archivo de configuración de Terraform. Un archivo de configuración de Terraform te permite definir el estado final preferido de tu infraestructura con la sintaxis de Terraform.

Prepara Cloud Shell

En Cloud Shell, establece el proyecto predeterminado de Google Cloud en el que deseas aplicar tus configuraciones de Terraform. Solo necesitas ejecutar este comando una vez por proyecto y puedes ejecutarlo en cualquier directorio:

export GOOGLE_CLOUD_PROJECT=PROJECT_ID

Reemplaza PROJECT_ID por el ID de tu proyecto de Google Cloud .

Ten en cuenta que las variables de entorno se anulan si configuras valores explícitos en el archivo de configuración de Terraform.

Prepara el directorio

Cada archivo de configuración de Terraform debe tener su propio directorio (también llamado módulo raíz). En Cloud Shell, crea un directorio y un archivo nuevo dentro de ese directorio:

mkdir DIRECTORY && cd DIRECTORY && touch main.tf

El nombre del archivo debe tener la extensión .tf. Por ejemplo, en este documento, el archivo se denomina main.tf.

Define tu configuración de Terraform

Copia las muestras de código de Terraform aplicables en el archivo main.tf que creaste recientemente. De manera opcional, puedes copiar el código de GitHub. Esto se recomienda cuando el fragmento de Terraform es parte de una solución de extremo a extremo.

Por lo general, aplicas toda la configuración de una sola vez. Sin embargo, también puedes segmentar tus anuncios para un recurso específico. Por ejemplo:

terraform apply -target="google_eventarc_trigger.default"

Ten en cuenta que las muestras de código de Terraform usan interpolación para sustituciones como variables de referencia, atributos de recursos y funciones de llamada.

Habilita las APIs

Por lo general, las muestras de Terraform suponen que las APIs necesarias están habilitadas en tu proyecto deGoogle Cloud . Usa el siguiente código para habilitar las APIs:

Cloud Run

# Enable Cloud Run API
resource "google_project_service" "run" {
  service            = "run.googleapis.com"
  disable_on_destroy = false
}

# Enable Eventarc API
resource "google_project_service" "eventarc" {
  service            = "eventarc.googleapis.com"
  disable_on_destroy = false
}

# Enable Pub/Sub API
resource "google_project_service" "pubsub" {
  service            = "pubsub.googleapis.com"
  disable_on_destroy = false
}

GKE

# Enable GKE API
resource "google_project_service" "container" {
  service            = "container.googleapis.com"
  disable_on_destroy = false
}

# Enable Eventarc API
resource "google_project_service" "eventarc" {
  service            = "eventarc.googleapis.com"
  disable_on_destroy = false
}

# Enable Pub/Sub API
resource "google_project_service" "pubsub" {
  service            = "pubsub.googleapis.com"
  disable_on_destroy = false
}

Workflows

# Enable Workflows API
resource "google_project_service" "workflows" {
  service            = "workflows.googleapis.com"
  disable_on_destroy = false
}

# Enable Eventarc API
resource "google_project_service" "eventarc" {
  service            = "eventarc.googleapis.com"
  disable_on_destroy = false
}

# Enable Pub/Sub API
resource "google_project_service" "pubsub" {
  service            = "pubsub.googleapis.com"
  disable_on_destroy = false
}

Crea una cuenta de servicio y configura su acceso

Cada activador de Eventarc se asocia a una cuenta de servicio de IAM en el momento en que se crea el activador. Usa el siguiente código para crear una cuenta de servicio dedicada y otorgarle a la cuenta de servicio administrada por el usuario roles de administración de identidades y accesos específicos para administrar eventos:

Cloud Run

# Used to retrieve project information later
data "google_project" "project" {}

# Create a dedicated service account
resource "google_service_account" "eventarc" {
  account_id   = "eventarc-trigger-sa"
  display_name = "Eventarc Trigger Service Account"
}

# Grant permission to receive Eventarc events
resource "google_project_iam_member" "eventreceiver" {
  project = data.google_project.project.id
  role    = "roles/eventarc.eventReceiver"
  member  = "serviceAccount:${google_service_account.eventarc.email}"
}

# Grant permission to invoke Cloud Run services
resource "google_project_iam_member" "runinvoker" {
  project = data.google_project.project.id
  role    = "roles/run.invoker"
  member  = "serviceAccount:${google_service_account.eventarc.email}"
}

El agente de servicio de Pub/Sub se crea automáticamente cuando se habilita la API de Pub/Sub. Si el agente de servicio de Pub/Sub se creó el 8 de abril de 2021 o antes, y la cuenta de servicio no tiene el rol de agente de servicio de Cloud Pub/Sub (roles/pubsub.serviceAgent), otorga el rol de creador de tokens de cuenta de servicio (roles/iam.serviceAccountTokenCreator) al agente de servicio. Para obtener más información, consulta Crea y otorga roles a los agentes de servicio.

resource "google_project_iam_member" "tokencreator" {
  project  = data.google_project.project.id
  role     = "roles/iam.serviceAccountTokenCreator"
  member   = "serviceAccount:service-${data.google_project.project.number}@gcp-sa-pubsub.iam.gserviceaccount.com"
}

GKE

  1. Antes de crear la cuenta de servicio, habilita Eventarc para que administre clústeres de GKE:

    # Used to retrieve project_number later
    data "google_project" "project" {}
    
    # Enable Eventarc to manage GKE clusters
    # This is usually done with: gcloud eventarc gke-destinations init
    #
    # Eventarc creates a separate Event Forwarder pod for each trigger targeting a
    # GKE service, and  requires explicit permissions to make changes to the
    # cluster. This is done by granting permissions to a special service account
    # (the Eventarc P4SA) to manage resources in the cluster. This needs to be done
    # once per Google Cloud project.
    
    # This identity is created with: gcloud beta services identity create --service eventarc.googleapis.com
    # This local variable is used for convenience
    locals {
      eventarc_sa = "serviceAccount:service-${data.google_project.project.number}@gcp-sa-eventarc.iam.gserviceaccount.com"
    }
    
    resource "google_project_iam_member" "computeViewer" {
      project = data.google_project.project.id
      role    = "roles/compute.viewer"
      member  = local.eventarc_sa
    }
    
    resource "google_project_iam_member" "containerDeveloper" {
      project = data.google_project.project.id
      role    = "roles/container.developer"
      member  = local.eventarc_sa
    }
    
    resource "google_project_iam_member" "serviceAccountAdmin" {
      project = data.google_project.project.id
      role    = "roles/iam.serviceAccountAdmin"
      member  = local.eventarc_sa
    }
  2. Cree la cuenta de servicio:

    # Create a service account to be used by GKE trigger
    resource "google_service_account" "eventarc_gke_trigger_sa" {
      account_id   = "eventarc-gke-trigger-sa"
      display_name = "Evenarc GKE Trigger Service Account"
    }
    
    # Grant permission to receive Eventarc events
    resource "google_project_iam_member" "eventreceiver" {
      project = data.google_project.project.id
      role    = "roles/eventarc.eventReceiver"
      member  = "serviceAccount:${google_service_account.eventarc_gke_trigger_sa.email}"
    }
    
    # Grant permission to subscribe to Pub/Sub topics
    resource "google_project_iam_member" "pubsubscriber" {
      project = data.google_project.project.id
      role    = "roles/pubsub.subscriber"
      member  = "serviceAccount:${google_service_account.eventarc_gke_trigger_sa.email}"
    }
    

Workflows

# Used to retrieve project information later
data "google_project" "project" {}

# Create a service account for Eventarc trigger and Workflows
resource "google_service_account" "eventarc" {
  account_id   = "eventarc-workflows-sa"
  display_name = "Eventarc Workflows Service Account"
}

# Grant permission to invoke Workflows
resource "google_project_iam_member" "workflowsinvoker" {
  project = data.google_project.project.id
  role    = "roles/workflows.invoker"
  member  = "serviceAccount:${google_service_account.eventarc.email}"
}

# Grant permission to receive events
resource "google_project_iam_member" "eventreceiver" {
  project = data.google_project.project.id
  role    = "roles/eventarc.eventReceiver"
  member  = "serviceAccount:${google_service_account.eventarc.email}"
}

# Grant permission to write logs
resource "google_project_iam_member" "logwriter" {
  project = data.google_project.project.id
  role    = "roles/logging.logWriter"
  member  = "serviceAccount:${google_service_account.eventarc.email}"
}

El agente de servicio de Pub/Sub se crea automáticamente cuando se habilita la API de Pub/Sub. Si el agente de servicio de Pub/Sub se creó el 8 de abril de 2021 o antes, y la cuenta de servicio no tiene el rol de agente de servicio de Cloud Pub/Sub (roles/pubsub.serviceAgent), otorga el rol de creador de tokens de cuenta de servicio (roles/iam.serviceAccountTokenCreator) al agente de servicio. Para obtener más información, consulta Crea y otorga roles a los agentes de servicio.

resource "google_project_iam_member" "tokencreator" {
  project  = data.google_project.project.id
  role     = "roles/iam.serviceAccountTokenCreator"
  member   = "serviceAccount:service-${data.google_project.project.number}@gcp-sa-pubsub.iam.gserviceaccount.com"
}

Crear un bucket de Cloud Storage como fuente del evento

Usa el siguiente código para crear un bucket de Cloud Storage y otorga el rol de publicador de Pub/Sub (roles/pubsub.publisher) al agente de servicio de Cloud Storage.

Cloud Run

# Cloud Storage bucket names must be globally unique
resource "random_id" "bucket_name_suffix" {
  byte_length = 4
}

# Create a Cloud Storage bucket
resource "google_storage_bucket" "default" {
  name          = "trigger-cloudrun-${data.google_project.project.name}-${random_id.bucket_name_suffix.hex}"
  location      = google_cloud_run_v2_service.default.location
  force_destroy = true

  uniform_bucket_level_access = true
}

# Grant the Cloud Storage service account permission to publish pub/sub topics
data "google_storage_project_service_account" "gcs_account" {}
resource "google_project_iam_member" "pubsubpublisher" {
  project = data.google_project.project.id
  role    = "roles/pubsub.publisher"
  member  = "serviceAccount:${data.google_storage_project_service_account.gcs_account.email_address}"
}

GKE

# Cloud Storage bucket names must be globally unique
resource "random_id" "bucket_name_suffix" {
  byte_length = 4
}

# Create a Cloud Storage bucket
resource "google_storage_bucket" "default" {
  name          = "trigger-gke-${data.google_project.project.name}-${random_id.bucket_name_suffix.hex}"
  location      = "us-central1"
  force_destroy = true

  uniform_bucket_level_access = true
}

# Grant the Cloud Storage service account permission to publish pub/sub topics
data "google_storage_project_service_account" "gcs_account" {}
resource "google_project_iam_member" "pubsubpublisher" {
  project = data.google_project.project.id
  role    = "roles/pubsub.publisher"
  member  = "serviceAccount:${data.google_storage_project_service_account.gcs_account.email_address}"
}

Workflows

# Cloud Storage bucket names must be globally unique
resource "random_id" "bucket_name_suffix" {
  byte_length = 4
}

# Create a Cloud Storage bucket
resource "google_storage_bucket" "default" {
  name          = "trigger-workflows-${data.google_project.project.name}-${random_id.bucket_name_suffix.hex}"
  location      = google_workflows_workflow.default.region
  force_destroy = true

  uniform_bucket_level_access = true
}

# Grant the Cloud Storage service account permission to publish Pub/Sub topics
data "google_storage_project_service_account" "gcs_account" {}
resource "google_project_iam_member" "pubsubpublisher" {
  project = data.google_project.project.id
  role    = "roles/pubsub.publisher"
  member  = "serviceAccount:${data.google_storage_project_service_account.gcs_account.email_address}"
}

Crea un receptor de eventos para que sea el objetivo del evento

Crea un receptor de eventos con uno de los siguientes recursos de Terraform:

Cloud Run

Crea un servicio de Cloud Run como destino del evento para el activador de Eventarc:

# Deploy Cloud Run service
resource "google_cloud_run_v2_service" "default" {
  name     = "hello-events"
  location = "us-central1"

  deletion_protection = false # set to "true" in production

  template {
    containers {
      # This container will log received events
      image = "us-docker.pkg.dev/cloudrun/container/hello"
    }
    service_account = google_service_account.eventarc.email
  }

  depends_on = [google_project_service.run]
}

GKE

Para simplificar esta guía, crea un servicio de Google Kubernetes Engine como destino de eventos fuera de Terraform, entre la aplicación de las configuraciones de Terraform.

  1. Si no creaste un activador en este proyecto de Google Cloud antes, ejecuta el siguiente comando para crear el agente de servicio de Eventarc:

    gcloud beta services identity create --service eventarc.googleapis.com
  2. Crea un clúster de GKE:

    # Create an auto-pilot GKE cluster
    resource "google_container_cluster" "gke_cluster" {
      name     = "eventarc-cluster"
      location = "us-central1"
    
      enable_autopilot = true
    
      depends_on = [
        google_project_service.container
      ]
    }
  3. Implementa un servicio de Kubernetes en GKE que recibirá solicitudes HTTP y eventos de registro mediante una imagen compilada previamente de Cloud Run, us-docker.pkg.dev/cloudrun/container/hello:

    1. Obtén credenciales de autenticación para interactuar con el clúster:

      gcloud container clusters get-credentials eventarc-cluster \
         --region=us-central1
      
    2. Crea una implementación llamada hello-gke:

      kubectl create deployment hello-gke \
         --image=us-docker.pkg.dev/cloudrun/container/hello
      
    3. Expón la implementación como un servicio de Kubernetes:

      kubectl expose deployment hello-gke \
         --type ClusterIP --port 80 --target-port 8080
      
    4. Asegúrate de que el pod se esté ejecutando:

      kubectl get pods
      

      El resultado debería ser similar al siguiente ejemplo:

      NAME                         READY   STATUS    RESTARTS   AGE
      hello-gke-5b6574b4db-rzzcr   1/1     Running   0          2m45s
      

      Si STATUS es Pending o ContainerCreating, se está implementando el pod. Espera un minuto a que se complete la implementación y vuelve a verificar el estado.

    5. Asegúrate de que el servicio esté en ejecución:

      kubectl get svc
      

      El resultado debería ser similar al siguiente ejemplo:

      NAME         TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)   AGE
      hello-gke    ClusterIP   34.118.230.123   <none>        80/TCP    4m46s
      kubernetes   ClusterIP   34.118.224.1     <none>        443/TCP   14m
      

Workflows

Implementa un flujo de trabajo que se ejecute cuando se actualice un objeto en el bucket de Cloud Storage:

# Create a workflow
resource "google_workflows_workflow" "default" {
  name            = "storage-workflow-tf"
  region          = "us-central1"
  description     = "Workflow that returns information about storage events"
  service_account = google_service_account.eventarc.email

  deletion_protection = false # set to "true" in production

  # Note that $$ is needed for Terraform
  source_contents = <<EOF
  main:
    params: [event]
    steps:
      - log_event:
          call: sys.log
          args:
            text: $${event}
            severity: INFO
      - gather_data:
          assign:
            - bucket: $${event.data.bucket}
            - name: $${event.data.name}
            - message: $${"Received event " + event.type + " - " + bucket + ", " + name}
      - return_data:
          return: $${message}
  EOF

  depends_on = [
    google_project_service.workflows
  ]
}

Define un activador de Eventarc

Un activador de Eventarc enruta eventos de un proveedor de eventos a un destino de eventos. Usa el recurso google_eventarc_trigger para especificar los atributos de CloudEvents en matching_criteria y filtrar los eventos. Si deseas obtener más información, sigue las instrucciones cuando crees un activador para un proveedor, un tipo de evento y un destino específicos. Solo los eventos que coinciden con todos los filtros se envían al destino.

Cloud Run

Crea un activador de Eventarc que enrute los eventos de Cloud Storage al servicio de Cloud Run de hello-event.

# Create an Eventarc trigger, routing Cloud Storage events to Cloud Run
resource "google_eventarc_trigger" "default" {
  name     = "trigger-storage-cloudrun-tf"
  location = google_cloud_run_v2_service.default.location

  # Capture objects changed in the bucket
  matching_criteria {
    attribute = "type"
    value     = "google.cloud.storage.object.v1.finalized"
  }
  matching_criteria {
    attribute = "bucket"
    value     = google_storage_bucket.default.name
  }

  # Send events to Cloud Run
  destination {
    cloud_run_service {
      service = google_cloud_run_v2_service.default.name
      region  = google_cloud_run_v2_service.default.location
    }
  }

  service_account = google_service_account.eventarc.email
  depends_on = [
    google_project_service.eventarc,
    google_project_iam_member.pubsubpublisher
  ]
}

GKE

Crear un activador de Eventarc que enrute los eventos de Cloud Storage al servicio de GKE hello-gke

# Create an Eventarc trigger, routing Storage events to GKE
resource "google_eventarc_trigger" "default" {
  name     = "trigger-storage-gke-tf"
  location = "us-central1"

  # Capture objects changed in the bucket
  matching_criteria {
    attribute = "type"
    value     = "google.cloud.storage.object.v1.finalized"
  }
  matching_criteria {
    attribute = "bucket"
    value     = google_storage_bucket.default.name
  }

  # Send events to GKE service
  destination {
    gke {
      cluster   = "eventarc-cluster"
      location  = "us-central1"
      namespace = "default"
      path      = "/"
      service   = "hello-gke"
    }
  }

  service_account = google_service_account.eventarc_gke_trigger_sa.email
}

Workflows

Crea un activador de Eventarc que enrute los eventos de Cloud Storage al flujo de trabajo llamado storage-workflow-tf.

# Create an Eventarc trigger, routing Cloud Storage events to Workflows
resource "google_eventarc_trigger" "default" {
  name     = "trigger-storage-workflows-tf"
  location = google_workflows_workflow.default.region

  # Capture objects changed in the bucket
  matching_criteria {
    attribute = "type"
    value     = "google.cloud.storage.object.v1.finalized"
  }
  matching_criteria {
    attribute = "bucket"
    value     = google_storage_bucket.default.name
  }

  # Send events to Workflows
  destination {
    workflow = google_workflows_workflow.default.id
  }

  service_account = google_service_account.eventarc.email

  depends_on = [
    google_project_service.eventarc,
    google_project_service.workflows,
  ]
}

Aplica Terraform

Usa la CLI de Terraform para aprovisionar la infraestructura según el archivo de configuración.

Si deseas obtener más información para aplicar o quitar una configuración de Terraform, consulta los comandos básicos de Terraform.

  1. Inicializa Terraform. Solo debes hacerlo una vez por directorio.

    terraform init

    De manera opcional, incluye la opción -upgrade para usar la última versión del proveedor de Google:

    terraform init -upgrade
  2. Revisa la configuración y verifica que los recursos que creará o actualizará Terraform coincidan con tus expectativas:

    terraform plan

    Corrige la configuración según sea necesario.

  3. Para aplicar la configuración de Terraform, ejecuta el siguiente comando y, luego, escribe yes cuando se te solicite:

    terraform apply

    Espera hasta que Terraform muestre el mensaje “¡Aplicación completa!”.

Verifica la creación de recursos

Cloud Run

  1. Confirma que se haya creado el servicio:

    gcloud run services list --region us-central1
    
  2. Confirma que se haya creado el activador:

    gcloud eventarc triggers list --location us-central1
    

    El resultado debería ser similar al siguiente ejemplo:

    NAME: trigger-storage-cloudrun-tf
    TYPE: google.cloud.storage.object.v1.finalized
    DESTINATION: Cloud Run service: hello-events
    ACTIVE: Yes
    LOCATION: us-central1
    

GKE

  1. Confirma que se haya creado el servicio:

    kubectl get service hello-gke
    
  2. Confirma que se haya creado el activador:

    gcloud eventarc triggers list --location us-central1
    

    El resultado debería ser similar al siguiente ejemplo:

    NAME: trigger-storage-gke-tf
    TYPE: google.cloud.storage.object.v1.finalized
    DESTINATION: GKE: hello-gke
    ACTIVE: Yes
    LOCATION: us-central1
    

Workflows

  1. Confirma que se haya creado el flujo de trabajo:

    gcloud workflows list --location us-central1
    
  2. Confirma que se haya creado el activador de Eventarc:

    gcloud eventarc triggers list --location us-central1
    

    El resultado debería ser similar al siguiente ejemplo:

    NAME: trigger-storage-workflows-tf
    TYPE: google.cloud.storage.object.v1.finalized
    DESTINATION: Workflows: storage-workflow-tf
    ACTIVE: Yes
    LOCATION: us-central1
    

Genera y visualiza un evento

Puedes generar un evento y confirmar que el activador de Eventarc funcione según lo esperado.

  1. Recupera el nombre del bucket de Cloud Storage que creaste anteriormente:

    gcloud storage ls
    
  2. Sube un archivo de texto al bucket de Cloud Storage:

    echo "Hello World" > random.txt
    gcloud storage cp random.txt gs://BUCKET_NAME/random.txt
    

    Reemplaza BUCKET_NAME por el nombre del bucket de Cloud Storage que recuperaste en el paso anterior. Por ejemplo:

    gcloud storage cp random.txt gs://BUCKET_NAME/random.txt

    La carga genera un evento, y el servicio de receptor de eventos registra el mensaje del evento.

  3. Verifica que se reciba un evento:

    Cloud Run

    1. Filtra las entradas de registro que creó tu servicio:

      gcloud logging read 'jsonPayload.message: "Received event of type google.cloud.storage.object.v1.finalized."'
      
    2. Busca una entrada de registro similar a la que se muestra a continuación:

      Received event of type google.cloud.storage.object.v1.finalized.
      Event data: { "kind": "storage#object", "id": "trigger-cloudrun-BUCKET_NAME/random.txt", ...}
      

    GKE

    1. Busca el ID del Pod:

      POD_NAME=$(kubectl get pods -o custom-columns=":metadata.name" --no-headers)
      

      Este comando usa el resultado con formato de kubectl.

    2. Verifica los registros del Pod:

      kubectl logs $POD_NAME
      
    3. Busca una entrada de registro similar a la que se muestra a continuación:

      {"severity":"INFO","eventType":"google.cloud.storage.object.v1.finalized","message":
      "Received event of type google.cloud.storage.object.v1.finalized. Event data: ...}
      

    Workflows

    1. Para verificar que una ejecución de Workflow se active, enumera las últimas cinco ejecuciones:

      gcloud workflows executions list storage-workflow-tf --limit=5
      

      El resultado debe incluir una lista de ejecuciones con NAME, STATE, START_TIME y END_TIME.

    2. Obtén los resultados de la ejecución más reciente:

      EXECUTION_NAME=$(gcloud workflows executions list storage-workflow-tf --limit=1 --format "value(name)")
      gcloud workflows executions describe $EXECUTION_NAME
      
    3. Confirma que el resultado sea similar al siguiente:

      ...
      result: '"Received event google.cloud.storage.object.v1.finalized - BUCKET_NAME, random.txt"'
      startTime: '2024-12-13T17:23:50.451316533Z'
      state: SUCCEEDED
      ...
      

Limpia

Quita los recursos que se aplicaron antes con tu configuración de Terraform a través de la ejecución del siguiente comando y, luego, ingresa yes cuando se te solicite:

terraform destroy

También puedes borrar tu proyecto de Google Cloud para evitar que se generen cargos. Si borras tu proyecto de Google Cloud , se detendrá la facturación de todos los recursos que se usen en ese proyecto.

  1. In the Google Cloud console, go to the Manage resources page.

    Go to Manage resources

  2. In the project list, select the project that you want to delete, and then click Delete.
  3. In the dialog, type the project ID, and then click Shut down to delete the project.

¿Qué sigue?