Criar um pipeline de processamento do BigQuery para exibição do Knative com o Eventarc


Veja neste tutorial 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 para os gráficos por e-mail.

Objetivos

Neste tutorial, você criará e implantará três serviços de exibição do Knative em execução em um cluster do Google Kubernetes Engine (GKE) 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 sobre a COVID-19 e salva os resultados em uma nova tabela do BigQuery.
  2. Criador de gráficos: acionado quando o serviço executor de consultas publica uma mensagem em um tópico do Pub/Sub topic. Este 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 criador 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 dos gráficos para 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

  1. Faça login na sua conta do Google Cloud. Se você começou a usar o Google Cloud agora, crie uma conta para avaliar o desempenho de 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. Instale a CLI do Google Cloud.
  3. Para inicializar a CLI gcloud, execute o seguinte comando:

    gcloud init
  4. Crie ou selecione um projeto do Google Cloud.

    • Crie um projeto do Google Cloud:

      gcloud projects create PROJECT_ID

      Substitua PROJECT_ID por um nome para o projeto do Google Cloud que você está criando.

    • Selecione o projeto do Google Cloud que você criou:

      gcloud config set project PROJECT_ID

      Substitua PROJECT_ID pelo nome do projeto do Google Cloud.

  5. Verifique se a cobrança está ativada para o seu projeto do Google Cloud.

  6. Ative as APIs Artifact Registry, Cloud Build, Cloud Logging, Cloud Scheduler, Eventarc, GKE, Pub/Sub, and Resource Manager:

    gcloud services enable artifactregistry.googleapis.com cloudbuild.googleapis.com cloudresourcemanager.googleapis.com cloudscheduler.googleapis.com container.googleapis.com eventarc.googleapis.com pubsub.googleapis.com run.googleapis.com logging.googleapis.com
  7. Instale a CLI do Google Cloud.
  8. Para inicializar a CLI gcloud, execute o seguinte comando:

    gcloud init
  9. Crie ou selecione um projeto do Google Cloud.

    • Crie um projeto do Google Cloud:

      gcloud projects create PROJECT_ID

      Substitua PROJECT_ID por um nome para o projeto do Google Cloud que você está criando.

    • Selecione o projeto do Google Cloud que você criou:

      gcloud config set project PROJECT_ID

      Substitua PROJECT_ID pelo nome do projeto do Google Cloud.

  10. Verifique se a cobrança está ativada para o seu projeto do Google Cloud.

  11. Ative as APIs Artifact Registry, Cloud Build, Cloud Logging, Cloud Scheduler, Eventarc, GKE, Pub/Sub, and Resource Manager:

    gcloud services enable artifactregistry.googleapis.com cloudbuild.googleapis.com cloudresourcemanager.googleapis.com cloudscheduler.googleapis.com container.googleapis.com eventarc.googleapis.com pubsub.googleapis.com run.googleapis.com logging.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. Defina os padrões usados neste tutorial:
    CLUSTER_NAME=events-cluster
    CLUSTER_LOCATION=us-central1
    PROJECT_ID=PROJECT_ID
    gcloud config set project $PROJECT_ID
    gcloud config set run/region $CLUSTER_LOCATION
    gcloud config set run/cluster $CLUSTER_NAME
    gcloud config set run/cluster_location $CLUSTER_LOCATION
    gcloud config set run/platform gke
    gcloud config set eventarc/location $CLUSTER_LOCATION
    

    Substitua PROJECT_ID pelo ID do projeto.

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. Clique em Save para criar a chave.
  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.

Crie um cluster do GKE

Crie um cluster com a Identidade da carga de trabalho ativada para que ele possa acessar os serviços do Google Cloud a partir de aplicativos em execução no GKE. Você também precisa da Identidade da carga de trabalho para encaminhar eventos usando o Eventarc.

  1. Crie um cluster do GKE para exibição do Knative com os complementos CloudRun, HttpLoadBalancing e HorizontalPodAutoscaling ativados:

    gcloud beta container clusters create $CLUSTER_NAME \
        --addons=HttpLoadBalancing,HorizontalPodAutoscaling,CloudRun \
        --machine-type=n1-standard-4 \
        --enable-autoscaling --min-nodes=2 --max-nodes=10 \
        --no-issue-client-certificate --num-nodes=2  \
        --logging=SYSTEM,WORKLOAD \
        --monitoring=SYSTEM \
        --scopes=cloud-platform,logging-write,monitoring-write,pubsub \
        --zone us-central1 \
        --release-channel=rapid \
        --workload-pool=$PROJECT_ID.svc.id.goog
    
  2. Aguarde alguns minutos para que a criação do cluster seja concluída. Durante o processo, talvez você veja avisos que podem ser ignorados com segurança. Depois da criação do cluster, a saída é semelhante a esta:

    Creating cluster ...done.
    Created [https://container.googleapis.com/v1beta1/projects/my-project/zones/us-central1/clusters/events-cluster].
    
  3. 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=$CLUSTER_LOCATION

    Substitua REPOSITORY por um nome exclusivo para o repositório.

Configurar a conta de serviço do GKE

Configure uma conta de serviço do GKE para atuar como a conta de serviço de computação padrão.

  1. Crie uma vinculação do Identity and Access Management (IAM) entre as contas de serviço:

    PROJECT_NUMBER="$(gcloud projects describe $(gcloud config get-value project) --format='value(projectNumber)')"
    
    gcloud iam service-accounts add-iam-policy-binding \
        --role roles/iam.workloadIdentityUser \
        --member "serviceAccount:$PROJECT_ID.svc.id.goog[default/default]" \
        $PROJECT_NUMBER-compute@developer.gserviceaccount.com
    
  2. Adicione a anotação iam.gke.io/gcp-service-account à conta de serviço do GKE usando o endereço de e-mail da conta de serviço de computação:

    kubectl annotate serviceaccount \
        --namespace default \
        default \
        iam.gke.io/gcp-service-account=$PROJECT_NUMBER-compute@developer.gserviceaccount.com
    

Ativar destinos do GKE

Para permitir que o Eventarc gerencie recursos no cluster do GKE, ative os destinos do GKE e vincule a conta de serviço do Eventarc aos papéis necessários.

  1. Ative os destinos do GKE para o Eventarc:

    gcloud eventarc gke-destinations init
    
  2. No prompt para vincular os papéis necessários, digite y.

    Os papéis a seguir estão vinculados:

    • roles/compute.viewer
    • roles/container.developer
    • roles/iam.serviceAccountAdmin

Criar uma conta de serviço e vincular papéis de acesso

Antes de criar o gatilho do Eventarc, configure uma conta de serviço gerenciada pelo usuário e conceda a ela papéis específicos para que o Eventarc possa encaminhar eventos do Pub/Sub.

  1. Crie uma conta de serviço chamada TRIGGER_GSA:

    TRIGGER_GSA=eventarc-bigquery-triggers
    gcloud iam service-accounts create $TRIGGER_GSA
  2. Conceda os papéis pubsub.subscriber, monitoring.metricWriter e eventarc.eventReceiver à conta de serviço:

    PROJECT_ID=$(gcloud config get-value project)
    
    gcloud projects add-iam-policy-binding $PROJECT_ID \
        --member "serviceAccount:$TRIGGER_GSA@$PROJECT_ID.iam.gserviceaccount.com" \
        --role "roles/pubsub.subscriber"
    
    gcloud projects add-iam-policy-binding $PROJECT_ID \
        --member "serviceAccount:$TRIGGER_GSA@$PROJECT_ID.iam.gserviceaccount.com" \
        --role "roles/monitoring.metricWriter"
    
    gcloud projects add-iam-policy-binding $PROJECT_ID \
        --member "serviceAccount:$TRIGGER_GSA@$PROJECT_ID.iam.gserviceaccount.com" \
        --role "roles/eventarc.eventReceiver"
    

crie um bucket do Cloud Storage

Crie um bucket 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 GKE:

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}

Clonar o repositório

Clonar o repositório GitHub.

git clone https://github.com/GoogleCloudPlatform/eventarc-samples
cd eventarc-samples/processing-pipelines

Implantar o serviço notificador

No diretório bigquery/notifier/python, implante um serviço de exibição Knative que receba eventos de criação de gráficos e use o SendGrid para enviar links por e-mail aos gráficos gerados.

  1. Crie e envie a imagem do contêiner:

    pushd bigquery/notifier/python
    export SERVICE_NAME=notifier
    docker build -t $CLUSTER_LOCATION-docker.pkg.dev/$(gcloud config get-value project)/REPOSITORY/${SERVICE_NAME}:v1 .
    docker push $CLUSTER_LOCATION-docker.pkg.dev/$(gcloud config get-value project)/REPOSITORY/${SERVICE_NAME}:v1
    popd
    
  2. Implante a imagem do contêiner no Knative serving, 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 $CLUSTER_LOCATION-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}
    

    Substitua:

    • EMAIL_ADDRESS por um endereço de e-mail para enviar os links para os gráficos gerados.
    • YOUR_SENDGRID_API_KEY: pela chave de 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 Knative serving 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}-gke \
        --destination-gke-cluster=$CLUSTER_NAME \
        --destination-gke-location=$CLUSTER_LOCATION \
        --destination-gke-namespace=default \
        --destination-gke-service=$SERVICE_NAME \
        --destination-gke-path=/ \
        --event-filters="type=google.cloud.audit.log.v1.written" \
        --event-filters="serviceName=storage.googleapis.com" \
        --event-filters="methodName=storage.objects.create" \
        --service-account=$TRIGGER_GSA@$PROJECT_ID.iam.gserviceaccount.com
    

    Isso cria um gatilho chamado trigger-notifier-gke.

Implantar o serviço criador de gráficos

No diretório bigquery/chart-creator/python, implante um serviço do Knative serving que receba eventos do executor de consultas, recupere dados de uma tabela do BigQuery de um país específico e gere um gráfico usando Matplotlib, dados. O upload do gráfico é feito para um bucket do Cloud Storage.

  1. Crie e envie a imagem do contêiner:

    pushd bigquery/chart-creator/python
    export SERVICE_NAME=chart-creator
    docker build -t $CLUSTER_LOCATION-docker.pkg.dev/$(gcloud config get-value project)/REPOSITORY/${SERVICE_NAME}:v1 .
    docker push $CLUSTER_LOCATION-docker.pkg.dev/$(gcloud config get-value project)/REPOSITORY/${SERVICE_NAME}:v1
    popd
    
  2. Implante a imagem do contêiner do Knative serving, transmitindo BUCKET:

    gcloud run deploy ${SERVICE_NAME} \
        --image $CLUSTER_LOCATION-docker.pkg.dev/$(gcloud config get-value project)/REPOSITORY/${SERVICE_NAME}:v1 \
        --update-env-vars BUCKET=${BUCKET}
    

Quando você vir o URL do serviço, a implantação estará concluída.

Criar um gatilho para o serviço criador de gráficos

O gatilho do Eventarc para o serviço de criação de gráficos implantado nos filtros do Knative serving para mensagens publicadas em um tópico do Pub/Sub.

  1. Crie o gatilho:

    gcloud eventarc triggers create trigger-${SERVICE_NAME}-gke \
        --destination-gke-cluster=$CLUSTER_NAME \
        --destination-gke-location=$CLUSTER_LOCATION \
        --destination-gke-namespace=default \
        --destination-gke-service=$SERVICE_NAME \
        --destination-gke-path=/ \
        --event-filters="type=google.cloud.pubsub.topic.v1.messagePublished" \
        --service-account=$TRIGGER_GSA@$PROJECT_ID.iam.gserviceaccount.com
    

    Isso cria um gatilho chamado trigger-chart-creator-gke.

  2. Defina a variável de ambiente de tópico Pub/Sub.

    export TOPIC_QUERY_COMPLETED=$(basename $(gcloud eventarc triggers describe trigger-${SERVICE_NAME}-gke --format='value(transport.pubsub.topic)'))
    

Implantar o serviço executor de consultas

No diretório processing-pipelines, implante um serviço do Knative serving que receba eventos do Cloud Scheduler, recupere dados de um conjunto de dados público da COVID-19 e salve os resultados em uma nova tabela do BigQuery.

  1. Crie e envie a imagem do contêiner:

    export SERVICE_NAME=query-runner
    docker build -t $CLUSTER_LOCATION-docker.pkg.dev/$(gcloud config get-value project)/REPOSITORY/${SERVICE_NAME}:v1 -f Dockerfile .
    docker push $CLUSTER_LOCATION-docker.pkg.dev/$(gcloud config get-value project)/REPOSITORY/${SERVICE_NAME}:v1
    
  2. Implante a imagem do contêiner do Knative serving, transmitindo PROJECT_ID e TOPIC_QUERY_COMPLETED:

    gcloud run deploy ${SERVICE_NAME} \
        --image $CLUSTER_LOCATION-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}
    

Quando você vir o URL do serviço, a implantação estará concluída.

Criar um gatilho para o serviço executor de consultas

O gatilho do Eventarc para o serviço do executor de consultas implantado nos filtros do Knative serving para mensagens publicadas em um tópico do Pub/Sub.

  1. Crie o gatilho:

    gcloud eventarc triggers create trigger-${SERVICE_NAME}-gke \
        --destination-gke-cluster=$CLUSTER_NAME \
        --destination-gke-location=$CLUSTER_LOCATION \
        --destination-gke-namespace=default \
        --destination-gke-service=$SERVICE_NAME \
        --destination-gke-path=/ \
        --event-filters="type=google.cloud.pubsub.topic.v1.messagePublished" \
        --service-account=$TRIGGER_GSA@$PROJECT_ID.iam.gserviceaccount.com
    

    Isso cria um gatilho chamado trigger-query-runner-gke.

  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}-gke --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 que seja exigido pelo Cloud Scheduler e especifique um local apropriado (por exemplo, europe-west):

    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. Confirme a criação de todos os gatilhos:

    gcloud eventarc triggers list
    

    A saída será semelhante a:

    NAME                       TYPE                                            DESTINATION         ACTIVE  LOCATION
    trigger-chart-creator-gke  google.cloud.pubsub.topic.v1.messagePublished   GKE:chart-creator   Yes     us-central1
    trigger-notifier-gke       google.cloud.audit.log.v1.written               GKE:notifier        Yes     us-central1
    trigger-query-runner-gke   google.cloud.pubsub.topic.v1.messagePublished   GKE:query-runner    Yes     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://PROJECT_ID-charts/chart-cyprus.png
    gs://PROJECT_ID-charts/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.

    Exclua um projeto do Google Cloud:

    gcloud projects delete PROJECT_ID

Excluir recursos do tutorial

  1. Exclua todos os serviços do Knative serving que você implantou neste tutorial:

    gcloud run services delete SERVICE_NAME

    SERVICE_NAME é o nome escolhido do serviço.

    Também é possível excluir os serviços do Knative serving no Console do Google Cloud.

  2. Exclua todos os gatilhos do Eventarc criados neste tutorial:

    gcloud eventarc triggers delete TRIGGER_NAME
    

    Substitua TRIGGER_NAME pelo nome do gatilho.

  3. 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/cluster
    gcloud config unset run/cluster_location
    gcloud config unset run/platform
    gcloud config unset eventarc/location
    gcloud config unset compute/zone
    
  4. Exclua as imagens do Artifact Registry.

    gcloud artifacts docker images delete $CLUSTER_LOCATION-docker.pkg.dev/$(gcloud config get-value project)/REPOSITORY/notifier:v1
    gcloud artifacts docker images delete $CLUSTER_LOCATION-docker.pkg.dev/$(gcloud config get-value project)/REPOSITORY/chart-creator:v1
    gcloud artifacts docker images delete $CLUSTER_LOCATION-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