1. Pengantar

Eventarc memudahkan Anda menghubungkan layanan Cloud Run dengan peristiwa dari berbagai sumber. Layanan ini memungkinkan Anda membangun arsitektur berbasis peristiwa yang microservicenya dikaitkan secara longgar dan didistribusikan. Layanan ini menangani penyerapan, pengiriman, keamanan, otorisasi, dan penanganan error untuk Anda.
Workflows adalah platform orkestrasi terkelola sepenuhnya yang mengeksekusi layanan dalam 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 gambar. Anda akan menggunakan Workflows untuk mengatur urutan, input, dan output dari 4 Cloud Functions pemrosesan gambar. Kemudian, Anda akan mengaktifkan orkestrasi untuk merespons peristiwa Cloud Storage secara longgar dengan Eventarc.
Pada akhirnya, Anda akan mendapatkan arsitektur serverless yang fleksibel namun terstruktur untuk memproses gambar.

Yang akan Anda pelajari
- Ringkasan Eventarc dan Workflows
- Cara men-deploy layanan Cloud Functions
- Cara melakukan orkestrasi layanan menggunakan Workflows
- Cara membuat Workflows merespons peristiwa Cloud Storage dengan Eventarc
2. Penyiapan dan Persyaratan
Penyiapan lingkungan mandiri
- 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.



- 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 mementingkan kata-katanya. Di sebagian besar codelab, Anda harus merujuk Project ID-nya (umumnya diidentifikasi sebagai
PROJECT_ID). Jika tidak suka dengan ID yang dibuat, 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 tersedia selama durasi project. - Sebagai informasi, ada nilai ketiga, Project Number, yang digunakan oleh beberapa API. Pelajari lebih lanjut ketiga nilai ini di dokumentasi.
- Selanjutnya, Anda harus mengaktifkan penagihan di Konsol Cloud untuk menggunakan resource/API Cloud. Menjalankan operasi dalam codelab ini tidak akan memakan banyak biaya, bahkan mungkin tidak sama sekali. Guna mematikan resource agar tidak menimbulkan penagihan di luar tutorial ini, Anda dapat menghapus resource yang dibuat atau menghapus project-nya. 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:

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

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 Anda dan region tempat Anda ingin men-deploy aplikasi. Simpan sebagai variabel PROJECT_ID dan REGION. Lihat Lokasi Cloud Functions untuk mengetahui 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 pada repositori 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 adalah sebagai berikut:

- Gambar disimpan ke bucket input yang menghasilkan peristiwa pembuatan Cloud Storage.
- Peristiwa pembuatan Cloud Storage dibaca oleh Eventarc melalui pemicu Cloud Storage dan diteruskan ke Workflows sebagai CloudEvent.
- Pada langkah pertama alur kerja, Filter, layanan Cloud Function, menggunakan Vision API untuk menentukan apakah gambar aman. Jika gambar aman, Alur Kerja akan melanjutkan ke langkah berikutnya.
- Pada langkah kedua alur kerja, Labeler, layanan Cloud Function, mengekstrak label gambar dengan Vision API dan menyimpan label ke bucket output.
- Pada langkah ketiga, Resizer, layanan Cloud Function lainnya, mengubah ukuran gambar menggunakan ImageSharp dan menyimpan gambar yang diubah ukurannya ke bucket output.
- 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 berbasis peristiwa. Pemrosesan gambar terjadi dalam alur kerja, sehingga merupakan orkestrasi. Pada akhirnya, ini adalah orkestrasi berbasis peristiwa untuk arsitektur serverless yang fleksibel namun terstruktur untuk memproses gambar.
4. Membuat bucket
Buat bucket input agar pengguna dapat mengupload gambar ke bucket tersebut dan bucket output agar pipeline pemrosesan gambar dapat menyimpan gambar yang telah diproses.
Jalankan perintah berikut di Cloud Shell:
REGION=us-central1 BUCKET1=$PROJECT_ID-images-input-$RANDOM BUCKET2=$PROJECT_ID-images-output-$RANDOM 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.
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 bucket dan 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 \ --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 bucket dan 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 \ --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 sebesar 2 menit untuk memberikan waktu tambahan bagi fungsi pengubah ukuran 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 pemberi 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 Function harus di-deploy dan berjalan:

9. Menentukan dan men-deploy alur kerja
Gunakan Workflows untuk menggabungkan layanan filter, pelabel, pengubah ukuran, dan pemberi tanda air ke dalam alur kerja. Workflows akan mengorkestrasikan panggilan layanan ini dalam urutan dan dengan parameter yang kita tentukan.
Pertama, aktifkan layanan yang diperlukan untuk Workflows:
gcloud services enable \ workflows.googleapis.com \ workflowexecutions.googleapis.com
Definisikan
Alur kerja menerima CloudEvent sebagai parameter. Ini akan berasal dari Eventarc setelah kita membuat pemicu. Dalam dua langkah pertama, Workflows mencatat peristiwa dan mengekstrak info bucket dan 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, Workflows melakukan panggilan ke layanan filter yang kita deploy sebelumnya. Kemudian, file tersebut akan dicatat dan diperiksa keamanannya:
- 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 melakukan panggilan ke layanan pelabel dan mengambil 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 memanggil layanan pemberi 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 menampilkan kode status HTTP dari layanan pelabel, pengubah ukuran, dan pemberi tanda air:
- 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 maupun 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:

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, sehingga 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, sehingga akun layanan dapat digunakan dalam
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. Hal 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 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 dibuat dan siap di bagian Eventarc pada Konsol Cloud:

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 Alur Kerja dalam status aktif:

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

Jika Anda mencantumkan isi bucket output, Anda akan melihat gambar yang diubah ukurannya, gambar yang diubah ukurannya dan diberi watermark, serta label gambar:
gsutil ls gs://$BUCKET2 gs://$PROJECT_ID-images-output-$RANDOM/beach-400x400-watermark.jpeg gs://$PROJECT_ID-images-output-$RANDOM/beach-400x400.png gs://$PROJECT_ID-images-output-$RANDOM/beach-labels.txt
Untuk memeriksa kembali, Anda dapat membuka gambar yang diubah ukurannya dan diberi watermark untuk melihat hasilnya:

12. Selamat
Selamat, Anda telah menyelesaikan codelab!
Yang telah kita bahas
- Ringkasan Eventarc dan Workflows
- Cara men-deploy layanan Cloud Functions
- Cara melakukan orkestrasi layanan menggunakan Workflows
- Cara membuat Workflows merespons peristiwa Cloud Storage dengan Eventarc