Acionar o Cloud Run com eventos do Eventarc

1. Introdução

894762ebb681671c.png

O Cloud Run permite executar contêineres sem estado em um ambiente totalmente gerenciado. Ele foi criado com base no Knative de código aberto, permitindo que você execute seus contêineres de forma totalmente gerenciada com o Cloud Run ou em um cluster do Google Kubernetes Engine com o Cloud Run for Anthos.

cb762f29e9183a3f.png

O Eventarc facilita a conexão de vários serviços (Cloud Run, Cloud Functions, Workfklows) com eventos de diversas fontes. Ele permite criar arquiteturas orientadas a eventos em que os microsserviços são acoplados com flexibilidade e distribuídos. Ele também cuida da ingestão, da entrega, da segurança, da autorização e do tratamento de erros de eventos para você, o que melhora a agilidade do desenvolvedor e a resiliência de aplicativos.

Neste codelab, você vai aprender sobre o Eventarc. Mais especificamente, você vai detectar eventos do Pub/Sub, Cloud Storage e Registros de auditoria do Cloud com o Eventarc e transmiti-los para um serviço do Cloud Run.

O que você vai aprender

  • Visão do Eventarc
  • Descobrir eventos no Eventarc
  • Crie um coletor do Cloud Run
  • Criar um gatilho para o Pub/Sub
  • Criar um gatilho para o Cloud Storage
  • Criar um gatilho para os Registros de auditoria do Cloud
  • Conhecer a interface do Eventarc

2. Visão do Eventarc

O objetivo do Eventarc é entregar eventos de várias origens de eventos do Google, do Google Cloud e de terceiros para destinos do Google Cloud.

59b147dc030b2b0b.png

Origens do Google Cloud

Origens de eventos que são produtos do Google Cloud

Fontes do Google

Origens de eventos que são produtos do Google, como Gmail, Hangouts, Gerenciamento do Android e muito mais

Origens personalizadas

Origens de eventos que não são produtos do Google e são criadas pelos próprios usuários finais

Fontes de terceiros

Origens de eventos que não são de propriedade do Google nem produzidas pelo cliente. Isso inclui fontes de eventos conhecidas, como Check Point CloudGuard, Datadog, ForgeRock, Lacework etc. que pertencem e são mantidos por provedores e parceiros terceirizados.

Os eventos são normalizados para o formato CloudEvents v1.0 para interoperabilidade entre serviços. O CloudEvents é uma especificação aberta independente de fornecedor que descreve dados de eventos em formatos comuns, permitindo a interoperabilidade entre serviços, plataformas e sistemas.

3. Configuração e requisitos

Configuração de ambiente autoguiada

  1. Faça login no Console do Google Cloud e crie um novo projeto ou reutilize um existente. Crie uma conta do Gmail ou do Google Workspace, se ainda não tiver uma.

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

  • O Nome do projeto é o nome de exibição para os participantes do projeto. Ele é uma string de caracteres que não é usada pelas APIs do Google e pode ser atualizada a qualquer momento.
  • O ID do projeto precisa ser exclusivo em todos os projetos do Google Cloud e não pode ser alterado após a definição. O Console do Cloud gera automaticamente uma string única, geralmente não importa o que seja. Na maioria dos codelabs, você precisará fazer referência ao ID do projeto, que geralmente é identificado como PROJECT_ID. Então, se você não gostar dele, gere outro ID aleatório ou crie um próprio e veja se ele está disponível. Em seguida, ele fica "congelado" depois que o projeto é criado.
  • Há um terceiro valor, um Número de projeto, que algumas APIs usam. Saiba mais sobre esses três valores na documentação.
  1. Em seguida, você precisará ativar o faturamento no Console do Cloud para usar os recursos/APIs do Cloud. A execução deste codelab não será muito cara, se tiver algum custo. Para encerrar os recursos e não gerar cobranças além deste tutorial, siga as instruções de "limpeza" encontradas no final do codelab. Novos usuários do Google Cloud estão qualificados para o programa de US$ 300 de avaliação sem custos.

Inicie o Cloud Shell

Embora o Google Cloud e o Spanner possam ser operados remotamente do seu laptop, neste codelab usaremos o Google Cloud Shell, um ambiente de linha de comando executado no Cloud.

No Console do GCP, clique no ícone do Cloud Shell na barra de ferramentas localizada no canto superior direito:

55efc1aaa7a4d3ad.png

O provisionamento e a conexão com o ambiente levarão apenas alguns instantes para serem concluídos: Quando o processamento for concluído, você verá algo como:

7ffe5cbb04455448.png

Essa máquina virtual contém todas as ferramentas de desenvolvimento necessárias. Ela oferece um diretório principal persistente de 5 GB, além de ser executada no Google Cloud. Isso aprimora o desempenho e a autenticação da rede. Todo o trabalho neste laboratório pode ser feito apenas com um navegador.

Antes de começar

No Cloud Shell, verifique se o ID do projeto está configurado:

PROJECT_ID=your-project-id
gcloud config set project $PROJECT_ID

4. Implantar um serviço do Cloud Run

Implante um serviço do Cloud Run para receber eventos. Você implantará o contêiner Hello do Cloud Run que registra o conteúdo dos CloudEvents.

Primeiro, ative os serviços necessários para o Cloud Run:

gcloud services enable run.googleapis.com

Implante o contêiner "hello" no Cloud Run:

REGION=us-central1
SERVICE_NAME=hello

gcloud run deploy $SERVICE_NAME \
  --allow-unauthenticated \
  --image=gcr.io/cloudrun/hello \
  --region=$REGION

Em caso de sucesso, a linha de comando exibe o URL de serviço. É possível abrir o URL do serviço em qualquer janela do navegador para verificar se o serviço foi implantado.

5. Descoberta de eventos

Antes de criar gatilhos no Eventarc, você pode descobrir quais são as origens, os tipos de eventos que podem emitir e como configurar gatilhos para consumi-los.

Para ver a lista com diferentes tipos de eventos:

gcloud beta eventarc attributes types list

NAME                                           DESCRIPTION
google.cloud.audit.log.v1.written              Cloud Audit Log written
google.cloud.pubsub.topic.v1.messagePublished  Cloud Pub/Sub message published
google.cloud.storage.object.v1.archived         Cloud Storage: Sent when a live version of an (object versioned) object is archived or deleted.
google.cloud.storage.object.v1.deleted          Cloud Storage: Sent when an object has been permanently deleted.
google.cloud.storage.object.v1.finalized        Cloud Storage: Sent when a new object (or a new generation of an existing object).
google.cloud.storage.object.v1.metadataUpdated  Cloud Storage: Sent when the metadata of an existing object changes.

Para mais informações sobre cada tipo de evento:

gcloud beta eventarc attributes types describe google.cloud.audit.log.v1.written

attributes: type,serviceName,methodName,resourceName
description: 'Cloud Audit Log: Sent when a log is written.'
name: google.cloud.audit.log.v1.written

Para conferir a lista de serviços que emitem um determinado tipo de evento:

gcloud beta eventarc attributes service-names list --type=google.cloud.audit.log.v1.written

SERVICE_NAME                                DISPLAY_NAME
accessapproval.googleapis.com               Access Approval
accesscontextmanager.googleapis.com         Access Context Manager
admin.googleapis.com                        Google Workspace Admin
aiplatform.googleapis.com                   AI Platform (under Vertex AI)
apigee.googleapis.com                       Apigee
apigeeconnect.googleapis.com                Apigee Connect
...
workflows.googleapis.com                    Workflows

Para ver a lista de nomes de método (subeventos) que cada serviço pode emitir:

gcloud beta eventarc attributes method-names list --type=google.cloud.audit.log.v1.written --service-name=workflows.googleapis.com

METHOD_NAME
google.cloud.workflows.v1.Workflows.CreateWorkflow
google.cloud.workflows.v1.Workflows.DeleteWorkflow
google.cloud.workflows.v1.Workflows.GetWorkflow
google.cloud.workflows.v1.Workflows.ListWorkflows
google.cloud.workflows.v1.Workflows.UpdateWorkflow
google.cloud.workflows.v1beta.Workflows.CreateWorkflow
google.cloud.workflows.v1beta.Workflows.DeleteWorkflow
google.cloud.workflows.v1beta.Workflows.GetWorkflow
google.cloud.workflows.v1beta.Workflows.ListWorkflows
google.cloud.workflows.v1beta.Workflows.UpdateWorkflow

6. Criar um gatilho do Pub/Sub

Uma maneira de receber eventos é pelo Cloud Pub/Sub. Qualquer aplicativo pode publicar mensagens no Pub/Sub, e essas mensagens podem ser entregues ao Cloud Run pelo Eventarc.

Configuração

Antes de criar gatilhos, ative os serviços necessários para o Eventarc:

gcloud services enable eventarc.googleapis.com

Você também precisa de uma conta de serviço para ser usada pelos gatilhos. Crie uma conta de serviço:

SERVICE_ACCOUNT=eventarc-trigger-sa

gcloud iam service-accounts create $SERVICE_ACCOUNT

Criar

Crie um gatilho para filtrar eventos publicados no tópico do Pub/Sub no serviço implantado do Cloud Run:

TRIGGER_NAME=trigger-pubsub

gcloud eventarc triggers create $TRIGGER_NAME \
  --destination-run-service=$SERVICE_NAME \
  --destination-run-region=$REGION \
  --event-filters="type=google.cloud.pubsub.topic.v1.messagePublished" \
  --location=$REGION \
  --service-account=$SERVICE_ACCOUNT@$PROJECT_ID.iam.gserviceaccount.com

Teste

O gatilho do Pub/Sub cria um tópico nos bastidores. Vamos descobrir e atribuir a uma variável:

TOPIC_ID=$(gcloud eventarc triggers describe $TRIGGER_NAME --location $REGION --format='value(transport.pubsub.topic)')

Use gcloud para publicar uma mensagem no tópico:

gcloud pubsub topics publish $TOPIC_ID --message="Hello World"

O serviço do Cloud Run registra o corpo da mensagem recebida. É possível conferir isso na seção "Registros" da instância do Cloud Run:

69e0177e04a0d1af.png

Criar com um tópico existente do Pub/Sub

Por padrão, quando você cria um gatilho do Pub/Sub, o Eventarc cria um tópico subjacente para você usar como um tópico de transporte entre seu aplicativo e um serviço do Cloud Run. Isso é útil para criar de maneira fácil e rápida um gatilho com suporte do Pub/Sub, mas às vezes você quer usar um tópico atual. O Eventarc permite especificar um tópico do Pub/Sub atual no mesmo projeto com a sinalização --transport-topic da gcloud.

Para conferir como isso funciona, crie um tópico do Pub/Sub para usar como tópico de transporte:

TOPIC_ID=eventarc-topic

gcloud pubsub topics create $TOPIC_ID

Crie um gatilho:

TRIGGER_NAME=trigger-pubsub-existing

gcloud eventarc triggers create $TRIGGER_NAME \
  --destination-run-service=$SERVICE_NAME \
  --destination-run-region=$REGION \
  --event-filters="type=google.cloud.pubsub.topic.v1.messagePublished" \
  --location=$REGION \
  --transport-topic=projects/$PROJECT_ID/topics/$TOPIC_ID \
  --service-account=$SERVICE_ACCOUNT@$PROJECT_ID.iam.gserviceaccount.com

Para testar o gatilho, envie uma mensagem para o tópico:

gcloud pubsub topics publish $TOPIC_ID --message="Hello again"

7. Criar um gatilho do Cloud Storage

Nesta etapa, você vai criar um gatilho para detectar eventos do Cloud Storage.

Configuração

Primeiro, crie um bucket para receber eventos de:

BUCKET_NAME=eventarc-gcs-$PROJECT_ID

gsutil mb -l $REGION gs://$BUCKET_NAME

Conceda o papel eventarc.eventReceiver para que a conta de serviço possa ser usada em um gatilho do Cloud Storage:

gcloud projects add-iam-policy-binding $PROJECT_ID \
  --role roles/eventarc.eventReceiver \
  --member serviceAccount:$SERVICE_ACCOUNT@$PROJECT_ID.iam.gserviceaccount.com

Também é necessário adicionar o papel pubsub.publisher à conta de serviço do Cloud Storage para gatilhos do Cloud Storage:

SERVICE_ACCOUNT_STORAGE=$(gsutil kms serviceaccount -p $PROJECT_ID)

gcloud projects add-iam-policy-binding $PROJECT_ID \
    --member serviceAccount:$SERVICE_ACCOUNT_STORAGE \
    --role roles/pubsub.publisher

Criar

Crie um gatilho para rotear novos eventos de criação de arquivos do bucket para seu serviço:

TRIGGER_NAME=trigger-storage

gcloud eventarc triggers create $TRIGGER_NAME \
  --destination-run-service=$SERVICE_NAME \
  --destination-run-region=$REGION \
  --event-filters="type=google.cloud.storage.object.v1.finalized" \
  --event-filters="bucket=$BUCKET_NAME" \
  --location=$REGION \
  --service-account=$SERVICE_ACCOUNT@$PROJECT_ID.iam.gserviceaccount.com

Teste

Liste todos os acionadores para confirmar que eles foram criados:

gcloud eventarc triggers list

Faça upload de um arquivo no bucket do Cloud Storage:

echo "Hello World" > random.txt
gsutil cp random.txt gs://$BUCKET_NAME/random.txt

Se você verificar os registros do serviço do Cloud Run no Console do Cloud, verá o evento recebido:

904cfc93bb8e8df1.png

8. Criar um gatilho dos Registros de auditoria do Cloud

Embora o gatilho do Cloud Storage seja a melhor maneira de detectar eventos do Cloud Storage, nesta etapa, você vai criar um gatilho do registro de auditoria do Cloud para fazer o mesmo.

Configuração

Para receber eventos de um serviço, você precisa ativar os Registros de auditoria do Cloud. No Console do Cloud, selecione IAM & Admin e Audit Logs no menu superior esquerdo. Na lista de serviços, verifique Google Cloud Storage:

3c654597faed237c.png

No lado direito, verifique se Admin, Read e Write estão selecionados e clique em Save:

1deb3ad78f11dd5f.png

Criar

Crie um gatilho para rotear novos eventos de criação de arquivos do bucket para seu serviço:

TRIGGER_NAME=trigger-auditlog-storage

gcloud eventarc triggers create $TRIGGER_NAME\
  --destination-run-service=$SERVICE_NAME \
  --destination-run-region=$REGION \
  --event-filters="type=google.cloud.audit.log.v1.written" \
  --event-filters="serviceName=storage.googleapis.com" \
  --event-filters="methodName=storage.objects.create" \
  --event-filters-path-pattern="resourceName=/projects/_/buckets/$BUCKET_NAME/objects/*" \
  --location=$REGION \
  --service-account=$SERVICE_ACCOUNT@$PROJECT_ID.iam.gserviceaccount.com

Teste

Os gatilhos de registros de auditoria demoram um pouco para serem inicializados. Para verificar se o gatilho foi criado, liste todos os gatilhos:

gcloud eventarc triggers list

O campo ACTIVE vai aparecer como Yes:

NAME                          TYPE                                       DESTINATION               ACTIVE
trigger-auditlog-storage  google.cloud.audit.log.v1.written              Cloud Run service: hello  Yes

Faça upload do mesmo arquivo no bucket do Cloud Storage que você fez anteriormente:

gsutil cp random.txt gs://$BUCKET_NAME/random.txt

Se você verificar os registros do serviço do Cloud Run no Console do Cloud, verá o evento recebido:

7be7859bcc8976f8.png

9. Conhecer a interface do Eventarc

Nesta etapa, você vai conhecer a interface do Eventarc no console do Google Cloud. Na interface do Eventarc, é possível ter uma visão geral de todos os gatilhos, editá-los e excluí-los e criar novos gatilhos no console do Google Cloud.

Acesse a seção do Eventarc no Google Cloud:

81e139f17e0d29bf.png

Você verá a lista de acionadores criados anteriormente:

3240c7c830398718.png

Se clicar em um acionador, você poderá ver os detalhes dele, editá-lo ou excluí-lo:

b4d8bbc6601a8b9e.png

Também é possível criar um novo acionador selecionando Create trigger e preenchendo os detalhes dele:

3ee290ec72f130d5.png

10. Parabéns!

Parabéns por concluir o codelab.

O que aprendemos

  • Visão do Eventarc
  • Descobrir eventos no Eventarc
  • Crie um coletor do Cloud Run
  • Criar um gatilho para o Pub/Sub
  • Criar um gatilho para o Cloud Storage
  • Criar um gatilho para os Registros de auditoria do Cloud
  • Conhecer a interface do Eventarc