1. Giriş
Eventarc, Cloud Run hizmetlerini çeşitli kaynaklardan gelen etkinliklere bağlamayı kolaylaştırır. Mikro hizmetlerin serbest bağlantılı olduğu ve dağıtıldığı etkinlik odaklı mimariler derlemenize olanak tanır. Etkinlik kullanımı, teslimi, güvenlik, yetkilendirme ve hata giderme gibi işleri sizin yerinize yapar.
İş akışları, hizmetleri sizin tanımladığınız bir iş akışı sırasına göre 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ı herhangi bir API'yi birleştirebilir.
Bu codelab'de, görüntüleri işlemek için mikro hizmetlerin etkinliğe dayalı bir düzenlemesini derleyeceksiniz. 4 görüntü işleme Cloud Functions'ın sırasını, girişlerini ve çıkışlarını düzenlemek için iş akışlarını kullanacaksınız. Ardından, etkinliği Eventarc ile sınırlı bir şekilde bağlantılı bir şekilde Cloud Storage etkinliklerine yanıt verecek şekilde düzenlemeyi etkinleştireceksiniz.
Sonuç olarak, görüntüleri işlemek için esnek ancak yapılandırılmış, sunucusuz bir mimariye sahip olursunuz.
Neler öğreneceksiniz?
- Eventarc'a ve iş akışlarına genel bakış
- Cloud Functions hizmetlerini dağıtma
- Workflows'u kullanarak hizmetleri düzenleme
- Workflows'un Eventarc ile 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çıp yeni bir proje oluşturun veya mevcut bir projeyi yeniden kullanın. Gmail veya Google Workspace hesabınız yoksa hesap 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. İstediğiniz zaman güncelleyebilirsiniz.
- Proje Kimliği, tüm Google Cloud projelerinde benzersizdir ve değiştirilemez (belirlendikten sonra değiştirilemez). Cloud Console, otomatik olarak benzersiz bir dize oluşturur. bunun ne olduğunu umursamıyorsunuz. Çoğu codelab'de proje kimliğini (genellikle
PROJECT_ID
olarak tanımlanır) referans almanız gerekir. Oluşturulan kimliği beğenmezseniz rastgele bir kimlik daha oluşturabilirsiniz. Alternatif olarak, kendi ölçümünüzü deneyip mevcut olup olmadığına bakabilirsiniz. Bu adımdan sonra değiştirilemez ve proje süresince kalır. - Bilginiz için bazı API'lerin kullandığı üçüncü bir değer, yani Proje Numarası daha vardır. Bu değerlerin üçü hakkında daha fazla bilgiyi belgelerde bulabilirsiniz.
- Sonraki adımda, Cloud kaynaklarını/API'lerini kullanmak için Cloud Console'da faturalandırmayı etkinleştirmeniz gerekir. Bu codelab'i çalıştırmanın maliyeti, yüksek değildir. Bu eğitim dışında faturalandırma yapılmaması için kaynakları kapatmak isterseniz oluşturduğunuz kaynakları silebilir veya projenin tamamını silebilirsiniz. Yeni Google Cloud kullanıcıları, 300 ABD doları değerindeki ücretsiz denemeden yararlanabilir.
Cloud Shell'i Başlatma
Google Cloud dizüstü bilgisayarınızdan uzaktan çalıştırılabilse de 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 bulunan Cloud Shell simgesini tıklayın:
Ortamı sağlamak ve bağlamak yalnızca birkaç dakika sürer. Tamamlandığında şuna benzer bir sonuç görmeniz gerekir:
İhtiyacınız olan tüm geliştirme araçlarını bu sanal makinede bulabilirsiniz. 5 GB boyutunda kalıcı bir ana dizin sunar ve Google Cloud üzerinde çalışarak ağ performansını ve kimlik doğrulamasını büyük ölçüde iyileştirir. Bu codelab'deki tüm çalışmalarınız tarayıcıda yapılabilir. Herhangi bir şey yüklemeniz gerekmez.
gcloud'u kurun
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ılabilen bölgeler için Cloud Functions konumları sayfasına göz atı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 şu şekildedir:
- Görüntü, Cloud Storage oluşturma etkinliği oluşturan bir giriş paketine kaydedilir.
- Cloud Storage oluşturma etkinliği, bir Cloud Storage tetikleyicisi aracılığıyla Eventarc tarafından okunur ve Workflows'a CloudEvent olarak aktarılır.
- İş akışının ilk adımında bir Cloud Functions hizmeti olan Filter, görüntünün güvenli olup olmadığını belirlemek için Vision API'yi kullanıyor. Görüntü güvenliyse İş akışları sonraki adımlarla devam eder.
- İş akışının ikinci adımında, bir Cloud Functions hizmeti olan Etiketleyici, Vision API ile görüntünün etiketlerini ayıklar ve etiketleri çıkış paketine kaydeder.
- Üçüncü adımda (Yeniden Boyutlandırıcı) başka bir Cloud Functions işlevi hizmeti, ImageSharp'ı kullanarak resmi yeniden boyutlandırır ve yeniden boyutlandırılan resmi çıkış paketine kaydeder.
- Son adımda, başka bir Cloud Functions işlevi hizmeti olan Watermarker, ImageSharp'ı kullanarak yeniden boyutlandırılan görüntüye Etiketleyici'den bir etiket filigranı ekliyor ve resmi çıkış paketine kaydediyor.
Uygulama bir Cloud Storage etkinliği tarafından tetiklendiğinden etkinliğe dayalı bir etkinliktir. Görüntülerin işlenmesi bir iş akışı içinde gerçekleştiğinden bir düzenlemedir. Sonuç olarak bu, görüntüleri işlemek için esnek ancak yapılandırılmış sunucusuz bir mimari için etkinlik odaklı bir düzenlemedir.
4. Paket oluşturma
Kullanıcıların görüntüleri yükleyebileceği bir giriş paketi ve işlenen görüntüleri kaydetmek için görüntü işleme ardışık düzeni için 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 BUCKET2=$PROJECT_ID-images-output gsutil mb -l $REGION gs://$BUCKET1 gsutil mb -l $REGION gs://$BUCKET2
5. Filtre hizmetini dağıtın
İlk hizmeti dağıtarak başlayalım. Bu Cloud Functions hizmeti, paket ve dosya bilgilerini alır, resmin Vision API ile güvenli olup olmadığını belirler ve sonucu döndürür.
İlk olarak, 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
Üst düzey processing-pipelines
klasöründe 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şkende ayarlayın. Daha sonra bu URL'ye ihtiyacımız olacaktır:
FILTER_URL=$(gcloud functions describe $SERVICE_NAME --region=$REGION --gen2 --format 'value(serviceConfig.uri)')
6. Etiketleyici hizmeti dağıtın
İkinci Cloud Functions hizmeti paket ve dosya bilgilerini alır, Vision API ile görüntünün etiketlerini ayıklar ve etiketleri çıkış paketine kaydeder.
Üst düzey processing-pipelines
klasöründe 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şkende ayarlayın. Daha sonra bu URL'ye ihtiyacımız olacaktır:
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 resmi çıkış paketine kaydeder.
Üst düzey processing-pipelines
klasöründe 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şlemesi için ek süre tanımak amacıyla 2 dakikalık timeout
değerini not edin.
İşlev dağıtıldıktan sonra hizmet URL'sini bir değişkende ayarlayın. Daha sonra bu URL'ye ihtiyacımız olacaktır:
RESIZER_URL=$(gcloud functions describe $SERVICE_NAME --region=$REGION --gen2 --format 'value(serviceConfig.uri)')
8. Filigran hizmetini dağıtın
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.
Üst düzey processing-pipelines
klasöründe 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şkende ayarlayın. Daha sonra bu URL'ye ihtiyacımız olacaktır:
WATERMARKER_URL=$(gcloud functions describe $SERVICE_NAME --region=$REGION --gen2 --format 'value(serviceConfig.uri)')
Bu noktada dört Cloud Functions işlevinin de dağıtılması ve çalıştırılması gerekir:
9. İş akışını tanımlama ve dağıtma
Filtre, etiketleyici, yeniden boyutlandırma ve filigran hizmetlerini iş akışı içinde bir araya getirmek için iş akışlarını kullanın. İş akışları, bu hizmetlerin çağrıldığı sırayla ve tanımladığımız parametrelerle düzenlenir.
İlk olarak İş akışları için gerekli hizmetleri etkinleştirin:
gcloud services enable \ workflows.googleapis.com \ workflowexecutions.googleapis.com
Tanımla
İş akışları, parametre olarak bir CloudEvent alır. Tetikleyici oluşturulduktan sonra bu etkinlik, Eventarc'tan gelir. İlk iki adımda İş akışları etkinliği günlüğe kaydeder ve etkinlikten paket ve 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. Daha sonra günlüğe kaydeder ve dosya güvenliğini 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 çağrı yapar ve yanıtı yakalar (ilk 3 etiket):
- 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 çağrı yapar ve yanıtı (yeniden boyutlandırılan resmin paketi ve dosyası) 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 Workflows, yeniden boyutlandırılan resim ve etiketlerle filigran hizmetini çağırır ve sonucu (yeniden boyutlandırılan 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 İş akışları etiketleyici, yeniden boyutlandırma ve filigran 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:
Üst düzey 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öreceksiniz:
10. Tetikleyici oluştur
İş akışını dağıttığınıza göre son adım, iş akışını bir Eventarc tetikleyicisi kullanarak Cloud Storage etkinliklerine bağlamaktır.
Bir defalık kurulum
İlk olarak 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 iş akışlarını çağırmak için kullanılabilmesi için 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; 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 paketinden yeni dosya oluşturma etkinlikleri için filtre uygular 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
Cloud Console'un Eventarc bölümünde tetikleyicinin oluşturulduğunu ve hazır olduğunu görebilirsiniz:
11. Ardışık düzeni test etme
Görüntü işleme ardışık düzeni, Cloud Storage'dan etkinlik almaya hazır. Ardışık düzeni test etmek için giriş paketine bir görüntü yükleyin:
gsutil cp beach.jpg gs://$BUCKET1
Resmi yükler yüklemez etkin durumda bir Workflows yürütmesi görürsünüz:
Yaklaşık bir dakika sonra yürütmenin başarılı olduğunu görürsünüz. İş akışının girişini ve çıkışını da görebilirsiniz:
Çıkış grubunun içeriğini listelerseniz yeniden boyutlandırılan resmi, yeniden boyutlandırılan ve filigranlı resmi ve resmin etiketlerini görürsünüz:
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
Tekrar kontrol etmek için yeniden boyutlandırılan ve filigranlı resmi açarak sonucu görebilirsiniz:
12. Tebrikler
Tebrikler, codelab'i tamamladınız.
İşlediğimiz konular
- Eventarc'a ve iş akışlarına genel bakış
- Cloud Functions hizmetlerini dağıtma
- Workflows'u kullanarak hizmetleri düzenleme
- Workflows'un Eventarc ile Cloud Storage etkinliklerine yanıt vermesini sağlama