Günlük resim: Laboratuvar 6: İş akışlarıyla düzenleme

1. Genel Bakış

Önceki laboratuvarlarda, Resim Analizi hizmeti için Google Cloud Storage'ın, Cloud Run'ı tetikleyen bir Google Cloud Functions işlevi kullanan, GCS'nin Küçük Resim hizmeti için Pub/Sub ve Cloud Run'da Görüntü Ayı Toplayıcı hizmeti ile Eventarc'ı tetikleyen Cloud Run container'ını kullanan günlük Pic-a-günlük uygulamasının etkinliğe dayalı bir sürümünü derlediniz. Ayrıca Cloud Scheduler tarafından tetiklenen bir Kolaj hizmeti de vardı:

d93345bfc235f81e.png

Bu laboratuvarda, uygulamanın düzenlenmiş bir sürümünü oluşturacaksınız. Sistem üzerinden geçen farklı etkinlik türleri yerine, hizmetleri aşağıdaki şekilde düzenlemek ve çağırmak için iş akışlarını kullanacaksınız:

b763efcbf5589747.png

Neler öğreneceksiniz?

  • App Engine
  • Cloud Firestore
  • Cloud Functions
  • Cloud Run
  • İş akışları

2. Kurulum ve Gereksinimler

Kendi hızınızda ortam kurulumu

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

96a9c957bc475304.png

b9a10ebdf5b5a448.png

a1e3c01a38fa61c2.png

Tüm Google Cloud projelerinde benzersiz bir ad olan proje kimliğini unutmayın (yukarıdaki ad zaten alınmış ve size uygun olmayacaktır!). Bu kod laboratuvarın ilerleyen bölümlerinde PROJECT_ID olarak adlandırılacaktır.

  1. Sonraki adımda, Google Cloud kaynaklarını kullanmak için Cloud Console'da faturalandırmayı etkinleştirmeniz gerekir.

Bu codelab'i çalıştırmanın maliyeti, yüksek değildir. "Temizleme" bölümündeki talimatları izlediğinizden emin olun. bölümünde, bu eğiticinin dışında faturalandırmayla karşılaşmamanız için kaynakları nasıl kapatacağınız konusunda tavsiyelerde bulunuyoruz. 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.

GCP Console'da, sağ üstteki araç çubuğunda yer alan Cloud Shell simgesini tıklayın:

bce75f34b2c53987.png

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

f6ef2b5f13479f3a.png

İ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 laboratuvardaki tüm çalışmalarınızı yalnızca bir tarayıcıyla yapabilirsiniz.

3. İş akışlarına giriş

90fcd42d556e310e.jpeg

Bir dizi sunucusuz görevi tanımladığınız bir sırayla birbirine bağlayan sunucusuz iş akışları oluşturmak için İş akışlarını kullanabilirsiniz. Esnek sunucusuz uygulamalar oluşturmak için Google Cloud API'lerinin, Cloud Functions ve Cloud Run gibi sunucusuz ürünlerin ve harici API çağrılarının gücünü birleştirebilirsiniz.

Bir düzenleyiciden bekleyebileceğiniz gibi Workflows, iş mantığınızın akışını YAML/JSON tabanlı bir iş akışı tanımlama dilinde tanımlamanıza olanak tanır ve bu akışları tetiklemek için bir Workflows Execution API ve Workflows kullanıcı arayüzü sağlar.

Bu yerleşik ve yapılandırılabilir özelliklerle yalnızca bir düzenleyiciden daha fazlasını sunar:

  • Adımların güvenilir bir şekilde yürütülmesi için adımlar arasında esnek yeniden deneme ve hata işleme.
  • Yapışkan koddan kaçınmak için adımlar arasında JSON ayrıştırma ve değişken geçişi.
  • Kararlar için ifade formülleri, koşullu adım yürütmeye izin verir.
  • Modüler ve yeniden kullanılabilir iş akışları için alt iş akışları.
  • Harici hizmetler için verilen destek, hizmetlerin Google Cloud dışında da düzenlenmesini sağlar.
  • Güvenli adım yürütme işlemleri için Google Cloud ve harici hizmetler için kimlik doğrulama desteği.
  • Daha kolay entegrasyon için Pub/Sub, Firestore, Görevler ve Secret Manager gibi Google Cloud hizmetlerine yönelik bağlayıcılar.

Workflows, tümüyle yönetilen, sunucusuz bir üründür. Yapılandırma veya ölçeklendirme gerekmez ve yalnızca kullandığınız kadar ödeme yaparsınız.

4. API'leri etkinleştir

Bu laboratuvarda, Cloud Functions ve Cloud Run hizmetlerini iş akışlarıyla bağlayacaksınız. App Engine, Cloud Build, Vision API ve diğer hizmetleri de kullanacaksınız.

Cloud Shell'de gerekli tüm hizmetlerin etkinleştirildiğinden emin olun:

gcloud services enable \
  appengine.googleapis.com \
  cloudbuild.googleapis.com \
  cloudfunctions.googleapis.com \
  compute.googleapis.com \
  firestore.googleapis.com \
  run.googleapis.com \
  vision.googleapis.com \
  workflows.googleapis.com \

Bir süre sonra işlemin başarıyla tamamlandığını göreceksiniz:

Operation "operations/acf.5c5ef4f6-f734-455d-b2f0-ee70b5a17322" finished successfully.

5. Kodu alın

Önceki kod laboratuvarlarına katılmadıysanız kodu alın:

git clone https://github.com/GoogleCloudPlatform/serverless-photosharing-workshop

Bu laboratuvarla ilgili klasör yapınız aşağıdaki gibi olacaktır:

frontend
 |
workflows
 |
 ├── functions
 ├── |── trigger-workflow
 ├── |── vision-data-transform
 ├── services
 ├── |── collage
 ├── |── thumbnails
 ├── workflows.yaml

İlgili klasörler şunlardır:

  • frontend, Lab 4'te yeniden kullanacağımız App Engine ön ucunu içerir.
  • functions, iş akışı için oluşturulan Cloud Functions işlevlerini içerir.
  • services, İş Akışı için değiştirilen Cloud Run hizmetlerini içerir.
  • workflows.yaml, iş akışı tanım dosyasıdır.

6. İş Akışlarını Keşfetme YAML

workflows.yaml, iş akışını bir dizi adımda tanımlar. Daha iyi anlamak için bu konuyu inceleyelim.

İş akışının başında, aktarılan bazı parametreler vardır. Bunlar, iş akışlarını tetikleyen iki Cloud Functions işlevi tarafından aktarılacak. Bu işlevlere daha sonra değineceğiz, ancak İş Akışı şu şekilde başlar:

d44a5e18aa9d4660.png

YAML'de, bu parametrelerin init adımındaki değişkenlere atandığını görebilirsiniz. Örneğin, etkinliği tetikleyen dosya ve paket adları ile iş akışlarının çağıracağı bazı Cloud Functions ve Cloud Run hizmetlerinin URL'leri:

main:
  params: [args]
  steps:
    - init:
        assign:
          - file: ${args.file}
          - bucket: ${args.bucket}
          - gsUri: ${"gs://" + bucket + "/" + file}
          - projectId: ${sys.get_env("GOOGLE_CLOUD_PROJECT_ID")}
          - urls: ${args.urls}

Ardından, iş akışları etkinlik türünü kontrol eder. Desteklenen 2 etkinlik türü vardır: object.finalize (bir dosya bulut depolama paketine kaydedildiğinde yayınlanır) ve object.delete (dosya silindiğinde yayınlanır). Diğer her şey, desteklenmeyen bir etkinlik istisnası oluşturur.

dd1f450983655619.png

YAML iş akışı tanımında, dosya depolama etkinliğinin türünü kontrol ettiğimiz adım şu şekildedir:

    - eventTypeSwitch:
        switch:
            - condition: ${args.eventType == "google.storage.object.finalize"}
              next: imageAnalysisCall
            - condition: ${args.eventType == "google.storage.object.delete"}
              next: pictureGarbageCollectionGCS
    - eventTypeNotSupported:
        raise: ${"eventType " + args.eventType + " is not supported"}
        next: end

Workflows'un, değiştirme talimatı ve çeşitli koşulları ile birlikte geçiş ifadelerini ve istisna işlemeyi nasıl desteklediğine, ayrıca etkinlik tanınmadığında hata verme talimatına dikkat edin.

Şimdi imageAnalysisCall uygulamasına göz atalım. Bu, iş akışlarından gelen bir dizi çağrıdır. Bu çağrı; görüntüyü analiz etmek için Vision API'yi çağırmak, resimde tanınan öğelerin etiketlerini sıralamak için Vision API yanıt verilerini dönüştürmek, baskın renkleri seçmek, resmin görüntülenmesinin güvenli olup olmadığını kontrol etmek ve ardından meta verileri Cloud Firestore'a kaydetmektir.

Daha sonra dağıtacağımız Vision Transform Cloud Functions işlevleri dışında her şeyin İş Akışı'nda yapıldığını unutmayın:

ca2ad16b9cbb436.png

YAML'de adımlar şu şekilde görünür:

    - imageAnalysisCall:
        call: http.post
        args:
          url: https://vision.googleapis.com/v1/images:annotate
          headers:
            Content-Type: application/json
          auth:
            type: OAuth2
          body:
            requests:
            - image:
                source:
                  gcsImageUri: ${gsUri}
              features:
              - type: LABEL_DETECTION
              - type: SAFE_SEARCH_DETECTION
              - type: IMAGE_PROPERTIES
        result: imageAnalysisResponse
    - transformImageAnalysisData:
        call: http.post
        args:
          url: ${urls.VISION_DATA_TRANSFORM_URL}
          auth:
            type: OIDC
          body: ${imageAnalysisResponse.body}
        result: imageMetadata
    - checkSafety:
        switch:
          - condition: ${imageMetadata.body.safe == true}
            next: storeMetadata
        next: end
    - storeMetadata:
        call: http.request
        args:
          url: ${"https://firestore.googleapis.com/v1/projects/" + projectId + "/databases/(default)/documents/pictures/" + file + "?updateMask.fieldPaths=color&updateMask.fieldPaths=labels&updateMask.fieldPaths=created"}
          auth:
            type: OAuth2
          method: PATCH
          body:
            name: ${"projects/" + projectId + "/databases/(default)/documents/pictures/" + file}
            fields:
              color:
                stringValue: ${imageMetadata.body.color}
              created:
                timestampValue: ${imageMetadata.body.created}
              labels:
                arrayValue:
                  values: ${imageMetadata.body.labels}
        result: storeMetadataResponse

Resim analiz edildikten sonraki iki adım, resmin küçük resmini ve en yeni görüntülerden bir kolaj oluşturmaktır. Bu işlem, 2 Cloud Run hizmeti dağıtıp thumbnailCall ve collageCall adımlarından bu hizmetlere çağrı yaparak gerçekleştirilir:

76f9179323c3144.png

YAML'deki adımlar:

   - thumbnailCall:
        call: http.post
        args:
          url: ${urls.THUMBNAILS_URL}
          auth:
            type: OIDC
          body:
              gcsImageUri: ${gsUri}
        result: thumbnailResponse
    - collageCall:
        call: http.get
        args:
          url: ${urls.COLLAGE_URL}
          auth:
            type: OIDC
        result: collageResponse

Yürütme işleminin bu dalı, finalizeCompleted adımında her hizmetten durum kodları döndürerek sona erer:

    - finalizeCompleted:
        return:
          imageAnalysis: ${imageAnalysisResponse.code}
          storeMetadata: ${storeMetadataResponse.code}
          thumbnail: ${thumbnailResponse.code}
          collage: ${collageResponse.code}

Yürütme işleminin diğer bölümü, resimlerin yüksek çözünürlüklü sürümlerini içeren bir dosyanın ana depolama paketinden silinmesidir. Bu dalda resmin küçük resmini içeren paketteki küçük resmi silmek ve meta verilerini Firestore'dan silmek istiyoruz. Bunların her ikisi de Workflows'daki HTTP çağrılarıyla gerçekleştirilir:

f172379274dcb3c2.png

YAML'deki adımlar:

    - pictureGarbageCollectionGCS:
        try:
          call: http.request
          args:
            url: ${"https://storage.googleapis.com/storage/v1/b/thumbnails-" + projectId + "/o/" + file}
            auth:
              type: OAuth2
            method: DELETE
          result: gcsDeletionResult
        except:
          as: e
          steps:
              - dummyResultInOutVar:
                  assign:
                      - gcsDeletionResult:
                          code: 200
                          body: "Workaround for empty body response"
    - pictureGarbageCollectionFirestore:
        call: http.request
        args:
          url: ${"https://firestore.googleapis.com/v1/projects/" + projectId + "/databases/(default)/documents/pictures/" + file}
          auth:
            type: OAuth2
          method: DELETE
        result: firestoreDeletionResult

Silme dalı, her adımdan sonuçlar / kodlar döndürerek sona erer:

    - deleteCompleted:
        return:
          gcsDeletion: ${gcsDeletionResult}
          firestoreDeletion: ${firestoreDeletionResult.code}

Şu adımlarda Workflows'un tüm harici bağımlılıklarını oluşturacağız: paketler, Cloud Functions, Cloud Run hizmetleri ve Firestore veritabanı.

7. Paketleri oluşturma

Resimler için 2 gruba ihtiyacınız vardır: 1'i orijinal yüksek çözünürlüklü resimleri kaydetmek, diğeri ise resimlerin küçük resimlerini kaydetmek için kullanmak.

gsutil aracını kullanarak, kullanıcıların resim yükleyebileceği tek tip erişimli, herkese açık bir bölgesel paket oluşturun (bu örnekte Avrupa'da):

export BUCKET_PICTURES=uploaded-pictures-${GOOGLE_CLOUD_PROJECT}
gsutil mb -l EU gs://${BUCKET_PICTURES}
gsutil uniformbucketlevelaccess set on gs://${BUCKET_PICTURES}
gsutil iam ch allUsers:objectViewer gs://${BUCKET_PICTURES}

Küçük resimler için başka bir herkese açık bölgesel paket oluşturun:

export BUCKET_THUMBNAILS=thumbnails-${GOOGLE_CLOUD_PROJECT}
gsutil mb -l EU gs://${BUCKET_THUMBNAILS}
gsutil uniformbucketlevelaccess set on gs://${BUCKET_THUMBNAILS}
gsutil iam ch allUsers:objectViewer gs://${BUCKET_THUMBNAILS}

Cloud Console'un Cloud Storage bölümünü ziyaret ederek paketlerin oluşturulup oluşturulmadığını ve herkese açık olup olmadığını tekrar kontrol edebilirsiniz:

15063936edd72f06.png

8. Vision Veri Dönüşümü (Cloud Functions İşlevi)

Workflows.yaml init, eventTypeSwitch, eventTypeNotSupported adımla başlar. Bunlar, paketlerden gelen etkinliklerin doğru adımlara yönlendirilmesini sağlar.

object.finalize etkinliği için imageAnalysisCall adımı, oluşturulan görüntünün meta verilerini ayıklaması için Vision API'ye çağrı yapar. Bu adımların tümü iş akışları içinde yapılır:

daaed43a22d2b0d3.png

Sonraki adımda, Vision API'den döndürülen verileri Firestore'a kaydetmeden önce dönüştürmemiz gerekiyor. Daha net olmak gerekirse:

  • Görüntü için döndürülen etiketleri listeleyin.
  • Resmin baskın rengini alın.
  • Resmin güvenli olup olmadığını belirleyin.

Bu işlem, bir Cloud Functions işlevindeki kodda yapılır ve iş akışları şu işlevi çağırır:

5e120e70c67779cd.png

Kodu inceleyin

Cloud Functions işlevi vision-data-transform olarak adlandırılır. Kodun tamamını index.js dosyasında kontrol edebilirsiniz. Gördüğünüz gibi bu işlevin tek amacı, resim meta verilerini Firestore'da kolayca depolamak için JSON'dan JSON'a dönüştürme yapmaktır.

Cloud Functions'a dağıtma

İlgili klasöre gidin:

cd workflows/functions/vision-data-transform/nodejs

İstediğiniz bölgeyi ayarlayın:

export REGION=europe-west1
gcloud config set functions/region ${REGION}

İşlevi şununla dağıtın:

export SERVICE_NAME=vision-data-transform
gcloud functions deploy ${SERVICE_NAME} \
  --source=. \
  --runtime nodejs10 \
  --entry-point=vision_data_transform \
  --trigger-http \
  --allow-unauthenticated

İşlev dağıtıldıktan sonra Workflows transformImageAnalysisData adımı, Vision API veri dönüşümü yapmak için bu işlevi çağırabilir.

9. Veritabanını hazırlama

Workflows'da bir sonraki adım, görüntü verilerindeki görüntünün güvenliğini kontrol etmek ve ardından Vision API tarafından döndürülen resimle ilgili bilgileri hızlı, tümüyle yönetilen, sunucusuz ve bulutta yerel bir NoSQL belge veritabanı olan Cloud Firestore veritabanında depolamaktır:

6624c616bc7cd97f.png

Bunların her ikisi de Workflows'da yapılır ancak meta verilerin depolanması için Firestore veritabanı oluşturmanız gerekir.

İlk olarak, Firestore veritabanını istediğiniz bölgede bir App Engine uygulaması oluşturun (Firestore için zorunludur):

export REGION_FIRESTORE=europe-west2
gcloud app create --region=${REGION_FIRESTORE}

Daha sonra, aynı bölgede Firestore veritabanını oluşturun:

gcloud firestore databases create --region=${REGION_FIRESTORE}

Dokümanlar, koleksiyonumuzda programlı bir şekilde oluşturulur ve 4 alan içerir:

  • name (dize): yüklenen resmin dosya adı ve aynı zamanda dokümanın anahtarıdır
  • labels (dize dizisi): Vision API tarafından tanınan öğelerin etiketleri
  • color (dize): baskın rengin onaltılık renk kodu (ör. #ab12ef)
  • create (tarih): Bu görsele ait meta verilerin saklandığı zaman damgası
  • thumbnail (boole): Bu resim için bir küçük resim oluşturulmuşsa mevcut ve doğru olacak isteğe bağlı bir alan

Küçük resimleri olan resimleri bulmak için Firestore'da arama yapacağımızdan ve oluşturma tarihine göre sıralayacağımız için bir arama dizini oluşturmamız gerekecek. Aşağıdaki komutla dizini oluşturabilirsiniz:

gcloud firestore indexes composite create --collection-group=pictures \
  --field-config field-path=thumbnail,order=descending \
  --field-config field-path=created,order=descending

Dizin oluşturma işleminin yaklaşık 10 dakika kadar sürebileceğini lütfen unutmayın.

Dizin oluşturulduktan sonra Cloud Console'da gösterilir:

43af1f5103bf423.png

İş akışları storeMetadata adımı artık resim meta verilerini Firestore'da depolayabilecek.

10. Küçük resim hizmeti (Cloud Run)

Zincirin devamı, bir resmin küçük resmini oluşturmaktır. Bu işlem bir Cloud Run hizmetindeki kodda yapılır ve Workflows, şu hizmeti thumbnailCall adımında çağırır:

84d987647f082b53.png

Kodu inceleyin

Cloud Run hizmeti thumbnails olarak adlandırılır. Kodun tamamını index.js dosyasında kontrol edebilirsiniz.

Container görüntüsünü derleme ve yayınlama

Cloud Run, container'ları çalıştırır ancak önce container görüntüsünü oluşturmanız gerekir (Dockerfile içinde tanımlanır). Google Cloud Build, container görüntüleri derlemek ve ardından Google Container Registry'de barındırmak için kullanılabilir.

İlgili klasöre gidin:

cd workflows/services/thumbnails/nodejs

Oluştur:

export SERVICE_SRC=thumbnails
export SERVICE_NAME=${SERVICE_SRC}-service
gcloud builds submit \
  . \
  --tag gcr.io/${GOOGLE_CLOUD_PROJECT}/${SERVICE_NAME}

Bir veya iki dakika sonra derleme başarılı olur ve container, Google Container Registry'ye dağıtılır.

Cloud Run'a dağıtma

Gerekli bazı değişkenleri ve yapılandırmayı belirleyin:

export BUCKET_THUMBNAILS=thumbnails-${GOOGLE_CLOUD_PROJECT}
export REGION=europe-west1
gcloud config set run/region ${REGION}
gcloud config set run/platform managed

Şu komutla dağıtın:

gcloud run deploy ${SERVICE_NAME} \
    --image gcr.io/${GOOGLE_CLOUD_PROJECT}/${SERVICE_NAME} \
    --no-allow-unauthenticated \
    --memory=1Gi \
    --update-env-vars BUCKET_THUMBNAILS=${BUCKET_THUMBNAILS}

Hizmet dağıtıldıktan sonra Workflows thumbnailCall adımı bu hizmeti çağırabilir.

11. Kolaj hizmeti (Cloud Run)

Sıradaki adım, en yeni resimlerden bir kolaj oluşturmaktır. Bu işlem bir Cloud Run hizmetindeki kodda yapılır ve Workflows, şu hizmeti collageCall adımında çağırır:

591e36149066e1ba.png

Kodu inceleyin

Cloud Run hizmeti collage olarak adlandırılır. Kodun tamamını index.js dosyasında kontrol edebilirsiniz.

Container görüntüsünü derleme ve yayınlama

Cloud Run, container'ları çalıştırır ancak önce container görüntüsünü oluşturmanız gerekir (Dockerfile içinde tanımlanır). Google Cloud Build, container görüntüleri derlemek ve ardından Google Container Registry'de barındırmak için kullanılabilir.

İlgili klasöre gidin:

cd services/collage/nodejs

Oluştur:

export SERVICE_SRC=collage
export SERVICE_NAME=${SERVICE_SRC}-service
gcloud builds submit \
  . \
  --tag gcr.io/${GOOGLE_CLOUD_PROJECT}/${SERVICE_NAME}

Bir veya iki dakika sonra derleme başarılı olur ve container, Google Container Registry'ye dağıtılır.

Cloud Run'a dağıtma

Gerekli bazı değişkenleri ve yapılandırmayı belirleyin:

export BUCKET_THUMBNAILS=thumbnails-${GOOGLE_CLOUD_PROJECT}
export REGION=europe-west1
gcloud config set run/region ${REGION}
gcloud config set run/platform managed

Dağıtım:

gcloud run deploy ${SERVICE_NAME} \
    --image gcr.io/${GOOGLE_CLOUD_PROJECT}/${SERVICE_NAME} \
    --no-allow-unauthenticated \
    --memory=1Gi \
    --update-env-vars BUCKET_THUMBNAILS=${BUCKET_THUMBNAILS}

Hizmet dağıtıldıktan sonra, her iki hizmetin de Cloud Console'un Cloud Run bölümünde çalıştığını kontrol edebilirsiniz. Ayrıca iş akışları collageCall adımı şu hizmeti çağırabilir:

3ae9873f4cbbf423.png

12. İş akışları dağıtımı

Workflows'un tüm harici bağımlılıklarını dağıttık. Kalan tüm adımlar (finalizeCompleted, pictureGarbageCollectionGCS, pictureGarbageCollectionFirestore, deleteCompleted) Workflows tarafından tamamlanabilir.

Artık İş Akışlarını dağıtma zamanı geldi.

workflows.yaml dosyasını içeren klasöre gidip dosyayı şununla dağıt:

export WORKFLOW_REGION=europe-west4
export WORKFLOW_NAME=picadaily-workflows
gcloud workflows deploy ${WORKFLOW_NAME} \
  --source=workflows.yaml \
  --location=${WORKFLOW_REGION}

İş Akışı birkaç saniye içinde dağıtılacaktır. İş Akışı'nı Cloud Console'un İş Akışları bölümünde görebilirsiniz:

94a720149e5df9c5.png

İsterseniz İş Akışı'nı tıklayıp düzenleyebilirsiniz. Düzenleme sırasında iş akışının görsel bir temsilini görürsünüz:

55441b158f6027f3.png

İş akışını, doğru parametrelerle Cloud Console'dan manuel olarak da yürütebilirsiniz. Bunun yerine, bir sonraki adımda Cloud Storage etkinliklerine karşılık bu projeyi otomatik olarak yürüteceğiz.

13. İş akışı tetikleyicileri (Cloud Functions)

İş akışı dağıtıldı ve hazır. Şimdi, Cloud Storage paketinde dosya oluşturulduğunda veya silindiğinde iş akışlarını tetiklememiz gerekiyor. Bunlar sırasıyla storage.object.finalize ve storage.object.delete etkinlikleridir.

İş akışlarında, kullanabileceğiniz iş akışları oluşturmak, yönetmek ve yürütmek için API'ler ve istemci kitaplıkları bulunur. Bu durumda, iş akışını tetiklemek için Workflows Execution API'yi ve daha ayrıntılı olarak belirtmek gerekirse Node.js istemci kitaplığını kullanacaksınız.

Cloud Storage etkinliklerini dinleyen Cloud Functions işlevinden gelen iş akışlarını tetikleyeceksiniz. Bir Cloud Functions işlevi yalnızca bir etkinlik türünü dinleyebileceğinden hem etkinlik oluşturma hem de silme işlemlerini dinlemek için iki Cloud Functions işlevini dağıtacaksınız:

c4d79646de729e4.png

Kodu inceleyin

Cloud Functions işlevi trigger-workflow olarak adlandırılır. Kodun tamamını index.js dosyasında kontrol edebilirsiniz.

Cloud Functions'a dağıtma

İlgili klasöre gidin:

cd workflows/functions/trigger-workflow/nodejs

Gerekli bazı değişkenleri ve yapılandırmayı belirleyin:

export BUCKET_PICTURES=uploaded-pictures-${GOOGLE_CLOUD_PROJECT}
export REGION=europe-west1
export WORKFLOW_NAME=picadaily-workflows
export WORKFLOW_REGION=europe-west4
export COLLAGE_URL=$(gcloud run services describe collage-service --format 'value(status.url)')
export THUMBNAILS_URL=$(gcloud run services describe thumbnails-service --format 'value(status.url)')
export VISION_DATA_TRANSFORM_URL=$(gcloud functions describe vision-data-transform --format 'value(httpsTrigger.url)')
gcloud config set functions/region ${REGION}

Etkinlikleri kesinleştirmeye yanıt olarak işlevi dağıtın:

export SERVICE_NAME=trigger-workflow-on-finalize
gcloud functions deploy ${SERVICE_NAME} \
  --source=. \
  --runtime nodejs10 \
  --entry-point=trigger_workflow \
  --trigger-resource=${BUCKET_PICTURES} \
  --trigger-event=google.storage.object.finalize \
  --allow-unauthenticated \
  --set-env-vars GOOGLE_CLOUD_PROJECT=${GOOGLE_CLOUD_PROJECT},WORKFLOW_REGION=${WORKFLOW_REGION},WORKFLOW_NAME=${WORKFLOW_NAME},THUMBNAILS_URL=${THUMBNAILS_URL},COLLAGE_URL=${COLLAGE_URL},VISION_DATA_TRANSFORM_URL=${VISION_DATA_TRANSFORM_URL}

Silme etkinliklerine yanıt olarak ikinci işlevi dağıtın:

export SERVICE_NAME=trigger-workflow-on-delete
gcloud functions deploy ${SERVICE_NAME} \
  --source=. \
  --runtime nodejs10 \
  --entry-point=trigger_workflow \
  --trigger-resource=${BUCKET_PICTURES} \
  --trigger-event=google.storage.object.delete \
  --allow-unauthenticated \
  --set-env-vars GOOGLE_CLOUD_PROJECT=${GOOGLE_CLOUD_PROJECT},WORKFLOW_REGION=${WORKFLOW_REGION},WORKFLOW_NAME=${WORKFLOW_NAME},THUMBNAILS_URL=${THUMBNAILS_URL},COLLAGE_URL=${COLLAGE_URL},VISION_DATA_TRANSFORM_URL=${VISION_DATA_TRANSFORM_URL}

Dağıtım tamamlandığında Cloud Console'da her iki işlevi de görebilirsiniz:

7d60c8b7851f39f5.png

14. Ön Uç (App Engine)

Bu adımda, Pic-a-daily: Lab 4: Kullanıcıların web uygulamasından resim yüklemesine, yüklenen resimlere ve küçük resimlerine göz atmasına olanak tanıyan bir web ön ucu oluşturun'u kullanarak Google App Engine'de bir web ön ucu oluşturursunuz.

223fb2281614d053.png

Pic-a-Günlük: Laboratuvar 4: Web ön ucu oluşturma başlıklı makalede App Engine hakkında daha fazla bilgi edinebilir ve kod açıklamasını okuyabilirsiniz.

Kodu inceleyin

App Engine uygulamasının adı frontend. Kodun tamamını index.js dosyasında kontrol edebilirsiniz.

App Engine'e Dağıtım

İlgili klasöre gidin:

cd frontend

İstediğiniz bölgeyi ayarlayın ve app.yaml dosyasındaki GOOGLE_CLOUD_PROJECT değerini gerçek proje kimliğinizle değiştirin:

export REGION=europe-west1
gcloud config set compute/region ${REGION}
sed -i -e "s/GOOGLE_CLOUD_PROJECT/${GOOGLE_CLOUD_PROJECT}/" app.yaml

Dağıtım:

gcloud app deploy app.yaml -q

Bir veya iki dakika sonra, uygulamanın trafik sunduğu size bildirilir:

Beginning deployment of service [default]...
╔════════════════════════════════════════════════════════════╗
╠═ Uploading 8 files to Google Cloud Storage                ═╣
╚════════════════════════════════════════════════════════════╝
File upload done.
Updating service [default]...done.
Setting traffic split for service [default]...done.
Deployed service [default] to [https://GOOGLE_CLOUD_PROJECT.appspot.com]
You can stream logs from the command line by running:
  $ gcloud app logs tail -s default
To view your application in the web browser run:
  $ gcloud app browse

Uygulamanın dağıtıldığını görmek, sürüm belirleme ve trafik bölme gibi App Engine özelliklerini keşfetmek için Cloud Console'un App Engine bölümünü de ziyaret edebilirsiniz:

f4bd5f4de028bd83.png

15. İş Akışlarını Test Etme

Test etmek için uygulama (https://<YOUR_PROJECT_ID>.appspot.com/) uygulamasının varsayılan App Engine URL'sine gidin. Ön uç kullanıcı arayüzünün çalışır durumda olduğunu göreceksiniz.

1649ac060441099.png

Resim yükleyin. Bunun iş akışlarını tetiklemesi gerekir. İş akışının yürütüldüğünü Cloud Console'da Active durumunda görebilirsiniz:

b5a2a3d7a2bc094.png

İş akışları tamamlandıktan sonra yürütme kimliğini tıklayabilir ve farklı hizmetlerden alınan çıktıları görebilirsiniz:

8959df5098c21548.png

3 resim daha yükleyin. Cloud Storage paketlerindeki ve App Engine ön ucundaki görüntülerin küçük resmi ile kolajının da güncellendiğini göreceksiniz:

d90c786ff664a5dc.png

16. Temizleme (İsteğe bağlı)

Uygulamayı tutmak istemiyorsanız projenin tamamını silerek maliyet tasarrufu yapmak ve genel olarak iyi bir bulut vatandaşı olmak için kaynakları temizleyebilirsiniz:

gcloud projects delete ${GOOGLE_CLOUD_PROJECT} 

17. Tebrikler!

Hizmetleri düzenlemek ve çağırmak için iş akışlarını kullanarak uygulamanın düzenlenmiş bir sürümünü oluşturdunuz.

İşlediklerimiz

  • App Engine
  • Cloud Firestore
  • Cloud Functions
  • Cloud Run
  • İş akışları