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

1. Giriş

f2f35f5c40b91a3c.png c637dcc97f298e7e.png c4a9d5b95f111710.png

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.

b75a14a4268cbe73.png

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

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

295004821bab6a87.png

37d264871000675d.png

96d86d3d5655cdbe.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. 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_ID olarak 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.
  1. 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:

Cloud Shell'i etkinleştirme

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:

Ortamın bağlandığını gösteren Google Cloud Shell terminalinin ekran görüntüsü

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:

7b810e1505054c0c.png

  1. Bir resim, Cloud Storage oluşturma etkinliği oluşturan bir giriş paketine kaydedilir.
  2. Cloud Storage oluşturma etkinliği, Cloud Storage tetikleyicisi aracılığıyla Eventarc tarafından okunur ve CloudEvent olarak Workflows'a iletilir.
  3. İş 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.
  4. İş 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.
  5. Üçü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.
  6. 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:

fe662925cb0121e9.png

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:

a5f537f2b3f3bd3.png

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:

a5f4301863d7d9e4.png

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:

2c914341950b5fde.png

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:

9abba6c28c51a9b5.png

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

46d375cb05a8aae4.jpeg

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