Como criar um pipeline de processamento do BigQuery com o Eventarc


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:

  1. 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.
  2. 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.
  3. 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:

Pipeline de processamento do BigQuery

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. Novos usuários do Google Cloud podem estar qualificados para uma avaliação gratuita.

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.

  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. To initialize the gcloud CLI, run the following command:

    gcloud init
  4. 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.

  5. Make sure that billing is enabled for your Google Cloud project.

  6. 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
  7. Install the Google Cloud CLI.
  8. To initialize the gcloud CLI, run the following command:

    gcloud init
  9. 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.

  10. Make sure that billing is enabled for your Google Cloud project.

  11. 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
  12. Para o Cloud Storage, ative a geração de registros de auditoria para os tipos de acesso a dados ADMIN_READ, DATA_WRITE e DATA_READ.

    1. 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
    2. Em um editor de texto, abra /tmp/policy.yaml e adicione ou altere apenas a configuração do registro de auditoria na seção auditConfigs:

      
        auditConfigs:
        - auditLogConfigs:
          - logType: ADMIN_READ
          - logType: DATA_WRITE
          - logType: DATA_READ
          service: storage.googleapis.com
        bindings:
        - members:
        [...]
        etag: BwW_bHKTV5U=
        version: 1
    3. 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.

  13. 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'

  14. 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'

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

  1. Faça login no SendGrid e acesse Configurações > Chaves de API.
  2. Clique em Criar chave de API.
  3. 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.
  4. Dê um nome à chave e clique em Salvar para criá-la.
  5. 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.

  1. 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/
  2. 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
  3. 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 gerados
    • YOUR_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.

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

  1. Altere para o diretório chart-creator/python:

    cd ../../chart-creator/python
  2. 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
  3. 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.

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

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

  1. Altere para o diretório processing-pipelines:

    cd ../../..
  2. 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
  3. Implante a imagem do contêiner no Cloud Run, passando PROJECT_ID e TOPIC_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.

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

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

  1. 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}
  2. 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

  1. 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
    
  2. 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
    
  3. 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
  4. 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

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

  2. 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
  3. Exclua todos os gatilhos do Eventarc criados neste tutorial:

     gcloud eventarc triggers delete TRIGGER_NAME
     
    Substitua TRIGGER_NAME pelo nome do gatilho.

  4. 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
  5. Exclua o bucket com todos os objetos dentro dele:

    gcloud storage rm --recursive gs://${BUCKET}/
  6. Exclua os jobs do Cloud Scheduler.

    gcloud scheduler jobs delete cre-scheduler-cy
    gcloud scheduler jobs delete cre-scheduler-uk

A seguir