1. Giriş

Eventarc, Cloud Run hizmetlerini çeşitli kaynaklardaki etkinliklere bağlamayı kolaylaştırır. Mikro hizmetlerin gevşek bağlantılı ve dağıtılmış olduğu etkinlik odaklı mimariler oluşturmanıza olanak tanır. Etkinlik alımı, teslimi, güvenliği, yetkilendirme ve hata işleme işlemlerini sizin için gerçekleştirir.
Workflows, hizmetleri tanımladığınız sırayla (iş akışı) yürüten, tümüyle yönetilen bir düzenleme platformudur. Bu iş akışları, Cloud Run veya Cloud Functions'da barındırılan hizmetleri, Cloud Vision AI ve BigQuery gibi Google Cloud hizmetlerini ve HTTP tabanlı tüm API'leri birleştirebilir.
Bu codelab'de, görüntüleri işlemek için mikro hizmetlerin etkinliğe dayalı bir düzenlemesini oluşturacaksınız. 4 görüntü işleme Cloud Functions işlevinin sırasını, girişlerini ve çıkışlarını düzenlemek için Workflows'u kullanacaksınız. Ardından, Eventarc ile gevşek bağlı bir şekilde Cloud Storage etkinliklerine yanıt vermek için orkestrasyonu etkinleştirirsiniz.
Sonuç olarak, görüntüleri işlemek için esnek ancak yapılandırılmış bir sunucusuz mimari elde edersiniz.

Neler öğreneceksiniz?
- Eventarc ve Workflows'a genel bakış
- Cloud Functions hizmetlerini dağıtma
- İş akışlarını kullanarak hizmetleri düzenleme
- Eventarc ile iş akışlarının Cloud Storage etkinliklerine yanıt vermesini sağlama
2. Kurulum ve Gereksinimler
Kendi hızınızda ortam kurulumu
- Google Cloud Console'da oturum açın ve yeni bir proje oluşturun veya mevcut bir projeyi yeniden kullanın. Gmail veya Google Workspace hesabınız yoksa oluşturmanız gerekir.



- Proje adı, bu projenin katılımcıları için görünen addır. Google API'leri tarafından kullanılmayan bir karakter dizesidir. Dilediğiniz zaman güncelleyebilirsiniz.
- Proje kimliği, tüm Google Cloud projelerinde benzersizdir ve sabittir (ayarlandıktan sonra değiştirilemez). Cloud Console, benzersiz bir dizeyi otomatik olarak oluşturur. Genellikle bu dizenin ne olduğuyla ilgilenmezsiniz. Çoğu codelab'de proje kimliğinize (genellikle
PROJECT_IDolarak tanımlanır) başvurmanız gerekir. Oluşturulan kimliği beğenmezseniz başka bir rastgele kimlik oluşturabilirsiniz. Dilerseniz kendi adınızı deneyerek kullanılabilir olup olmadığını kontrol edebilirsiniz. Bu adım tamamlandıktan sonra değiştirilemez ve proje süresince geçerli kalır. - Bazı API'lerin kullandığı üçüncü bir değer olan Proje Numarası da vardır. Bu üç değer hakkında daha fazla bilgiyi belgelerde bulabilirsiniz.
- Ardından, Cloud kaynaklarını/API'lerini kullanmak için Cloud Console'da faturalandırmayı etkinleştirmeniz gerekir. Bu codelab'i tamamlamak size çok fazla zaman kaybettirmez. Bu eğitimin ötesinde faturalandırılmayı önlemek için kaynakları kapatmak üzere oluşturduğunuz kaynakları veya projeyi silebilirsiniz. Yeni Google Cloud kullanıcıları 300 ABD doları değerinde ücretsiz deneme programından yararlanabilir.
Cloud Shell'i Başlatma
Google Cloud, dizüstü bilgisayarınızdan uzaktan çalıştırılabilir. Ancak bu codelab'de, Cloud'da çalışan bir komut satırı ortamı olan Google Cloud Shell'i kullanacaksınız.
Google Cloud Console'da sağ üstteki araç çubuğunda Cloud Shell simgesini tıklayın:

Ortamın temel hazırlığı ve bağlanması yalnızca birkaç dakikanızı alır. İşlem tamamlandığında aşağıdakine benzer bir sonuç görürsünüz:

Bu sanal makine, ihtiyaç duyacağınız tüm geliştirme araçlarını içerir. 5 GB boyutunda kalıcı bir ana dizin sunar ve Google Cloud üzerinde çalışır. Bu sayede ağ performansı ve kimlik doğrulama önemli ölçüde güçlenir. Bu codelab'deki tüm çalışmalarınızı tarayıcıda yapabilirsiniz. Herhangi bir şey yüklemeniz gerekmez.
gcloud'u ayarlama
Cloud Shell'de proje kimliğinizi ve uygulamanızı dağıtmak istediğiniz bölgeyi ayarlayın. Bunları PROJECT_ID ve REGION değişkenleri olarak kaydedin. Kullanılabilir bölgeler için Cloud Functions konumları konusuna bakın.
PROJECT_ID=your-project-id gcloud config set project $PROJECT_ID
Kaynak kodunu alma
Uygulamanın kaynak kodu, eventarc-samples deposunun processing-pipelines klasöründedir.
Kod deposunu klonlayın:
git clone https://github.com/GoogleCloudPlatform/eventarc-samples.git
eventarc-samples/processing-pipelines klasörüne gidin:
cd eventarc-samples/processing-pipelines
3. Mimariye genel bakış
Uygulamanın mimarisi aşağıdaki gibidir:

- Bir resim, Cloud Storage oluşturma etkinliği oluşturan bir giriş paketine kaydedilir.
- Cloud Storage oluşturma etkinliği, Cloud Storage tetikleyicisi aracılığıyla Eventarc tarafından okunur ve CloudEvent olarak Workflows'a iletilir.
- İş akışının ilk adımında, Filtrele adlı Cloud Functions hizmeti, görüntünün güvenli olup olmadığını belirlemek için Vision API'yi kullanır. Resim güvenliyse İş Akışları sonraki adımlarla devam eder.
- İş akışının ikinci adımında, bir Cloud Functions hizmeti olan Labeler, Vision API ile görüntünün etiketlerini çıkarır ve etiketleri çıkış paketine kaydeder.
- Üçüncü adımda, başka bir Cloud Functions hizmeti olan Resizer, ImageSharp'ı kullanarak görüntüyü yeniden boyutlandırır ve yeniden boyutlandırılan görüntüyü çıkış paketine kaydeder.
- Son adımda, başka bir Cloud Functions hizmeti olan Watermarker, ImageSharp'ı kullanarak Labeler'daki etiketlerin filigranını yeniden boyutlandırılan resme ekler ve resmi çıkış paketine kaydeder.
Uygulama, Cloud Storage etkinliği tarafından tetiklendiği için etkinliğe dayalıdır. Görüntülerin işlenmesi bir iş akışında gerçekleştiği için düzenleme olarak kabul edilir. Sonuç olarak, görüntüleri işlemek için esnek ancak yapılandırılmış bir sunucusuz mimari için etkinlik odaklı bir düzenleme elde edilir.
4. Paket oluşturma
Kullanıcıların resimleri yükleyeceği bir giriş paketi ve görüntü işleme ardışık düzeninin işlenen resimleri kaydedeceği bir çıkış paketi oluşturun.
Cloud Shell'de aşağıdaki komut satırını çalıştırın:
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. Filtre hizmetini dağıtma
İlk hizmeti dağıtarak başlayalım. Bu Cloud Functions hizmeti, paket ve dosya bilgilerini alır, Vision API ile görüntünün güvenli olup olmadığını belirler ve sonucu döndürür.
Öncelikle Cloud Functions 2. nesil ve Vision API için gerekli hizmetleri etkinleştirin:
gcloud services enable \ artifactregistry.googleapis.com \ cloudbuild.googleapis.com \ cloudfunctions.googleapis.com \ run.googleapis.com \ vision.googleapis.com
En üst düzey processing-pipelines klasörün içinde hizmeti dağıtın:
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
İşlev dağıtıldıktan sonra hizmet URL'sini bir değişkene ayarlayın. Bu URL'ye daha sonra ihtiyacımız olacak:
FILTER_URL=$(gcloud functions describe $SERVICE_NAME --region=$REGION --gen2 --format 'value(serviceConfig.uri)')
6. Etiketleme hizmetini dağıtma
İkinci Cloud Functions hizmeti, paket ve dosya bilgilerini alır, Vision API ile görüntünün etiketlerini çıkarır ve etiketleri çıkış paketine kaydeder.
En üst düzey processing-pipelines klasörün içinde hizmeti dağıtın:
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
İşlev dağıtıldıktan sonra hizmet URL'sini bir değişkene ayarlayın. Bu URL'ye daha sonra ihtiyacımız olacak:
LABELER_URL=$(gcloud functions describe $SERVICE_NAME --region=$REGION --gen2 --format 'value(serviceConfig.uri)')
7. Yeniden boyutlandırma hizmetini dağıtma
Bu Cloud Functions hizmeti, paket ve dosya bilgilerini alır, ImageSharp kullanarak görüntüyü yeniden boyutlandırır ve görüntüyü çıkış paketine kaydeder.
En üst düzey processing-pipelines klasörün içinde hizmeti dağıtın:
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
Yeniden boyutlandırma işlevinin işleme için ek süre tanıması amacıyla timeout değerinin 2 dakika olduğunu unutmayın.
İşlev dağıtıldıktan sonra hizmet URL'sini bir değişkene ayarlayın. Bu URL'ye daha sonra ihtiyacımız olacak:
RESIZER_URL=$(gcloud functions describe $SERVICE_NAME --region=$REGION --gen2 --format 'value(serviceConfig.uri)')
8. Filigran hizmetini dağıtma
Bu Cloud Functions hizmeti, paket, dosya ve etiket bilgilerini alır, dosyayı okur, ImageSharp kullanarak etiketleri resme filigran olarak ekler ve resmi çıkış paketine kaydeder.
En üst düzey processing-pipelines klasörün içinde hizmeti dağıtın:
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
İşlev dağıtıldıktan sonra hizmet URL'sini bir değişkene ayarlayın. Bu URL'ye daha sonra ihtiyacımız olacak:
WATERMARKER_URL=$(gcloud functions describe $SERVICE_NAME --region=$REGION --gen2 --format 'value(serviceConfig.uri)')
Bu noktada, dört Cloud Functions işlevinin tümü dağıtılmış ve çalışıyor olmalıdır:

9. İş akışını tanımlama ve dağıtma
Filtre, etiketleyici, yeniden boyutlandırıcı ve filigran hizmetlerini tek bir iş akışında bir araya getirmek için Workflows'u kullanın. Workflows, bu hizmetleri tanımladığımız sırayla ve parametrelerle çağırmayı düzenler.
İlk olarak, İş Akışları için gerekli hizmetleri etkinleştirin:
gcloud services enable \ workflows.googleapis.com \ workflowexecutions.googleapis.com
Tanımla
Workflows, parametre olarak bir CloudEvent alır. Bu, bir tetikleyici oluşturduğumuzda Eventarc'tan gelir. İşlemin ilk iki adımında İş Akışları, etkinliği günlüğe kaydeder ve etkinlikten paket ile dosya bilgilerini ayıklar:
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}
filter adımında İş Akışları, daha önce dağıttığımız filtre hizmetine bir çağrı yapar. Ardından, dosya güvenliğini günlüğe kaydeder ve kontrol eder:
- 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
label adımında İş Akışları, etiketleyici hizmetine bir çağrı yapar ve yanıtı (ilk 3 etiket) yakalar:
- label:
call: http.post
args:
url: LABELER_URL # TODO: Replace
auth:
type: OIDC
body:
bucket: ${bucket}
file: ${file}
result: labelResponse
resize adımında İş Akışları, yeniden boyutlandırma hizmetine bir çağrı yapar ve yanıtı (yeniden boyutlandırılmış resmin bulunduğu paket ve dosya) yakalar:
- resize:
call: http.post
args:
url: RESIZER_URL # TODO: Replace
auth:
type: OIDC
body:
bucket: ${bucket}
file: ${file}
result: resizeResponse
watermark adımında İş Akışları, yeniden boyutlandırılmış resim ve etiketlerle filigran hizmetini çağırır ve sonucu (yeniden boyutlandırılmış ve filigranlı resim) yakalar:
- 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
final adımında, iş akışları etiketleyici, yeniden boyutlandırıcı ve filigranlayıcı hizmetlerinden HTTP durum kodunu döndürür:
- final:
return:
label: ${labelResponse.code}
resize: ${resizeResponse.code}
watermark: ${watermarkResponse.code}
Dağıt
İş akışını dağıtmadan önce, hizmet URL'lerinin dağıtılan işlevlerin URL'leriyle manuel olarak veya sed kullanılarak değiştirildiğinden emin olun:
En üst düzeydeki processing-pipelines klasöründe, workflows.yaml dosyasının bulunduğu image-v3 klasörüne gidin:
cd image-v3/
Yer tutucu URL'leri dağıtılan hizmetlerin gerçek URL'leriyle değiştirmek için sed komutunu çalıştırın:
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
İş akışını dağıtın:
WORKFLOW_NAME=image-processing
gcloud workflows deploy $WORKFLOW_NAME \
--source=workflow.yaml \
--location=$REGION
Birkaç saniye içinde iş akışının konsolda dağıtıldığını görmeniz gerekir:

10. Tetikleyici oluştur
İş akışı dağıtıldığına göre son adım, Eventarc tetikleyicisiyle Cloud Storage etkinliklerine bağlamaktır.
Bir defalık kurulum
Öncelikle Eventarc için gerekli hizmetleri etkinleştirin:
gcloud services enable \ eventarc.googleapis.com
Eventarc tetikleyicisinde kullanacağınız bir hizmet hesabı oluşturun.
SERVICE_ACCOUNT=eventarc-trigger-imageproc-sa gcloud iam service-accounts create $SERVICE_ACCOUNT \ --display-name="Eventarc trigger image processing service account"
Hizmet hesabının Eventarc'tan Workflows'u çağırmak için kullanılabilmesi amacıyla workflows.invoker rolünü verin:
gcloud projects add-iam-policy-binding $PROJECT_ID \ --role roles/workflows.invoker \ --member serviceAccount:$SERVICE_ACCOUNT@$PROJECT_ID.iam.gserviceaccount.com
eventarc.eventReceiver rolünü verin. Böylece hizmet hesabı,
Cloud Storage tetikleyicisi:
gcloud projects add-iam-policy-binding $PROJECT_ID \ --role roles/eventarc.eventReceiver \ --member serviceAccount:$SERVICE_ACCOUNT@$PROJECT_ID.iam.gserviceaccount.com
Cloud Storage hizmet hesabına pubsub.publisher rolünü verin. Bu, Eventarc'ın Cloud Storage tetikleyicisi için gereklidir:
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
Oluştur
Tetikleyici oluşturmak için aşağıdaki komutu çalıştırın. Bu tetikleyici, giriş Cloud Storage paketindeki yeni dosya oluşturma etkinliklerini filtreler ve bunları daha önce tanımladığımız iş akışına iletir:
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
Tetikleyicinin oluşturulduğunu ve hazır olduğunu Cloud Console'un Eventarc bölümünde görebilirsiniz:

11. Ardışık düzeni test etme
Görüntü işleme ardışık düzeni, Cloud Storage'dan etkinlik almaya hazırdır. İşlem hattını test etmek için giriş paketine bir resim yükleyin:
gsutil cp beach.jpg gs://$BUCKET1
Resmi yüklediğiniz anda, etkin durumda bir iş akışı yürütme işlemi görmeniz gerekir:

Bir dakika sonra yürütmenin başarılı olduğunu görürsünüz. İş akışının giriş ve çıkışını da görebilirsiniz:

Çıkış paketinin içeriğini listelerseniz yeniden boyutlandırılmış resmi, yeniden boyutlandırılmış ve filigranlı resmi ve resmin etiketlerini görürsünüz:
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
Sonucu görmek için yeniden boyutlandırılmış ve filigranlı resmi açarak kontrol edebilirsiniz:

12. Tebrikler
Tebrikler, codelab'i tamamladınız.
İşlediğimiz konular
- Eventarc ve Workflows'a genel bakış
- Cloud Functions hizmetlerini dağıtma
- İş akışlarını kullanarak hizmetleri düzenleme
- Eventarc ile iş akışlarının Cloud Storage etkinliklerine yanıt vermesini sağlama