Neste tutorial, mostramos como usar o Eventarc para criar um pipeline de processamento que programa consultas a um conjunto de dados público do BigQuery, gera gráficos com base nos dados e compartilha links dos gráficos por e-mail.
Objetivos
Neste tutorial, você criará e implantará três serviços do Cloud Run que permitem acesso não autenticado e que recebem eventos usando o Eventarc:
- Executor de consulta - Acionado quando os jobs do Cloud Scheduler publicam uma mensagem em um tópico do Pub/Sub, este serviço usa a API BigQuery para recuperar dados de um conjunto de dados público da COVID-19 e salva os resultados em um novo BigQuery tabela.
- Criador de gráficos - Acionado quando o serviço de execução de consulta publica uma mensagem em um tópico do Pub/Sub, esse serviço gera gráficos usando a biblioteca de plotagem do Python.Matplotlib e salva os gráficos em um bucket do Cloud Storage.
- Notificador: acionado por registros de auditoria quando o serviço de criação de gráficos armazena um gráfico em um bucket do Cloud Storage, esse serviço usa o serviço de e-mail SendGrid, para enviar links para os gráficos a um endereço de e-mail.
O diagrama a seguir mostra a arquitetura geral:
Custos
Neste documento, você usará os seguintes componentes faturáveis do Google Cloud:
Para gerar uma estimativa de custo baseada na projeção de uso deste tutorial, use a calculadora de preços.
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 do Google Cloud.
- 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.
- Install the Google Cloud CLI.
-
To initialize the gcloud CLI, run the following command:
gcloud init
-
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.
-
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the Artifact Registry, Cloud Build, Cloud Logging, Cloud Run, Cloud Scheduler, Eventarc, and Pub/Sub APIs:
gcloud services enable artifactregistry.googleapis.com
cloudbuild.googleapis.com cloudscheduler.googleapis.com eventarc.googleapis.com logging.googleapis.com pubsub.googleapis.com run.googleapis.com - Install the Google Cloud CLI.
-
To initialize the gcloud CLI, run the following command:
gcloud init
-
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.
-
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the Artifact Registry, Cloud Build, Cloud Logging, Cloud Run, Cloud Scheduler, Eventarc, and Pub/Sub APIs:
gcloud services enable artifactregistry.googleapis.com
cloudbuild.googleapis.com cloudscheduler.googleapis.com eventarc.googleapis.com logging.googleapis.com pubsub.googleapis.com run.googleapis.com - Para o Cloud Storage, ative a geração de registros de auditoria para os tipos de acesso a dados
ADMIN_READ
,DATA_WRITE
eDATA_READ
.- Leia a política de gerenciamento de identidade e acesso (IAM) associada ao seu
projeto, pasta ou organização do Google Cloud e armazene-a em um arquivo temporário:
gcloud projects get-iam-policy PROJECT_ID > /tmp/policy.yaml
- Em um editor de texto, abra
/tmp/policy.yaml
e adicione ou altere apenas a configuração do registro de auditoria na seçãoauditConfigs
:auditConfigs: - auditLogConfigs: - logType: ADMIN_READ - logType: DATA_WRITE - logType: DATA_READ service: storage.googleapis.com bindings: - members: [...] etag: BwW_bHKTV5U= version: 1
- Grave a nova política de IAM:
gcloud projects set-iam-policy PROJECT_ID /tmp/policy.yaml
Se o comando anterior relatar um conflito com outra alteração, repita essas etapas, começando com a leitura da política de IAM. Para mais informações, acesse Configurar registros de auditoria de acesso a dados com a API.
- Leia a política de gerenciamento de identidade e acesso (IAM) associada ao seu
projeto, pasta ou organização do Google Cloud e armazene-a em um arquivo temporário:
- Conceda o papel
eventarc.eventReceiver
à conta de serviço do Compute Engine:export PROJECT_NUMBER="$(gcloud projects describe $(gcloud config get-value project) --format='value(projectNumber)')" gcloud projects add-iam-policy-binding $(gcloud config get-value project) \ --member=serviceAccount:${PROJECT_NUMBER}-compute@developer.gserviceaccount.com \ --role='roles/eventarc.eventReceiver'
- Se você ativou a conta de serviço do Pub/Sub até 8 de abril
de 2021, conceda o papel
iam.serviceAccountTokenCreator
à conta de serviço do Pub/Sub:gcloud projects add-iam-policy-binding $(gcloud config get-value project) \ --member="serviceAccount:service-${PROJECT_NUMBER}@gcp-sa-pubsub.iam.gserviceaccount.com"\ --role='roles/iam.serviceAccountTokenCreator'
- Defina os padrões usados neste tutorial:
export REGION=REGION gcloud config set run/region ${REGION} gcloud config set run/platform managed gcloud config set eventarc/location ${REGION}
Substitua
REGION
pelo local compatível com o Eventarc de sua escolha.
Criar uma chave da API SendGrid
O SendGrid é um provedor de e-mail baseado em nuvem que permite enviar e-mails sem precisar manter servidores de e-mail.
- Faça login no SendGrid e acesse Configurações > Chaves de API.
- Clique em Criar chave de API.
- Selecione as permissões para a chave. Para enviar e-mails, a chave precisa, no mínimo, de permissões de envio de e-mail.
- Dê um nome à chave e clique em Salvar para criá-la.
- O SendGrid gera uma nova chave. Esta é a única cópia da chave, portanto, faça uma cópia dela e salve-a para uso futuro.
Criar um repositório padrão do Artifact Registry
Crie um repositório padrão do Artifact Registry para armazenar a imagem do contêiner do Docker:
gcloud artifacts repositories create REPOSITORY \ --repository-format=docker \ --location=$REGION
Substitua REPOSITORY
por um nome exclusivo para o
repositório.
crie um bucket do Cloud Storage
Crie um bucket exclusivo do Cloud Storage para salvar os gráficos. Verifique se o bucket e os gráficos estão disponíveis publicamente e na mesma região do serviço do Cloud Run:
export BUCKET="$(gcloud config get-value core/project)-charts" gsutil mb -l $(gcloud config get-value run/region) gs://${BUCKET} gsutil uniformbucketlevelaccess set on gs://${BUCKET} gsutil iam ch allUsers:objectViewer gs://${BUCKET}
Implantar o serviço Notificador
Implantar um serviço do Cloud Run que recebe eventos do Criador de gráficos e usa o SendGrid para enviar links por e-mail para os gráficos gerados.
Clone o repositório do GitHub e mude para o diretório
notifier/python
:git clone https://github.com/GoogleCloudPlatform/eventarc-samples cd eventarc-samples/processing-pipelines/bigquery/notifier/python/
Crie e envie a imagem do contêiner:
export SERVICE_NAME=notifier docker build -t $REGION-docker.pkg.dev/$(gcloud config get-value project)/REPOSITORY/${SERVICE_NAME}:v1 . docker push $REGION-docker.pkg.dev/$(gcloud config get-value project)/REPOSITORY/${SERVICE_NAME}:v1
Implante a imagem do contêiner no Cloud Run, passando um endereço para enviar e-mails e a chave de API SendGrid:
export TO_EMAILS=EMAIL_ADDRESS export SENDGRID_API_KEY=YOUR_SENDGRID_API_KEY gcloud run deploy ${SERVICE_NAME} \ --image $REGION-docker.pkg.dev/$(gcloud config get-value project)/REPOSITORY/${SERVICE_NAME}:v1 \ --update-env-vars TO_EMAILS=${TO_EMAILS},SENDGRID_API_KEY=${SENDGRID_API_KEY},BUCKET=${BUCKET} \ --allow-unauthenticated
Substitua:
EMAIL_ADDRESS
por um endereço de e-mail para enviar os links aos gráficos geradosYOUR_SENDGRID_API_KEY
pela chave da API SendGrid que você anotou anteriormente
Quando você vir o URL do serviço, a implantação estará concluída.
Criar um gatilho para o serviço Notificador
O gatilho do Eventarc para o serviço do Notificador implantado nos filtros do Cloud Run para registros de auditoria do Cloud Storage em que o methodName
é storage.objects.create
.
Crie o gatilho:
gcloud eventarc triggers create trigger-${SERVICE_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" \ --service-account=${PROJECT_NUMBER}-compute@developer.gserviceaccount.com
Isso cria um gatilho chamado
trigger-notifier
.
Implantar o serviço Criador de gráficos
Implantar um serviço do Cloud Run que recebe eventos do Query Runner, recupera dados de uma tabela do BigQuery para um país específico e gera um gráfico usando o Matplotlib, com base nos dados. O upload do gráfico é feito para um bucket do Cloud Storage.
Altere para o diretório
chart-creator/python
:cd ../../chart-creator/python
Crie e envie a imagem do contêiner:
export SERVICE_NAME=chart-creator docker build -t $REGION-docker.pkg.dev/$(gcloud config get-value project)/REPOSITORY/${SERVICE_NAME}:v1 . docker push $REGION-docker.pkg.dev/$(gcloud config get-value project)/REPOSITORY/${SERVICE_NAME}:v1
Implante a imagem do contêiner no Cloud Run, transmitindo
BUCKET
:gcloud run deploy ${SERVICE_NAME} \ --image $REGION-docker.pkg.dev/$(gcloud config get-value project)/REPOSITORY/${SERVICE_NAME}:v1 \ --update-env-vars BUCKET=${BUCKET} \ --allow-unauthenticated
Quando você vir o URL do serviço, a implantação estará concluída.
Criar um gatilho para o serviço de criação de gráficos
O gatilho do Eventarc para o serviço de criação de gráficos implantado nos filtros do Cloud Run para mensagens publicadas em um tópico do Pub/Sub.
Crie o gatilho:
gcloud eventarc triggers create trigger-${SERVICE_NAME} \ --destination-run-service=${SERVICE_NAME} \ --destination-run-region=${REGION} \ --event-filters="type=google.cloud.pubsub.topic.v1.messagePublished"
Isso cria um gatilho chamado
trigger-chart-creator
.Defina a variável de ambiente de tópico Pub/Sub.
export TOPIC_QUERY_COMPLETED=$(basename $(gcloud eventarc triggers describe trigger-${SERVICE_NAME} --format='value(transport.pubsub.topic)'))
Implantar o serviço Query Runner
Implante um serviço do Cloud Run que recebe eventos do Cloud Scheduler, recupera dados de um conjunto de dados público sobre a COVID-19 e salva os resultados em uma nova tabela do BigQuery.
Altere para o diretório
processing-pipelines
:cd ../../..
Crie e envie a imagem do contêiner:
export SERVICE_NAME=query-runner docker build -t $REGION-docker.pkg.dev/$(gcloud config get-value project)/REPOSITORY/${SERVICE_NAME}:v1 -f Dockerfile . docker push $REGION-docker.pkg.dev/$(gcloud config get-value project)/REPOSITORY/${SERVICE_NAME}:v1
Implante a imagem do contêiner no Cloud Run, passando
PROJECT_ID
eTOPIC_QUERY_COMPLETED
:gcloud run deploy ${SERVICE_NAME} \ --image $REGION-docker.pkg.dev/$(gcloud config get-value project)/REPOSITORY/${SERVICE_NAME}:v1 \ --update-env-vars PROJECT_ID=$(gcloud config get-value project),TOPIC_ID=${TOPIC_QUERY_COMPLETED} \ --allow-unauthenticated
Quando você vir o URL do serviço, a implantação estará concluída.
Criar um gatilho para o serviço Query Runner
O gatilho do Eventarc para o serviço do executor de consultas implantado nos filtros do Cloud Run para mensagens publicadas em um tópico do Pub/Sub.
Crie o gatilho:
gcloud eventarc triggers create trigger-${SERVICE_NAME} \ --destination-run-service=${SERVICE_NAME} \ --destination-run-region=${REGION} \ --event-filters="type=google.cloud.pubsub.topic.v1.messagePublished"
Isso cria um gatilho chamado
trigger-query-runner
.Defina uma variável de ambiente para o tópico do Pub/Sub.
export TOPIC_QUERY_SCHEDULED=$(gcloud eventarc triggers describe trigger-${SERVICE_NAME} --format='value(transport.pubsub.topic)')
Programar os jobs
O pipeline de processamento é acionado por dois jobs do Cloud Scheduler.
Crie um aplicativo do App Engine exigido pelo Cloud Scheduler e especifique um local apropriado:
export APP_ENGINE_LOCATION=LOCATION gcloud app create --region=${APP_ENGINE_LOCATION}
Crie dois jobs do Cloud Scheduler que publiquem em um tópico do Pub/Sub uma vez por dia:
gcloud scheduler jobs create pubsub cre-scheduler-uk \ --schedule="0 16 * * *" \ --topic=${TOPIC_QUERY_SCHEDULED} \ --message-body="United Kingdom"
gcloud scheduler jobs create pubsub cre-scheduler-cy \ --schedule="0 17 * * *" \ --topic=${TOPIC_QUERY_SCHEDULED} \ --message-body="Cyprus"
A programação é especificada no formato unix-cron. Por exemplo,
0 16 * * *
significa que os jobs são executados às 16h (16h) UTC todos os dias.
Executar o canal
Primeiro, confirme se todos os gatilhos foram criados com sucesso:
gcloud eventarc triggers list
A saída será semelhante a esta:
NAME: trigger-chart-creator TYPE: google.cloud.pubsub.topic.v1.messagePublished DESTINATION: Cloud Run service: chart-creator ACTIVE: Yes LOCATION: us-central1 NAME: trigger-notifier TYPE: google.cloud.audit.log.v1.written DESTINATION: Cloud Run service: notifier ACTIVE: Yes LOCATION: us-central1 NAME: trigger-query-runner TYPE: google.cloud.pubsub.topic.v1.messagePublished DESTINATION: Cloud Run service: query-runner ACTIVE: Yes LOCATION: us-central1
Recupere os IDs dos jobs do Cloud Scheduler:
gcloud scheduler jobs list
A saída será semelhante a:
ID LOCATION SCHEDULE (TZ) TARGET_TYPE STATE cre-scheduler-cy us-central1 0 17 * * * (Etc/UTC) Pub/Sub ENABLED cre-scheduler-uk us-central1 0 16 * * * (Etc/UTC) Pub/Sub ENABLED
Os jobs estão programados para serem executados diariamente às 16h e às 17h, mas também é possível executar os jobs do Cloud Scheduler manualmente:
gcloud scheduler jobs run cre-scheduler-cy gcloud scheduler jobs run cre-scheduler-uk
Após alguns minutos, confirme se há dois gráficos no bucket do Cloud Storage:
gsutil ls gs://${BUCKET}
A saída será semelhante a:
gs://BUCKET/chart-cyprus.png gs://BUCKET/chart-unitedkingdom.png
Parabéns! Você também receberá dois e-mails com links para os gráficos.
Limpar
Se você criou um novo projeto para este tutorial, exclua-o. Se você usou um projeto atual e quer mantê-lo sem as alterações incluídas neste tutorial, exclua os recursos criados para o tutorial.
Delete a Google Cloud project:
gcloud projects delete PROJECT_ID
Excluir recursos do tutorial
Exclua todos os serviços do Cloud Run que você implantou com este tutorial:
gcloud run services delete SERVICE_NAME
SERVICE_NAME
é o nome escolhido do serviço.Também é possível excluir os serviços do Cloud Run no Console do Google Cloud.
Remova as configurações padrão da CLI do Google Cloud adicionadas durante a configuração do tutorial:
gcloud config unset project gcloud config unset run/region gcloud config unset run/platform gcloud config unset eventarc/location
Exclua todos os gatilhos do Eventarc criados neste tutorial:
Substituagcloud eventarc triggers delete TRIGGER_NAME
TRIGGER_NAME
pelo nome do gatilho.Exclua as imagens do Artifact Registry.
gcloud artifacts docker images delete $REGION-docker.pkg.dev/$(gcloud config get-value project)/REPOSITORY/notifier:v1 gcloud artifacts docker images delete $REGION-docker.pkg.dev/$(gcloud config get-value project)/REPOSITORY/chart-creator:v1 gcloud artifacts docker images delete $REGION-docker.pkg.dev/$(gcloud config get-value project)/REPOSITORY/query-runner:v1
Exclua o bucket com todos os objetos dentro dele:
gcloud storage rm --recursive gs://${BUCKET}/
Exclua os jobs do Cloud Scheduler.
gcloud scheduler jobs delete cre-scheduler-cy gcloud scheduler jobs delete cre-scheduler-uk