Publicar e receber eventos criando um barramento e um registro (Terraform)

Neste guia de início rápido, mostramos como usar o Terraform para criar um barramento do Eventarc Advanced e fazer a inscrição no seu projeto Google Cloud para publicar e receber mensagens de eventos.

  • Um barramento atua como um roteador central, recebendo mensagens de fontes de eventos ou publicadas por provedores.

  • Um registro encaminha as mensagens recebidas pelo barramento para um ou mais destinos por um pipeline de processamento.

Neste guia de início rápido, você fará as seguintes tarefas:

  1. Implantar um serviço de receptor de eventos no Cloud Run

  2. Crie um barramento do Eventarc Advanced.

  3. Ative os eventos de fontes do Google.

  4. Crie um pipeline e um registro do Eventarc Advanced.

  5. Publique uma mensagem de evento no barramento criando um fluxo de trabalho.

  6. Confira os dados de eventos nos registros do Cloud Run.

Você pode concluir a maioria das etapas deste guia de início rápido usando o Terraform. Para concluir todas as etapas usando a Google Cloud CLI, consulte Publicar eventos de uma origem do Google.

Para mais informações sobre como usar o Terraform, consulte a documentação Terraform no Google Cloud.

Antes de começar

As restrições de segurança definidas pela sua organização podem impedir que você conclua as etapas a seguir. Para informações sobre solução de problemas, consulte Desenvolver aplicativos em um ambiente restrito de Google Cloud .

  1. Faça login na sua conta do Google Cloud . Se você começou a usar o Google Cloudagora, crie uma conta para avaliar o desempenho dos 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. If you're using an existing project for this guide, verify that you have the permissions required to complete this guide. If you created a new project, then you already have the required permissions.

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

  5. Enable the Cloud Resource Manager and Identity and Access Management (IAM) APIs, if any are not already enabled.

    Roles required to enable APIs

    To enable APIs, you need the serviceusage.services.enable permission. If you created the project, then you likely already have this permission through the Owner role (roles/owner). Otherwise, you can get this permission through the Service Usage Admin role (roles/serviceusage.serviceUsageAdmin). Learn how to grant roles.

    Enable the APIs

  6. 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

  7. If you're using an existing project for this guide, verify that you have the permissions required to complete this guide. If you created a new project, then you already have the required permissions.

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

  9. Enable the Cloud Resource Manager and Identity and Access Management (IAM) APIs, if any are not already enabled.

    Roles required to enable APIs

    To enable APIs, you need the serviceusage.services.enable permission. If you created the project, then you likely already have this permission through the Owner role (roles/owner). Otherwise, you can get this permission through the Service Usage Admin role (roles/serviceusage.serviceUsageAdmin). Learn how to grant roles.

    Enable the APIs

  10. No console do Google Cloud , ative o Cloud Shell.

    Ativar o Cloud Shell

    Na parte de baixo do console Google Cloud , uma sessão do Cloud Shell é iniciada e exibe um prompt de linha de comando. O Cloud Shell é um ambiente shell com a CLI do Google Cloud já instalada e com valores já definidos para o projeto atual. A inicialização da sessão pode levar alguns segundos.

  11. O Terraform está integrado ao ambiente do Cloud Shell, e você pode usar o Cloud Shell para implantar seus recursos do Terraform sem precisar instalar o Terraform.

Funções exigidas

Para conseguir as permissões necessárias a fim de concluir o guia de início rápido, peça ao administrador para conceder a você os seguintes papéis do IAM no projeto:

Para mais informações sobre a concessão de papéis, consulte Gerenciar o acesso a projetos, pastas e organizações.

Também é possível conseguir as permissões necessárias usando papéis personalizados ou outros papéis predefinidos.

Preparar a implantação do Terraform

Antes de implantar qualquer recurso do Terraform, crie um arquivo de configuração do Terraform. Um arquivo de configuração do Terraform permite definir o estado final preferido da infraestrutura usando a sintaxe do Terraform.

  1. No Cloud Shell, defina o projeto Google Cloud padrão em que você quer aplicar a configuração do Terraform. Você só precisa executar esse comando uma vez por projeto, e ele pode ser executado em qualquer diretório:

    export GOOGLE_CLOUD_PROJECT=PROJECT_ID

    Substitua PROJECT_ID pelo ID do seu projeto do Google Cloud .

    As variáveis de ambiente serão substituídas se você definir valores explícitos no arquivo de configuração do Terraform.

  2. Cada arquivo de configuração do Terraform precisa ter o próprio diretório, também chamado de módulo raiz. No Cloud Shell, crie um diretório e um novo arquivo dentro dele:

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

    Substitua DIRECTORY pelo nome do diretório do Terraform.

    O nome do arquivo precisa ter a extensão .tf. Por exemplo, neste início rápido, o arquivo de configuração é main.tf.

Definir sua configuração do Terraform

Copie os snippets de código do Terraform a seguir no arquivo main.tf. Ou, para copiar todo o exemplo de código do GitHub, no canto superior direito de um snippet de código, clique em > Ver no GitHub.

Ativar APIs

Use o recurso do Terraform google_project_service para ativar as APIs necessárias para aplicar a configuração do Terraform:

# Enable APIs
resource "google_project_service" "apis" {
  for_each = toset([
    "eventarc.googleapis.com",
    "eventarcpublishing.googleapis.com",
    "run.googleapis.com"
  ])
  service            = each.key
  disable_on_destroy = false
}

Criar uma conta de serviço

Para fins de teste, crie uma conta de serviço dedicada e conceda a ela papéis específicos do IAM.

Use os recursos do Terraform google_service_account e google_project_iam_member para criar a conta de serviço e conceder a ela as funções necessárias para publicar e receber eventos:

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

# Create a dedicated service account
resource "google_service_account" "default" {
  account_id   = "eventarc-advanced-sa"
  display_name = "Eventarc Advanced quickstart 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.default.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.default.email}"
}

Criar um destino de evento

Use o recurso do Terraform google_cloud_run_v2_service para criar um serviço do Cloud Run como um destino de evento que registra o conteúdo de um evento:

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

  deletion_protection = false # set to "true" in production

  template {
    containers {
      # This sample container listens to HTTP requests and logs received events
      image = "us-docker.pkg.dev/cloudrun/container/hello"
    }
    service_account = google_service_account.default.email
  }

  depends_on = [google_project_service.apis]
}

Criar um barramento do Eventarc Advanced

Um barramento recebe mensagens de eventos de uma origem de mensagens ou publicadas por um provedor e atua como um roteador de mensagens. Para mais informações, consulte Criar um barramento para rotear mensagens.

Use o recurso do Terraform google_eventarc_message_bus para criar um barramento do Eventarc Advanced:

# Create an Eventarc Advanced bus
resource "google_eventarc_message_bus" "default" {
  location       = "us-central1"
  message_bus_id = "example-bus"
}

Ativar eventos de fontes do Google

Para publicar eventos de fontes do Google, crie um recurso GoogleApiSource que represente uma assinatura de eventos da API do Google para um barramento específico do Eventarc Advanced. Para mais informações, consulte Publicar eventos de fontes do Google.

Use o recurso do Terraform google_eventarc_google_api_source para ativar eventos de fontes do Google:

# Enable events from Google API sources
resource "google_eventarc_google_api_source" "default" {
  location             = "us-central1"
  google_api_source_id = "example-google-api-source"
  destination          = google_eventarc_message_bus.default.id
}

Todos os tipos de eventos do Google compatíveis enviados diretamente de uma fonte do Google agora são coletados e publicados no seu barramento.

Criar um pipeline do Eventarc Advanced

Um pipeline permite configurar um destino e também oferece a opção de transformar os eventos correspondentes antes da entrega.

Use o recurso do Terraform google_eventarc_pipeline para criar um pipeline:

# Create an Eventarc Advanced pipeline
resource "google_eventarc_pipeline" "default" {
  location    = "us-central1"
  pipeline_id = "example-pipeline"
  destinations {
    http_endpoint {
      uri = google_cloud_run_v2_service.default.uri
    }
    authentication_config {
      google_oidc {
        service_account = google_service_account.default.email
      }
    }
  }
}

O destino do evento é o URL totalmente qualificado do seu serviço do Cloud Run, por exemplo, https://SERVICE_NAME-abcdef-uc.a.run.app. O endereço de e-mail da conta de serviço é usado para gerar um token do OIDC.

Criar uma inscrição no Eventarc Advanced

Um registro determina quais mensagens são roteadas para um destino e também especifica o pipeline usado para configurar um destino para as mensagens de evento. Para mais informações, consulte Criar uma inscrição para receber eventos.

Use o recurso do Terraform google_eventarc_enrollment para criar uma inscrição:

# Create an Eventarc Advanced enrollment
resource "google_eventarc_enrollment" "default" {
  location      = "us-central1"
  enrollment_id = "example-enrollment"
  message_bus   = google_eventarc_message_bus.default.id
  destination   = google_eventarc_pipeline.default.id
  cel_match     = "message.type == 'google.cloud.workflows.workflow.v1.created'"
}

A expressão de correspondência para a inscrição usa a Common Expression Language (CEL) para publicar mensagens de eventos sempre que um fluxo de trabalho é criado. Em uma etapa posterior, você vai criar um fluxo de trabalho.

Aplique a configuração do Terraform:

Use a CLI do Terraform para provisionar a infraestrutura com base no arquivo de configuração. Para mais informações, consulte Comandos básicos do Terraform.

  1. Inicialize o Terraform. Você só precisa fazer isso uma vez por diretório.

    terraform init

    Opcionalmente, para usar a versão mais recente do provedor do Google, inclua a opção -upgrade:

    terraform init -upgrade
  2. Revise a configuração e verifique se os recursos que o Terraform vai criar ou atualizar correspondem às suas expectativas:

    terraform plan

    Corrija a configuração conforme necessário.

  3. Para aplicar a configuração do Terraform, execute o comando a seguir e digite yes no prompt:

    terraform apply

    Normalmente, você aplica toda a configuração de uma só vez. No entanto, também é possível segmentar um recurso específico. Exemplo:

    terraform apply -target="google_eventarc_message_bus.default"

    Aguarde até que o Terraform exiba a mensagem "Apply complete!".

Publicar uma mensagem de evento no barramento criando um fluxo de trabalho

O Workflows é uma plataforma de orquestração totalmente gerenciada que executa serviços na ordem definida por você: um fluxo de trabalho. Crie um fluxo de trabalho para gerar um tipo de evento compatível de uma origem do Google.

  1. No diretório inicial, crie um novo arquivo chamado myWorkflow.yaml.

  2. Copie e cole o seguinte fluxo de trabalho no novo arquivo e salve:

    main:
        params: [input]
        steps:
        - checkSearchTermInInput:
            switch:
                - condition: '${"searchTerm" in input}'
                  assign:
                    - searchTerm: '${input.searchTerm}'
                  next: readWikipedia
        - getLocation:
            call: sys.get_env
            args:
                name: GOOGLE_CLOUD_LOCATION
            result: location
        - setFromCallResult:
            assign:
                - searchTerm: '${text.split(location, "-")[0]}'
        - readWikipedia:
            call: http.get
            args:
                url: 'https://en.wikipedia.org/w/api.php'
                query:
                    action: opensearch
                    search: '${searchTerm}'
            result: wikiResult
        - returnOutput:
                return: '${wikiResult.body[1]}'
    

    Esse fluxo de trabalho transmite a região em que ele é implantado para a API Wikipédia e retorna uma lista de artigos relacionados da Wikipédia.

  3. Implante o fluxo de trabalho usando o comando gcloud workflows deploy:

    gcloud workflows deploy example-workflow --source=myWorkflow.yaml \
        --service-account=eventarc-advanced-sa@PROJECT_ID.iam.gserviceaccount.com \
        --location=us-central1

Ver os dados de eventos nos registros do Cloud Run

Depois de publicar um evento no barramento do Eventarc Advanced, você pode verificar os registros do serviço do Cloud Run para verificar se o evento foi recebido conforme o esperado.

  1. Filtre as entradas de registro criadas pelo seu serviço:

    gcloud logging read 'jsonPayload.message: "Received event of type google.cloud.workflows.workflow.v1.created."'
    
  2. Procure uma entrada de registro semelhante a esta:

    message: 'Received event of type google.cloud.workflows.workflow.v1.created.
    Event data: {"@type":"type.googleapis.com/google.events.cloud.workflows.v1.WorkflowEventData","payload":{"name":"projects/PROJECT_ID/locations/us-central1/workflows/example-workflow","state":"ACTIVE"...
    

Você criou um barramento e um registro do Eventarc Advanced, ativou a publicação de eventos de fontes do Google, criou um fluxo de trabalho para gerar um tipo de evento compatível de um provedor do Google e verificou o resultado esperado nos registros do serviço de receptor de eventos.

Limpar

Remova os recursos aplicados anteriormente com a configuração do Terraform executando o seguinte comando e inserindo yes no prompt:

terraform destroy

Também é possível excluir seu projeto do Google Cloud para evitar cobranças. A exclusão do projeto do Google Cloud interrompe o faturamento de todos os recursos usados nele.

  1. No console Google Cloud , acesse a página Gerenciar recursos.

    Acessar "Gerenciar recursos"

  2. Na lista de projetos, selecione o projeto que você quer excluir e clique em Excluir .
  3. Na caixa de diálogo, digite o ID do projeto e clique em Encerrar para excluí-lo.

A seguir