Membangun pipeline pemrosesan BigQuery untuk penayangan Knative dengan Eventarc

Tutorial ini menunjukkan cara menggunakan Eventarc untuk membuat pipeline pemrosesan yang menjadwalkan kueri ke set data BigQuery publik, membuat diagram berdasarkan data, dan membagikan link ke diagram melalui email.

Membuat kunci API SendGrid

SendGrid adalah penyedia email berbasis cloud yang memungkinkan Anda mengirim email tanpa harus memelihara server email.

  1. Login ke SendGrid dan buka Settings > API Keys.
  2. Klik Create API Key.
  3. Pilih izin untuk kunci tersebut. Setidaknya, kunci harus memiliki izin Pengiriman Email untuk mengirim email.
  4. Klik Save untuk membuat kunci.
  5. SendGrid akan membuat kunci baru. Ini adalah satu-satunya salinan kunci, jadi pastikan Anda menyalin kunci dan menyimpannya untuk nanti.

Membuat cluster GKE

Buat cluster dengan Workload Identity Federation untuk GKE diaktifkan agar dapat mengakses layanan Google Cloud dari aplikasi yang berjalan dalam GKE. Anda juga memerlukan Workload Identity Federation for GKE untuk meneruskan peristiwa menggunakan Eventarc.

  1. Buat cluster GKE untuk layanan Knative dengan mengaktifkan add-on CloudRun, HttpLoadBalancing, dan HorizontalPodAutoscaling:

    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. Tunggu beberapa menit hingga pembuatan cluster selesai. Selama proses, Anda mungkin melihat peringatan yang dapat diabaikan dengan aman. Setelah cluster dibuat, output-nya akan mirip dengan berikut ini:

    Creating cluster ...done.
    Created [https://container.googleapis.com/v1beta1/projects/my-project/zones/us-central1/clusters/events-cluster].
    
  3. Buat repositori standar Artifact Registry untuk menyimpan image container Docker Anda:

    gcloud artifacts repositories create REPOSITORY \
        --repository-format=docker \
        --location=$CLUSTER_LOCATION

    Ganti REPOSITORY dengan nama unik untuk repositori.

Mengonfigurasi akun layanan GKE

Konfigurasi akun layanan GKE agar bertindak sebagai akun layanan komputasi default.

  1. Buat binding Identity and Access Management (IAM) antara akun layanan:

    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. Tambahkan anotasi iam.gke.io/gcp-service-account ke akun layanan GKE, menggunakan alamat email akun layanan compute:

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

Mengaktifkan tujuan GKE

Untuk mengizinkan Eventarc mengelola resource di cluster GKE, aktifkan tujuan GKE dan ikat akun layanan Eventarc dengan peran yang diperlukan.

  1. Aktifkan tujuan GKE untuk Eventarc:

    gcloud eventarc gke-destinations init
  2. Pada perintah untuk mengikat peran yang diperlukan, masukkan y.

    Peran berikut terikat:

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

Buat akun layanan dan ikat peran akses

Sebelum membuat pemicu Eventarc, siapkan akun layanan yang dikelola pengguna dan berikan peran tertentu agar Eventarc dapat meneruskan peristiwa Pub/Sub.

  1. Buat akun layanan bernama TRIGGER_GSA:

    TRIGGER_GSA=eventarc-bigquery-triggers
    gcloud iam service-accounts create $TRIGGER_GSA
  2. Berikan peran pubsub.subscriber, monitoring.metricWriter, dan eventarc.eventReceiver ke akun layanan:

    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"

Membuat bucket Cloud Storage

Buat bucket Cloud Storage untuk menyimpan diagram. Pastikan bucket dan diagram tersedia secara publik, dan berada di region yang sama dengan layanan GKE Anda:

export BUCKET="$(gcloud config get-value core/project)-charts"
gcloud storage buckets create gs://${BUCKET} --location=$(gcloud config get-value run/region)
gcloud storage buckets update gs://${BUCKET} --uniform-bucket-level-access
gcloud storage buckets add-iam-policy-binding gs://${BUCKET} --member=allUsers --role=roles/storage.objectViewer

Membuat cloning repositori

Buat clone repositori GitHub.

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

Men-deploy layanan notifikasi

Dari direktori bigquery/notifier/python, deploy layanan penayangan Knative yang menerima peristiwa pembuat diagram dan menggunakan SendGrid untuk mengirimkan link email ke diagram yang dihasilkan.

  1. Buat dan kirim image container:

    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. Deploy image container ke penayangan Knative, dengan meneruskan alamat untuk mengirim email, dan kunci 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}

    Ganti kode berikut:

    • EMAIL_ADDRESS: alamat email untuk mengirim link ke diagram yang dibuat
    • YOUR_SENDGRID_API_KEY: kunci API SendGrid yang Anda catat sebelumnya

Jika Anda melihat URL layanan, berarti deployment selesai.

Membuat pemicu untuk layanan pemberi notifikasi

Pemicu Eventarc untuk layanan notifikasi yang di-deploy di Knative serving memfilter log audit Cloud Storage dengan methodName storage.objects.create.

  1. Buat pemicu:

    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

    Tindakan ini akan membuat pemicu yang disebut trigger-notifier-gke.

Men-deploy layanan pembuat diagram

Dari direktori bigquery/chart-creator/python, deploy layanan Knative yang menerima peristiwa pelaksana kueri, mengambil data dari tabel BigQuery untuk negara tertentu, lalu membuat diagram, menggunakan Matplotlib, dari data tersebut. Diagram diupload ke bucket Cloud Storage.

  1. Buat dan kirim image container:

    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. Deploy image container ke penayangan Knative, dengan meneruskan 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}

Jika Anda melihat URL layanan, berarti deployment selesai.

Buat pemicu untuk layanan pembuat diagram

Pemicu Eventarc untuk layanan pembuat diagram yang di-deploy di Knative serving memfilter pesan yang dipublikasikan ke topik Pub/Sub.

  1. Buat pemicu:

    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

    Tindakan ini akan membuat pemicu yang disebut trigger-chart-creator-gke.

  2. Tetapkan variabel lingkungan topik Pub/Sub.

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

Men-deploy layanan pelaksana kueri

Dari direktori processing-pipelines, deploy layanan penayangan Knative yang menerima peristiwa Cloud Scheduler, mengambil data dari set data COVID-19 publik, dan menyimpan hasilnya dalam tabel BigQuery baru.

  1. Buat dan kirim image container:

    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. Deploy image container ke penayangan Knative, dengan meneruskan PROJECT_ID dan 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}

Jika Anda melihat URL layanan, berarti deployment selesai.

Membuat pemicu untuk layanan pelaksana kueri

Pemicu Eventarc untuk layanan pelaksana kueri yang di-deploy di layanan Knative memfilter pesan yang dipublikasikan ke topik Pub/Sub.

  1. Buat pemicu:

    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

    Tindakan ini akan membuat pemicu yang disebut trigger-query-runner-gke.

  2. Tetapkan variabel lingkungan untuk topik Pub/Sub.

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

Menjadwalkan tugas

Pipeline pemrosesan dipicu oleh dua tugas Cloud Scheduler.

  1. Buat aplikasi App Engine yang diperlukan oleh Cloud Scheduler dan tentukan lokasi yang sesuai (misalnya, europe-west):

    export APP_ENGINE_LOCATION=LOCATION
    gcloud app create --region=${APP_ENGINE_LOCATION}
  2. Buat dua tugas Cloud Scheduler yang memublikasikan ke topik Pub/Sub sekali per hari:

    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"

    Jadwal ditentukan dalam format unix-cron. Misalnya, 0 16 * * * berarti tugas berjalan pada pukul 16.00 (4 PM) UTC setiap hari.

Menjalankan pipeline

  1. Konfirmasi bahwa semua pemicu berhasil dibuat:

    gcloud eventarc triggers list

    Outputnya akan mirip dengan berikut ini:

    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. Ambil ID tugas Cloud Scheduler:

    gcloud scheduler jobs list

    Outputnya akan mirip dengan berikut ini:

    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. Meskipun tugas dijadwalkan untuk berjalan setiap hari pada pukul 16.00 dan 17.00, Anda juga dapat menjalankan tugas Cloud Scheduler secara manual:

    gcloud scheduler jobs run cre-scheduler-cy
    gcloud scheduler jobs run cre-scheduler-uk
  4. Setelah beberapa menit, konfirmasi bahwa ada dua diagram di bucket Cloud Storage:

    gcloud storage ls gs://${BUCKET}

    Outputnya akan mirip dengan berikut ini:

    gs://PROJECT_ID-charts/chart-cyprus.png
    gs://PROJECT_ID-charts/chart-unitedkingdom.png
    

Selamat! Anda juga akan menerima dua email berisi link ke diagram.