1. Pengantar
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.
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
- 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
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.
- 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:
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 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:
- 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 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.
- Pada langkah kedua dalam 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 telah 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 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:
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:
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:
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:
Setelah sekitar satu menit, Anda akan melihat eksekusi berhasil. Anda juga dapat melihat input dan output alur kerja:
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:
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