Membangun orkestrasi berbasis peristiwa dengan Eventarc dan Workflows

1. Pengantar

cb762f29e9183a3f.png 1c05e3d0c2bd2b45.pngS a03f943ca09ac4c.png

Eventarc memudahkan untuk menghubungkan layanan Cloud Run dengan peristiwa dari berbagai sumber. Solusi ini memungkinkan Anda membangun arsitektur berbasis peristiwa tempat microservice dikaitkan dan didistribusikan secara longgar. Layanan ini menangani penyerapan, pengiriman, keamanan, otorisasi, dan penanganan error peristiwa untuk Anda.

Workflows adalah platform orkestrasi terkelola sepenuhnya yang menjalankan layanan sesuai urutan yang Anda tentukan: alur kerja. Alur kerja ini dapat menggabungkan layanan yang dihosting di Cloud Run atau Cloud Functions, layanan Google Cloud seperti Cloud Vision AI dan BigQuery, serta API berbasis HTTP apa pun.

Dalam codelab ini, Anda akan membangun orkestrasi microservice berbasis peristiwa untuk memproses image. Anda akan menggunakan Workflows untuk mengatur urutan, input, dan output 4 Cloud Functions pemrosesan gambar. Kemudian, Anda akan mengaktifkan orkestrasi untuk merespons peristiwa Cloud Storage dengan cara yang dikaitkan secara longgar dengan Eventarc.

Pada akhirnya, Anda akan mendapatkan arsitektur serverless yang terstruktur dan fleksibel untuk memproses image.

e372ceed8c26c5fb.png

Yang akan Anda pelajari

  • Ringkasan Eventarc dan Workflows
  • Cara men-deploy layanan Cloud Functions
  • Cara mengorkestrasi layanan menggunakan Workflows
  • Cara membuat Workflows merespons peristiwa Cloud Storage dengan Eventarc

2. Penyiapan dan Persyaratan

Penyiapan lingkungan mandiri

  1. Login ke Google Cloud Console dan buat project baru atau gunakan kembali project yang sudah ada. Jika belum memiliki akun Gmail atau Google Workspace, Anda harus membuatnya.

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

  • Project name adalah nama tampilan untuk peserta project ini. String ini adalah string karakter yang tidak digunakan oleh Google API. Anda dapat memperbaruinya kapan saja.
  • Project ID bersifat unik di semua project Google Cloud dan tidak dapat diubah (tidak dapat diubah setelah ditetapkan). Cloud Console otomatis membuat string unik; biasanya Anda tidak peduli tentang apa itu. Di sebagian besar codelab, Anda harus mereferensikan Project ID (biasanya diidentifikasi sebagai PROJECT_ID). Jika Anda tidak menyukai ID yang dihasilkan, Anda dapat membuat ID acak lainnya. Atau, Anda dapat mencobanya sendiri dan lihat apakah ID tersebut tersedia. ID tidak dapat diubah setelah langkah ini dan akan tetap ada selama durasi project.
  • Sebagai informasi, ada nilai ketiga, Project Number yang digunakan oleh beberapa API. Pelajari lebih lanjut ketiga nilai ini di dokumentasi.
  1. Selanjutnya, Anda harus mengaktifkan penagihan di Konsol Cloud untuk menggunakan resource/API Cloud. Menjalankan operasi dalam codelab ini seharusnya tidak memerlukan banyak biaya, bahkan mungkin tidak sama sekali. Untuk mematikan resource agar tidak menimbulkan penagihan di luar tutorial ini, Anda dapat menghapus resource yang dibuat atau menghapus seluruh project. Pengguna baru Google Cloud memenuhi syarat untuk mengikuti program Uji Coba Gratis senilai $300 USD.

Mulai Cloud Shell

Meskipun Google Cloud dapat dioperasikan dari jarak jauh menggunakan laptop Anda, dalam codelab ini, Anda akan menggunakan Google Cloud Shell, lingkungan command line yang berjalan di Cloud.

Dari Google Cloud Console, klik ikon Cloud Shell di toolbar kanan atas:

55efc1aaa7a4d3ad.png

Hanya perlu waktu beberapa saat untuk penyediaan dan terhubung ke lingkungan. Jika sudah selesai, Anda akan melihat tampilan seperti ini:

7ffe5cbb04455448.png

Mesin virtual ini berisi semua alat pengembangan yang Anda perlukan. Layanan ini menawarkan direktori beranda tetap sebesar 5 GB dan beroperasi di Google Cloud, sehingga sangat meningkatkan performa dan autentikasi jaringan. Semua pekerjaan Anda dalam codelab ini dapat dilakukan di browser. Anda tidak perlu menginstal apa pun.

Menyiapkan gcloud

Di Cloud Shell, tetapkan project ID dan region tempat Anda ingin men-deploy aplikasi. Simpan sebagai variabel PROJECT_ID dan REGION. Lihat lokasi Cloud Functions untuk region yang tersedia.

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

Mendapatkan kode sumber

Kode sumber aplikasi ada di folder processing-pipelines dari repo eventarc-samples.

Meng-clone repo:

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

Buka folder eventarc-samples/processing-pipelines:

cd eventarc-samples/processing-pipelines

3. Ringkasan arsitektur

Arsitektur aplikasi ini adalah sebagai berikut:

6aa6fbc7721dd6b6.pngS

  1. Gambar disimpan ke bucket input yang menghasilkan peristiwa pembuatan Cloud Storage.
  2. Peristiwa pembuatan Cloud Storage dibaca oleh Eventarc melalui pemicu Cloud Storage dan diteruskan ke Workflows sebagai CloudEvent.
  3. Pada langkah pertama dalam alur kerja, Filter, yang merupakan layanan Cloud Function, menggunakan Vision API untuk menentukan apakah gambar aman. Jika gambar aman, Workflows akan berlanjut ke langkah berikutnya.
  4. Pada langkah kedua dalam alur kerja, Labeler, layanan Cloud Function, mengekstrak label gambar dengan Vision API dan menyimpan label ke bucket output.
  5. Pada langkah ketiga, Resizer, layanan Cloud Function lainnya, mengubah ukuran gambar menggunakan ImageSharp dan menyimpan gambar yang telah diubah ukurannya ke bucket output.
  6. Pada langkah terakhir, Watermarker, layanan Cloud Function lainnya, menambahkan watermark label dari Labeler ke gambar yang diubah ukurannya menggunakan ImageSharp dan menyimpan gambar ke bucket output.

Aplikasi dipicu oleh peristiwa Cloud Storage, sehingga dijalankan berdasarkan peristiwa. Pemrosesan gambar terjadi dalam alur kerja, dan ini merupakan orkestrasi. Pada akhirnya, ini adalah orkestrasi berbasis peristiwa untuk arsitektur serverless yang fleksibel dan terstruktur untuk memproses gambar.

4. Membuat bucket

Membuat bucket input bagi pengguna untuk mengupload gambar dan bucket output untuk pipeline pemrosesan gambar guna menyimpan gambar yang diproses.

Jalankan perintah berikut di Cloud Shell:

REGION=us-central1
BUCKET1=$PROJECT_ID-images-input
BUCKET2=$PROJECT_ID-images-output

gsutil mb -l $REGION gs://$BUCKET1
gsutil mb -l $REGION gs://$BUCKET2

5. Men-deploy layanan filter

Mari kita mulai dengan men-deploy layanan yang pertama. Layanan Cloud Functions ini menerima informasi file dan bucket, menentukan apakah gambar aman dengan Vision API, dan menampilkan hasilnya.

Pertama, aktifkan layanan yang diperlukan untuk Cloud Functions gen2 dan Vision API:

gcloud services enable \
  artifactregistry.googleapis.com \
  cloudbuild.googleapis.com \
  cloudfunctions.googleapis.com \
  run.googleapis.com \
  vision.googleapis.com

Di dalam folder processing-pipelines tingkat teratas, deploy layanan:

SERVICE_NAME=filter

gcloud functions deploy $SERVICE_NAME \
  --gen2 \
  --allow-unauthenticated \
  --runtime dotnet3 \
  --trigger-http \
  --region=$REGION \
  --entry-point Filter.Function \
  --set-build-env-vars GOOGLE_BUILDABLE=image-v3/filter/csharp

Setelah fungsi di-deploy, tetapkan URL layanan dalam variabel, kita akan membutuhkannya nanti:

FILTER_URL=$(gcloud functions describe $SERVICE_NAME --region=$REGION --gen2 --format 'value(serviceConfig.uri)')

6. Men-deploy layanan pemberi label

Layanan Cloud Functions kedua menerima informasi file dan bucket, mengekstrak label gambar dengan Vision API, dan menyimpan label ke bucket output.

Di dalam folder processing-pipelines tingkat teratas, deploy layanan:

SERVICE_NAME=labeler

gcloud functions deploy $SERVICE_NAME \
  --gen2 \
  --allow-unauthenticated \
  --runtime dotnet3 \
  --trigger-http \
  --region=$REGION \
  --set-env-vars BUCKET=$BUCKET2 \
  --entry-point Labeler.Function \
  --set-build-env-vars GOOGLE_BUILDABLE=image-v2/labeler/csharp

Setelah fungsi di-deploy, tetapkan URL layanan dalam variabel, kita akan membutuhkannya nanti:

LABELER_URL=$(gcloud functions describe $SERVICE_NAME --region=$REGION --gen2 --format 'value(serviceConfig.uri)')

7. Men-deploy layanan pengubah ukuran

Layanan Cloud Functions ini menerima informasi file dan bucket, mengubah ukuran gambar menggunakan ImageSharp, dan menyimpan gambar ke bucket output.

Di dalam folder processing-pipelines tingkat teratas, deploy layanan:

SERVICE_NAME=resizer

gcloud functions deploy $SERVICE_NAME \
  --gen2 \
  --allow-unauthenticated \
  --runtime dotnet3 \
  --trigger-http \
  --region=$REGION \
  --set-env-vars BUCKET=$BUCKET2 \
  --entry-point Resizer.Function \
  --set-build-env-vars GOOGLE_BUILDABLE=image-v2/resizer/csharp \
  --timeout=120s

Perhatikan nilai timeout selama 2 menit agar fungsi pengubah ukuran memiliki waktu tambahan untuk diproses.

Setelah fungsi di-deploy, tetapkan URL layanan dalam variabel, kita akan membutuhkannya nanti:

RESIZER_URL=$(gcloud functions describe $SERVICE_NAME --region=$REGION --gen2 --format 'value(serviceConfig.uri)')

8. Men-deploy layanan watermark

Layanan Cloud Functions ini menerima informasi bucket, file, dan label, membaca file, menambahkan label sebagai watermark ke gambar menggunakan ImageSharp, dan menyimpan gambar ke bucket output.

Di dalam folder processing-pipelines tingkat teratas, deploy layanan:

SERVICE_NAME=watermarker

gcloud functions deploy $SERVICE_NAME \
  --gen2 \
  --allow-unauthenticated \
  --runtime dotnet3 \
  --trigger-http \
  --region=$REGION \
  --set-env-vars BUCKET=$BUCKET2 \
  --entry-point Watermarker.Function \
  --set-build-env-vars GOOGLE_BUILDABLE=image-v2/watermarker/csharp

Setelah fungsi di-deploy, tetapkan URL layanan dalam variabel, kita akan membutuhkannya nanti:

WATERMARKER_URL=$(gcloud functions describe $SERVICE_NAME --region=$REGION --gen2 --format 'value(serviceConfig.uri)')

Pada tahap ini, keempat Cloud Functions harus di-deploy dan dijalankan:

76a218568982c90c.pngS

9. Menentukan dan men-deploy alur kerja

Gunakan Workflows untuk menyatukan layanan filter, pemberi label, pengubah ukuran, dan watermark ke dalam sebuah alur kerja. Alur kerja akan mengatur pemanggilan layanan ini sesuai urutan dan dengan parameter yang kita tentukan.

Pertama, aktifkan layanan yang diperlukan untuk Workflows:

gcloud services enable \
  workflows.googleapis.com \
  workflowexecutions.googleapis.com

Definisikan

Workflows menerima CloudEvent sebagai parameter. Ini akan berasal dari Eventarc setelah kita membuat pemicu. Pada dua langkah pertama, Workflows akan mencatat peristiwa tersebut ke dalam log serta mengekstrak info file dan bucket dari peristiwa tersebut:

main:
  params: [event]
  steps:
  - log_event:
      call: sys.log
      args:
          text: ${event}
          severity: INFO
  - extract_bucket_and_file:
      assign:
      - bucket: ${event.data.bucket}
      - file: ${event.data.name}

Pada langkah filter, Workflows akan melakukan panggilan ke layanan filter yang telah kita deploy sebelumnya. Kemudian, Windows akan mencatat dan memeriksa keamanan file:

  - filter:
      call: http.post
      args:
        url: FILTER_URL # TODO: Replace
        auth:
          type: OIDC
        body:
            bucket: ${bucket}
            file: ${file}
      result: filterResponse
  - log_safety:
      call: sys.log
      args:
          text: ${filterResponse.body.safe}
          severity: INFO
  - check_safety:
      switch:
        - condition: ${filterResponse.body.safe == true}
          next: label
      next: end

Pada langkah label, Workflows akan melakukan panggilan ke layanan pemberi label dan mencatat respons (3 label teratas):

  - label:
      call: http.post
      args:
        url: LABELER_URL # TODO: Replace
        auth:
          type: OIDC
        body:
            bucket: ${bucket}
            file: ${file}
      result: labelResponse

Pada langkah resize, Workflows melakukan panggilan ke layanan pengubah ukuran dan mengambil respons (bucket dan file gambar yang diubah ukurannya):

  - resize:
      call: http.post
      args:
        url: RESIZER_URL # TODO: Replace
        auth:
          type: OIDC
        body:
            bucket: ${bucket}
            file: ${file}
      result: resizeResponse

Pada langkah watermark, Workflows akan memanggil layanan watermark dengan gambar dan label yang diubah ukurannya, lalu mengambil hasilnya (gambar yang diubah ukurannya dan diberi watermark):

  - watermark:
      call: http.post
      args:
        url: WATERMARKER_URL # TODO: Replace
        auth:
          type: OIDC
        body:
            bucket: ${resizeResponse.body.bucket}
            file: ${resizeResponse.body.file}
            labels: ${labelResponse.body.labels}
      result: watermarkResponse

Pada langkah final, Workflows akan menampilkan kode status HTTP dari layanan pemberi label, pengubah ukuran, dan watermark:

  - final:
      return:
        label: ${labelResponse.code}
        resize: ${resizeResponse.code}
        watermark: ${watermarkResponse.code}

Deploy

Sebelum men-deploy alur kerja, pastikan URL layanan diganti dengan URL fungsi yang di-deploy secara manual atau menggunakan sed:

Di dalam folder processing-pipelines tingkat teratas, buka folder image-v3 tempat file workflows.yaml berada:

cd image-v3/

Jalankan sed untuk mengganti URL placeholder dengan URL sebenarnya dari layanan yang di-deploy:

sed -i -e "s|FILTER_URL|${FILTER_URL}|" workflow.yaml
sed -i -e "s|LABELER_URL|${LABELER_URL}|" workflow.yaml
sed -i -e "s|RESIZER_URL|${RESIZER_URL}|" workflow.yaml
sed -i -e "s|WATERMARKER_URL|${WATERMARKER_URL}|" workflow.yaml

Deploy alur kerja:

WORKFLOW_NAME=image-processing

gcloud workflows deploy $WORKFLOW_NAME \
    --source=workflow.yaml \
    --location=$REGION

Dalam beberapa detik, Anda akan melihat alur kerja yang di-deploy di konsol:

92cf4e758bdc3dde.pngS

10. Buat pemicu

Setelah alur kerja di-deploy, langkah terakhir adalah menghubungkannya ke peristiwa Cloud Storage dengan pemicu Eventarc.

Penyiapan satu kali

Pertama, aktifkan layanan yang diperlukan untuk Eventarc:

gcloud services enable \
 eventarc.googleapis.com

Buat akun layanan yang akan Anda gunakan di pemicu Eventarc.

SERVICE_ACCOUNT=eventarc-trigger-imageproc-sa

gcloud iam service-accounts create $SERVICE_ACCOUNT \
  --display-name="Eventarc trigger image processing service account"

Berikan peran workflows.invoker agar akun layanan dapat digunakan untuk memanggil Workflows dari Eventarc:

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

Berikan peran eventarc.eventReceiver, akun layanan dapat digunakan di

Pemicu Cloud Storage:

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

Berikan peran pubsub.publisher ke akun layanan Cloud Storage. Tindakan ini diperlukan untuk pemicu Cloud Storage Eventarc:

STORAGE_SERVICE_ACCOUNT="$(gsutil kms serviceaccount -p $PROJECT_ID)"

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

Buat

Jalankan perintah berikut untuk membuat pemicu. Pemicu ini memfilter peristiwa pembuatan file baru dari bucket Cloud Storage input dan meneruskannya ke alur kerja yang telah kita tentukan sebelumnya:

TRIGGER_NAME=trigger-image-processing

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

Anda dapat melihat bahwa pemicu telah dibuat dan siap di bagian Eventarc di Konsol Cloud:

14330c4fa2451bc0.pngS

11. Menguji pipeline

Pipeline pemrosesan gambar siap menerima peristiwa dari Cloud Storage. Untuk menguji pipeline, upload gambar ke bucket input:

gsutil cp beach.jpg gs://$BUCKET1

Segera setelah mengupload gambar, Anda akan melihat eksekusi Workflows dalam status aktif:

36d07cb63c39e7d9.pngS

Setelah sekitar satu menit, Anda akan melihat eksekusi berhasil. Anda juga dapat melihat input dan output alur kerja:

229200c79d989c25.pngS

Jika mencantumkan konten bucket output, Anda akan melihat gambar yang diubah ukurannya dan diberi watermark serta label gambar:

gsutil ls gs://$BUCKET2

gs://$PROJECT_ID-images-output/beach-400x400-watermark.jpeg
gs://$PROJECT_ID-images-output/beach-400x400.png
gs://$PROJECT_ID-images-output/beach-labels.txt

Untuk memeriksa kembali, Anda dapat membuka gambar yang telah diubah ukurannya dan diberi watermark untuk melihat hasilnya:

75f3c0019ca842ce.jpeg

12. Selamat

Selamat, Anda telah menyelesaikan codelab!

Yang telah kita bahas

  • Ringkasan Eventarc dan Workflows
  • Cara men-deploy layanan Cloud Functions
  • Cara mengorkestrasi layanan menggunakan Workflows
  • Cara membuat Workflows merespons peristiwa Cloud Storage dengan Eventarc