Ricezione di eventi mediante messaggi Pub/Sub (Terraform)

Questa guida rapida mostra come utilizzare Terraform per creare un trigger Eventarc che riceve eventi diretti da Pub/Sub e che li indirizza a un servizio Cloud Run. Per saperne di più sull'utilizzo di Terraform per creare trigger Eventarc, consulta Crea un trigger utilizzando Terraform.

In questa guida rapida imparerai a:

  1. Preparati a eseguire il deployment di Terraform.

  2. Definisci una configurazione Terraform che esegua le seguenti operazioni:

    1. Abilita le API.
    2. Crea un account di servizio e concedigli i ruoli IAM (Identity and Access Management) necessari.
    3. Esegui il deployment di un servizio in Cloud Run come destinazione eventi.
    4. Crea un argomento Pub/Sub come fornitore di eventi.
    5. Crea un trigger Eventarc.
  3. Applica la configurazione Terraform.

  4. Pubblica un messaggio in un argomento Pub/Sub per generare un evento e visualizzalo nei log di Cloud Run.

Prima di iniziare

I vincoli di sicurezza definiti dalla tua organizzazione potrebbero impedirti di completare i passaggi seguenti. Per informazioni sulla risoluzione dei problemi, vedi Sviluppare applicazioni in un ambiente Google Cloud vincolato.

  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. Install the Google Cloud CLI.

  3. Se utilizzi un provider di identità (IdP) esterno, devi prima accedere alla gcloud CLI con la tua identità federata.

  4. Per inizializzare gcloud CLI, esegui questo comando:

    gcloud init
  5. Create or select a Google Cloud project.

    • Create a Google Cloud project:

      gcloud projects create PROJECT_ID

      Replace PROJECT_ID with a name for the Google Cloud project you are creating.

    • Select the Google Cloud project that you created:

      gcloud config set project PROJECT_ID

      Replace PROJECT_ID with your Google Cloud project name.

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

  7. Enable the Cloud Resource Manager and IAM APIs:

    gcloud services enable cloudresourcemanager.googleapis.com iam.googleapis.com
  8. If you're using a local shell, then create local authentication credentials for your user account:

    gcloud auth application-default login

    You don't need to do this if you're using Cloud Shell.

    If an authentication error is returned, and you are using an external identity provider (IdP), confirm that you have signed in to the gcloud CLI with your federated identity.

  9. Install the Google Cloud CLI.

  10. Se utilizzi un provider di identità (IdP) esterno, devi prima accedere alla gcloud CLI con la tua identità federata.

  11. Per inizializzare gcloud CLI, esegui questo comando:

    gcloud init
  12. Create or select a Google Cloud project.

    • Create a Google Cloud project:

      gcloud projects create PROJECT_ID

      Replace PROJECT_ID with a name for the Google Cloud project you are creating.

    • Select the Google Cloud project that you created:

      gcloud config set project PROJECT_ID

      Replace PROJECT_ID with your Google Cloud project name.

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

  14. Enable the Cloud Resource Manager and IAM APIs:

    gcloud services enable cloudresourcemanager.googleapis.com iam.googleapis.com
  15. If you're using a local shell, then create local authentication credentials for your user account:

    gcloud auth application-default login

    You don't need to do this if you're using Cloud Shell.

    If an authentication error is returned, and you are using an external identity provider (IdP), confirm that you have signed in to the gcloud CLI with your federated identity.

  16. Se hai creato il progetto, ti viene assegnato il ruolo di base Proprietario (roles/owner). Per impostazione predefinita, questo ruolo IAM include le autorizzazioni necessarie per l'accesso completo alla maggior parte delle risorse Google Cloud e puoi saltare questo passaggio.

    Se non sei il creatore del progetto, le autorizzazioni richieste devono essere concesse al principal appropriato. Ad esempio, un'entità può essere un Account Google (per gli utenti finali) o un account di servizio (per applicazioni e carichi di lavoro di calcolo). Per saperne di più, consulta la pagina Ruoli e autorizzazioni per la destinazione eventi.

    Autorizzazioni obbligatorie

    Per ottenere le autorizzazioni necessarie per completare questa guida rapida, chiedi all'amministratore di concederti i seguenti ruoli IAM nel tuo progetto:

    Per ulteriori informazioni sulla concessione dei ruoli, consulta Gestisci l'accesso a progetti, cartelle e organizzazioni.

    Potresti anche riuscire a ottenere le autorizzazioni richieste tramite i ruoli personalizzati o altri ruoli predefiniti.

  17. Preparati a eseguire il deployment di Terraform

    Preparati a eseguire il deployment delle risorse Terraform creando un file di configurazione Terraform. Un file di configurazione Terraform ti consente di definire lo stato finale preferito per la tua infrastruttura utilizzando la sintassi Terraform.

    1. Se utilizzi una shell locale, installa e configura Terraform.

      Terraform è già integrato nell'ambiente Cloud Shell e puoi utilizzare Cloud Shell per eseguire il deployment delle risorse Terraform senza dover installare Terraform.

    2. In Cloud Shell o nella shell locale, imposta il progetto Google Cloud predefinito in cui vuoi applicare le configurazioni Terraform. Devi eseguire questo comando una sola volta per progetto e puoi eseguirlo in qualsiasi directory:

      export GOOGLE_CLOUD_PROJECT=PROJECT_ID

      Sostituisci PROJECT_ID con l'ID del tuo progetto Google Cloud .

    Tieni presente che le variabili di ambiente vengono sostituite se imposti valori espliciti nel file di configurazione Terraform.

    Prepara la directory

    Ogni file di configurazione di Terraform deve avere la propria directory (chiamata anche modulo radice). Crea una directory e un nuovo file al suo interno:

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

    Il nome file deve avere l'estensione .tf. Ad esempio, in questa guida rapida, il file viene chiamato main.tf.

    Definisci la configurazione Terraform

    Copia i seguenti snippet di codice Terraform nel file main.tf appena creato. (Facoltativo) Puoi copiare il codice da GitHub. (Nell'angolo in alto a destra dello snippet di codice, fai clic su > Visualizza su GitHub.)

    Abilita API

    Gli esempi di Terraform in genere presuppongono che le API richieste siano abilitate nel tuo progettoGoogle Cloud . Utilizza il seguente snippet di codice per abilitare le API necessarie per questa guida rapida:

    # 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
    }

    Crea un account di servizio e configura il relativo accesso

    Ogni trigger Eventarc è associato a un account di servizio IAM. Per completare questa guida rapida, devi concedere a un account di servizio gestito dall'utente i seguenti ruoli IAM:

    Utilizza il seguente snippet di codice per creare un account di servizio dedicato e concedergli ruoli IAM specifici per gestire gli eventi:

    # 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 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}"
    }
    
    # Grant permission to publish messages to a Pub/Sub topic
    resource "google_project_iam_member" "pubsubpublisher" {
      project = data.google_project.project.id
      member  = "serviceAccount:${google_service_account.eventarc.email}"
      role    = "roles/pubsub.publisher"
    }

    Se hai attivato l'agente di servizio Pub/Sub il giorno 8 aprile 2021 o in una data precedente, concedi il ruolo Creatore token service account (roles/iam.serviceAccountTokenCreator) all'agente di servizio.

    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"
    }

    Esegui il deployment di un ricevitore di eventi in Cloud Run

    Crea un servizio Cloud Run come destinazione evento per il trigger Eventarc utilizzando la risorsa Terraform google_cloud_run_v2_service:

    # Deploy a 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]
    }

    Crea un argomento Pub/Sub come fornitore di eventi

    Crea un argomento Pub/Sub utilizzando la risorsa Terraform google_pubsub_topic:

    # Create a Pub/Sub topic
    resource "google_pubsub_topic" "default" {
      name = "pubsub_topic"
    }

    Crea un trigger Eventarc

    Crea un trigger Eventarc per ascoltare i messaggi Pub/Sub utilizzando la risorsa Terraform google_eventarc_trigger:

    # Create an Eventarc trigger, routing Pub/Sub events to Cloud Run
    resource "google_eventarc_trigger" "default" {
      name     = "trigger-pubsub-cloudrun-tf"
      location = google_cloud_run_v2_service.default.location
    
      # Capture messages published to a Pub/Sub topic
      matching_criteria {
        attribute = "type"
        value     = "google.cloud.pubsub.topic.v1.messagePublished"
      }
    
      # 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
        }
      }
    
      transport {
        pubsub {
          topic = google_pubsub_topic.default.id
        }
      }
    
      service_account = google_service_account.eventarc.email
      depends_on = [
        google_project_service.eventarc,
        google_project_iam_member.pubsubpublisher
      ]
    }

    Applica Terraform

    Utilizza l'interfaccia a riga di comando di Terraform per eseguire il provisioning dell'infrastruttura in base al file di configurazione.

    Per scoprire come applicare o rimuovere una configurazione Terraform, consulta Comandi Terraform di base.

    1. Inizializza Terraform. Devi effettuare questa operazione una sola volta per directory.

      terraform init

      (Facoltativo) Per utilizzare l'ultima versione del provider Google, includi l'opzione -upgrade:

      terraform init -upgrade
    2. Rivedi la configurazione e verifica che le risorse che Terraform creerà o aggiornerà corrispondano alle tue aspettative:

      terraform plan

      Apporta le correzioni necessarie alla configurazione.

    3. Applica la configurazione Terraform eseguendo questo comando e inserendo yes al prompt:

      terraform apply

      In genere, applichi l'intera configurazione contemporaneamente. Tuttavia, puoi anche scegliere come target una risorsa specifica. Ad esempio:

      terraform apply -target="google_eventarc_trigger.default"

      Dopo aver abilitato le API, potrebbero essere necessari alcuni minuti prima che l'azione venga propagata e prima di poter eseguire il deployment di altre risorse. Se riscontri un problema, prova ad applicare di nuovo la configurazione Terraform.

      Attendi che Terraform visualizzi il messaggio "Apply complete!".

    Verifica la creazione delle risorse

    1. Verifica che il servizio Cloud Run sia stato creato:

      gcloud run services list --region us-central1
      

      L'output dovrebbe essere simile al seguente:

      SERVICE: hello-events
      REGION: us-central1
      URL: https://hello-events-13335919645.us-central1.run.app
      LAST DEPLOYED BY: ...
      LAST DEPLOYED AT: 2024-12-16T15:00:52.606160Z
      
    2. Verifica che il trigger Eventarc sia stato creato:

      gcloud eventarc triggers list --location us-central1
      

      L'output dovrebbe essere simile al seguente:

      NAME: trigger-pubsub-cloudrun-tf
      TYPE: google.cloud.pubsub.topic.v1.messagePublished
      DESTINATION: Cloud Run service: hello-events
      ACTIVE: Yes
      LOCATION: us-central1
      

    Generare e visualizzare un evento dell'argomento Pub/Sub

    Puoi generare un evento pubblicando un messaggio nell'argomento Pub/Sub. Il trigger Eventarc instrada il messaggio al servizio di ricezione di eventi di cui è stato eseguito il deployment su Cloud Run e il servizio registra il messaggio di evento.

    1. Trova e imposta l'argomento Pub/Sub come variabile di ambiente:

      gcloud config set eventarc/location us-central1
      export RUN_TOPIC=$(gcloud eventarc triggers describe trigger-pubsub-cloudrun-tf \
          --format='value(transport.pubsub.topic)')
      
    2. Pubblica un messaggio nell'argomento Pub/Sub per generare un evento:

      gcloud pubsub topics publish $RUN_TOPIC --message "Hello World!"
      

      L'evento viene indirizzato al servizio Cloud Run, che registra il messaggio dell'evento.

    3. Per visualizzare le voci di log relative agli eventi create dal tuo servizio, esegui questo comando:

      gcloud logging read 'jsonPayload.message: "Received event of type google.cloud.pubsub.topic.v1.messagePublished"'
      
    4. Cerca una voce di log simile alla seguente:

      jsonPayload:
      ...
      message: 'Received event of type google.cloud.pubsub.topic.v1.messagePublished.
          Event data: Hello World!'
      

    Hai utilizzato correttamente Terraform per eseguire il deployment di un servizio di ricezione eventi in Cloud Run e creare un trigger Eventarc. Dopo aver generato un evento da Pub/Sub, puoi visualizzarlo nei log di Cloud Run.

    Esegui la pulizia

    Al termine delle attività descritte in questa guida rapida, puoi evitare l'addebito di ulteriori costi eliminando le risorse che hai creato.

    Rimuovi le risorse applicate in precedenza con la configurazione di Terraform eseguendo il seguente comando e inserendo yes al prompt:

    terraform destroy

    In alternativa, puoi eliminare il tuo progetto Google Cloud per evitare addebiti. L'eliminazione del progetto Google Cloud interrompe la fatturazione di tutte le risorse utilizzate al suo interno.

    Delete a Google Cloud project:

    gcloud projects delete PROJECT_ID

    Se intendi esplorare più tutorial e guide rapide, il riuso dei progetti ti aiuta a non superare i limiti di quota.

    Passaggi successivi