1. Pengantar
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.
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
Buka https://gcpcredits.com/io2022, lalu klik tombol "Klik di sini untuk mengakses kredit Anda":
Pada dialog berikutnya, setujui persyaratan layanan dengan mengklik tombol "Setuju dan Lanjutkan":
Setelah menyetujui persyaratan layanan, Anda akan dialihkan ke halaman ringkasan penagihan yang menyertakan panel seperti ini di dekat pojok kanan bawah:
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:
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
- 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.
- 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.
- 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:
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 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:
- 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, 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.
- Pada langkah kedua alur kerja, Labeler, sebuah layanan Cloud Function, mengekstrak label gambar dengan Vision API dan menyimpan label ke dalam bucket output.
- Pada langkah ketiga, Resizer, layanan Cloud Function lain, mengubah ukuran gambar menggunakan ImageSharp dan menyimpan gambar yang diubah ukurannya ke bucket output.
- 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:
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:
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:
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:
Setelah sekitar satu menit, Anda akan melihat eksekusi berhasil. Anda juga dapat melihat input dan output alur kerja:
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:
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