Eventarc ve Workflows ile etkinliğe dayalı bir düzenleme oluşturma

1. Giriş

cb762f29e9183a3f.png 1c05e3d0c2bd2b45.png a03f943ca09ac4c.png

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.

e372ceed8c26c5fb.png

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

  1. 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.

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

  • 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.
  1. 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:

55efc1aaa7a4d3ad.png

Ortamı sağlamak ve bağlamak yalnızca birkaç dakika sürer. Tamamlandığında şuna benzer bir sonuç görmeniz gerekir:

7ffe5cbb04455448

İ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:

6aa6fbc7721dd6b6.png

  1. Görüntü, Cloud Storage oluşturma etkinliği oluşturan bir giriş paketine kaydedilir.
  2. 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.
  3. İş 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.
  4. İş 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.
  5. Üçü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.
  6. 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:

76a218568982c90c.png

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:

92cf4e758bdc3dde.png

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:

14330c4fa2451bc0.png

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:

36d07cb63c39e7d9.png

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:

229200c79d989c25.png

Çı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:

75f3c0019ca842ce.jpeg

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