Membuat orkestrasi berdasarkan peristiwa dengan Eventarc dan Alur Kerja

1. Pengantar

cb762f29e9183a3f.png 1c05e3d0c2bd2b45.png a03f943ca09ac4c.png

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

Alur kerja adalah platform orkestrasi yang terkelola sepenuhnya yang menjalankan layanan dalam urutan yang Anda tetapkan: 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.

Dalam codelab ini, Anda akan membuat orkestrasi microservice yang dikelola peristiwa untuk memproses gambar. Anda akan menggunakan Alur Kerja untuk mengatur urutan, input, dan output dari 4 pemrosesan Cloud Functions. Selanjutnya, Anda akan mengaktifkan orkestrasi untuk merespons peristiwa Cloud Storage dengan cara yang dikaitkan secara longgar dengan Eventarc.

Pada akhirnya, Anda akan memiliki arsitektur tanpa server yang fleksibel dan terstruktur untuk memproses gambar.

e372ceed8c26c5fb.png

Yang akan Anda pelajari

  • Ringkasan Peristiwa dan Alur Kerja
  • Cara men-deploy layanan Cloud Functions
  • Cara mengatur layanan menggunakan Alur Kerja
  • Cara membuat Alur Kerja merespons peristiwa Cloud Storage dengan Eventarc

2. Penyiapan dan Persyaratan

Tukarkan Kredit

cae48e4b2e19921d.png

Pada dialog berikutnya, setujui persyaratan layanan dengan mengklik tombol "Setuju dan Lanjutkan":

27d87930a0daf2f8.png

Setelah menyetujui persyaratan layanan, Anda akan dialihkan ke halaman ringkasan penagihan yang menyertakan panel seperti ini di dekat pojok kanan bawah:

2076ea7aa9bf3f65.png

Terakhir, ketika membuat project pertama, Anda akan melihat dialog yang memungkinkan Anda menetapkan akun penagihan ke project Anda. Pilih akun penagihan yang terkait dengan kredit gratis Anda, lalu klik tombol buat:

dd3b0e795843296.png

Singkatnya, sekarang Anda memiliki akun penagihan dan project, dan kedua entity tersebut ditautkan sedemikian rupa sehingga semua pekerjaan yang Anda lakukan di codelab hari ini akan didanai oleh kredit gratis Anda**.**

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

  • Nama project adalah nama tampilan untuk peserta project ini. String ini adalah string karakter yang tidak digunakan oleh Google API, dan Anda dapat memperbaruinya kapan saja.
  • Project ID harus unik di semua project Google Cloud dan tidak dapat diubah (tidak dapat diubah setelah ditetapkan). Cloud Console otomatis menghasilkan string unik; biasanya Anda tidak peduli dengan kata-katanya. Pada sebagian besar codelab, Anda harus mereferensikan Project ID (dan biasanya diidentifikasi sebagai PROJECT_ID). Jadi, jika Anda tidak menyukainya, buat ID acak lain, atau, Anda dapat mencoba sendiri dan melihat apakah menyediakannya. Kemudian file akan "dibekukan" setelah project dibuat.
  • Ada nilai ketiga, Nomor Project yang digunakan oleh beberapa API. Pelajari lebih lanjut ketiga nilai ini di dokumentasi.
  1. Selanjutnya, Anda harus mengaktifkan penagihan di Cloud Console untuk menggunakan API/resource Cloud. Menjalankan operasi dalam codelab ini seharusnya tidak memerlukan banyak biaya, bahkan mungkin tidak sama sekali. Untuk menonaktifkan resource sehingga Anda tidak dikenai penagihan di luar tutorial ini, ikuti petunjuk "pembersihan" yang ada di akhir codelab. Pengguna baru Google Cloud memenuhi syarat untuk mengikuti program Uji Coba Gratis seharga$300 USD.

Mulai Cloud Shell

Meskipun Google Cloud dapat dioperasikan dari jarak jauh dari 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 berjalan di Google Cloud, sehingga sangat meningkatkan performa dan autentikasi jaringan. Semua pekerjaan Anda di lab ini dapat dilakukan hanya dengan browser.

Menyiapkan gcloud

Di Cloud Shell, tetapkan project ID dan region tujuan penerapan aplikasi. Simpan sebagai variabel PROJECT_ID dan REGION. Lihat lokasi Cloud Functions untuk mengetahui region yang tersedia.

PROJECT_ID=[YOUR-PROJECT-ID]
REGION=[YOUR-REGION]
gcloud config set core/project $PROJECT_ID
gcloud config set functions/region $REGION

Aktifkan layanan

Aktifkan semua layanan yang diperlukan:

gcloud services enable \
  artifactregistry.googleapis.com \
  cloudbuild.googleapis.com \
  cloudfunctions.googleapis.com \
  eventarc.googleapis.com \
  vision.googleapis.com \
  workflows.googleapis.com \
  workflowexecutions.googleapis.com

Mendapatkan kode sumber

Kode sumber aplikasi ada di folder processing-pipelines pada repositori eventarc-samples.

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 aplikasinya adalah sebagai berikut:

6aa6fbc7721dd6b6.png

  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 alur kerja, Filter, sebuah layanan Cloud Function, menggunakan Vision API untuk menentukan apakah gambar tersebut aman. Jika gambar tersebut aman, Alur Kerja akan berlanjut dengan langkah-langkah berikutnya.
  4. Pada langkah kedua alur kerja, Labeler, sebuah layanan Cloud Function, mengekstrak label gambar dengan Vision API dan menyimpan label ke dalam bucket output.
  5. Pada langkah ketiga, Resizer, layanan Cloud Function lain, mengubah ukuran gambar menggunakan ImageSharp dan menyimpan gambar yang diubah ukurannya ke bucket output.
  6. Pada langkah terakhir, WaterMarker, layanan Cloud Function lain, 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 didorong oleh peristiwa. Pemrosesan gambar dilakukan dalam alur kerja, karenanya itu adalah orkestrasi. Pada akhirnya, ini adalah orkestrasi yang didorong oleh peristiwa bagi arsitektur tanpa server yang fleksibel dan terstruktur untuk memproses gambar.

4. Membuat bucket

Buat bucket input bagi pengguna untuk mengupload gambar ke dan bucket output untuk pipeline pemrosesan gambar untuk menyimpan gambar yang diproses.

Jalankan perintah berikut di Cloud Shell:

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 pertama. Layanan Cloud Functions ini menerima informasi bucket dan file, menentukan apakah gambar aman dengan Vision API dan menampilkan hasilnya.

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

SERVICE_NAME=filter
gcloud functions deploy $SERVICE_NAME \
  --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 memerlukannya nanti:

FILTER_URL=$(gcloud functions describe $SERVICE_NAME --format 'value(httpsTrigger.url)')

6. Men-deploy layanan pemberi label

Layanan Cloud Functions kedua menerima bucket dan informasi file, 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 \
  --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 memerlukannya nanti:

LABELER_URL=$(gcloud functions describe $SERVICE_NAME --format 'value(httpsTrigger.url)')

7. Men-deploy layanan pengubah ukuran

Layanan Cloud Functions ini menerima bucket dan informasi file, 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 \
  --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

Setelah fungsi di-deploy, tetapkan URL layanan dalam variabel. Kita akan memerlukannya nanti:

RESIZER_URL=$(gcloud functions describe $SERVICE_NAME --format 'value(httpsTrigger.url)')

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 \
  --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 memerlukannya nanti:

WATERMARKER_URL=$(gcloud functions describe $SERVICE_NAME --format 'value(httpsTrigger.url)')

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

5d7d4061e04c91bb.png

9. Menentukan dan men-deploy alur kerja

Menggunakan Alur Kerja untuk menyatukan layanan filter, pemberi label, pengubah ukuran, dan watermark ke dalam alur kerja. Alur kerja akan mengatur panggilan ke layanan ini secara berurutan dan dengan parameter yang ditentukan.

Definisikan

Alur kerja menerima CloudEvent sebagai parameter. Ini akan berasal dari Eventarc setelah kita membuat pemicu. Pada dua langkah pertama, Alur Kerja mencatat peristiwa dan mengekstrak bucket dan info file dari peristiwa:

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, Alur Kerja melakukan panggilan ke layanan filter yang kita deploy sebelumnya. Kemudian, layanan mencatat log 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, Alur Kerja melakukan panggilan ke layanan pemberi label dan menangkap 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, Alur Kerja melakukan panggilan ke layanan pengubah ukuran dan menangkap 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, Alur Kerja memanggil layanan watermark dengan gambar dan label yang diubah ukurannya serta menangkap hasilnya (gambar yang diubah ukurannya dan 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, Alur Kerja 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 baik 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.png

10. Buat pemicu

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

Penyiapan satu kali

Akun layanan komputasi default akan digunakan untuk pemicu. Pastikan aplikasi tersebut memiliki peran eventarc.eventReceiver:

PROJECT_NUMBER=$(gcloud projects describe $PROJECT_ID --format='value(projectNumber)')

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

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

SERVICE_ACCOUNT="$(gsutil kms serviceaccount -p $PROJECT_NUMBER)"

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

Buat

Jalankan perintah berikut untuk membuat pemicu. Hal ini akan memicu filter untuk peristiwa pembuatan file baru dari bucket Cloud Storage input dan meneruskannya ke alur kerja yang kami tentukan sebelumnya:

TRIGGER_NAME=trigger-$WORKFLOW_NAME
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=$PROJECT_NUMBER-compute@developer.gserviceaccount.com

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

14330c4fa2451bc0.png

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 foto, Anda akan melihat eksekusi Alur Kerja dalam status aktif:

36d07cb63c39e7d9.png

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

229200c79d989c25.png

Jika Anda mencantumkan konten bucket output, Anda akan melihat gambar yang telah diubah ukurannya, gambar yang diubah ukurannya dan 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 diubah ukurannya dan watermark untuk melihat hasilnya:

75f3c0019ca842ce.jpeg

12. Selamat

Selamat, Anda telah menyelesaikan codelab!

Yang telah kita bahas

  • Ringkasan Peristiwa dan Alur Kerja
  • Cara men-deploy layanan Cloud Functions
  • Cara mengatur layanan menggunakan Alur Kerja
  • Cara membuat Alur Kerja merespons peristiwa Cloud Storage dengan Eventarc