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 Google Cloud destinos:

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 Google Cloud predeterminado 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 Google Cloud proyecto.

    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. Crea 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 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 creadas por 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 Google Cloud proyecto para evitar que se generen cargos. Si borras tu proyecto de Google Cloud , se detendrá la facturación de todos los recursos que usaste 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?