1. Genel Bakış
Önceki laboratuvarlarda, Pic-a-daily uygulamasının etkinliğe dayalı bir sürümünü oluşturmuştunuz. Bu sürümde, Görüntü Analizi hizmeti için Google Cloud Storage tarafından tetiklenen bir Cloud Function, küçük resim hizmeti için Pub/Sub aracılığıyla GCS tarafından tetiklenen bir Cloud Run container'ı ve Cloud Run'da görüntü çöp toplayıcı hizmetini tetiklemek için Eventarc kullanılıyordu. Ayrıca Cloud Scheduler tarafından tetiklenen bir Collage hizmeti de vardı:

Bu laboratuvarda, uygulamanın düzenlenmiş bir sürümünü oluşturacaksınız. Sistemde farklı türlerde etkinlikler akıtmak yerine, hizmetleri aşağıdaki şekilde düzenlemek ve çağırmak için Workflows'u kullanacaksınız:

Neler öğreneceksiniz?
- App Engine
- Cloud Firestore
- Cloud Functions
- Cloud Run
- İş akışları
2. Kurulum ve Gereksinimler
Yönlendirmesiz ortam kurulumu
- 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 kimliğini unutmayın. Bu kimlik, tüm Google Cloud projelerinde benzersiz bir addır (Yukarıdaki ad zaten alınmış olduğundan sizin için çalışmayacaktır). Bu codelab'in ilerleyen kısımlarında PROJECT_ID olarak adlandırılacaktır.
- Ardından, Google Cloud kaynaklarını kullanmak için Cloud Console'da faturalandırmayı etkinleştirmeniz gerekir.
Bu codelab'i tamamlamak neredeyse hiç maliyetli değildir. Bu eğitimin ötesinde faturalandırma ücreti alınmaması için kaynakları nasıl kapatacağınız konusunda size tavsiyelerde bulunan "Temizleme" bölümündeki talimatları uyguladığınızdan emin olun. Google Cloud'un yeni 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.
GCP 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 laboratuvardaki çalışmalarınızın tamamını yalnızca bir tarayıcı kullanarak yapabilirsiniz.
3. İş Akışlarına Giriş

Bir dizi sunucusuz görevi tanımladığınız sırayla birbirine bağlayan sunucusuz iş akışları oluşturmak için Workflows'u kullanabilirsiniz. Esnek sunucusuz uygulamalar oluşturmak için Google Cloud'un API'lerinin, Cloud Functions ve Cloud Run gibi sunucusuz ürünlerinin ve harici API'lere yapılan çağrıların gücünü birleştirebilirsiniz.
Bir düzenleyiciden bekleyeceğiniz gibi Workflows, iş mantığınızın akışını YAML/JSON tabanlı bir iş akışı tanımı 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.
Aşağıdaki yerleşik ve yapılandırılabilir özellikleriyle yalnızca bir düzenleyiciden çok daha fazlasıdır:
- Adımların güvenilir şekilde yürütülmesi için adımlar arasında esnek yeniden deneme ve hata işleme.
- Yapıştırıcı koddan kaçınmak için adımlar arasında JSON ayrıştırma ve değişken aktarma.
- Kararlar için kullanılan ifade formülleri, koşullu adım yürütmelerine olanak tanır.
- Modüler ve yeniden kullanılabilir iş akışları için alt iş akışları.
- Harici hizmetler için destek, Google Cloud dışındaki hizmetlerin düzenlenmesine olanak tanır.
- Güvenli adım yürütmeleri için Google Cloud ve harici hizmetlerde kimlik doğrulama desteği.
- Daha kolay entegrasyon için Pub/Sub, Firestore, Tasks ve Secret Manager gibi Google Cloud hizmetlerine bağlayıcılar.
Ayrıca Workflows, tümüyle yönetilen bir sunucusuz üründür. Yapılandırılacak veya ölçeklendirilecek sunucu yoktur ve yalnızca kullandığınız kadar ödersiniz.
4. API'leri etkinleştir
Bu laboratuvarda, Cloud Functions ve Cloud Run hizmetlerini Workflows ile bağlayacaksınız. Ayrıca 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örürsünüz:
Operation "operations/acf.5c5ef4f6-f734-455d-b2f0-ee70b5a17322" finished successfully.
5. Kodu alın
Önceki kod laboratuvarlarında yapmadıysanız kodu alın:
git clone https://github.com/GoogleCloudPlatform/serverless-photosharing-workshop
Bu laboratuvar için aşağıdaki klasör yapısına sahip olmanız gerekir:
frontend | workflows | ├── functions ├── |── trigger-workflow ├── |── vision-data-transform ├── services ├── |── collage ├── |── thumbnails ├── workflows.yaml
İlgili klasörler şunlardır:
frontend, 4. laboratuvarda yeniden kullanacağımız App Engine ön ucunu içerir.functions, iş akışı için oluşturulan Cloud Functions işlevlerini içerir.services, iş akışı için değiştirilen Cloud Run hizmetlerini içerir.workflows.yaml, iş akışı tanımı dosyasıdır.
6. İş Akışları YAML'sini keşfetme
workflows.yaml, iş akışını bir dizi adımda tanımlar. Daha iyi anlamak için bu süreci inceleyelim.
İş akışının başında iletilen bazı parametreler vardır. Bu değerler, iş akışlarını tetikleyen iki Cloud Functions işlevi tarafından iletilir. Bu işlevlere daha sonra değineceğiz ancak İş Akışları'nın nasıl başlatıldığını aşağıda açıklıyoruz:

YAML'de, bu parametrelerin init adımındaki değişkenlere (ör. etkinliği tetikleyen dosya ve paket adları ile Workflows'un çağıracağı bazı Cloud Functions ve Cloud Run hizmetlerinin URL'leri) atandığını görebilirsiniz:
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 (bir dosya silindiğinde yayınlanır). Diğer tüm durumlar, desteklenmeyen etkinlik istisnası oluşturur.

YAML iş akışı tanımında, dosya depolama etkinliğinin türünü kontrol ettiğimiz adım şudur:
- 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
İş akışlarının, switch ifadesini ve çeşitli koşullarını içeren switch talimatı ile etkinlik tanınmadığında hata oluşturmak için kullanılan raise talimatı ile switch ifadelerini ve istisna işlemeyi nasıl desteklediğine dikkat edin.
Şimdi de imageAnalysisCall bölümüne göz atalım. Bu, iş akışlarından Vision API'yi çağırarak görüntüyü analiz etme, Vision API yanıt verilerini dönüştürerek resimde tanınan öğelerin etiketlerini sıralama, baskın renkleri seçme, görüntünün güvenli olup olmadığını kontrol etme ve ardından meta verileri Cloud Firestore'a kaydetme işlemlerini içeren bir dizi çağrıdır.
Vision Transform Cloud Functions (daha sonra dağıtacağımız) hariç her şeyin İş Akışları'nda yapıldığını unutmayın:

Adımlar YAML'de ş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 son resimlerin kolajını oluşturmaktır. Bu işlem, 2 Cloud Run hizmeti dağıtılarak ve thumbnailCall ile collageCall adımlarından bu hizmetlere çağrı yapılarak gerçekleştirilir:

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ütmenin bu dalı, finalizeCompleted adımındaki her hizmetten durum kodları döndürülerek sonlandırılır:
- finalizeCompleted:
return:
imageAnalysis: ${imageAnalysisResponse.code}
storeMetadata: ${storeMetadataResponse.code}
thumbnail: ${thumbnailResponse.code}
collage: ${collageResponse.code}
Yürütmenin diğer kolu, resimlerin yüksek çözünürlüklü sürümlerini içeren ana depolama paketinden bir dosya silindiğinde gerçekleşir. Bu dalda, küçük resimler içeren paketteki resmin küçük resmini ve Firestore'daki meta verilerini silmek istiyoruz. Bunların her ikisi de Workflows'dan gelen HTTP çağrılarıyla yapılır:

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 işlemi, her adımdan sonuçlar / kodlar döndürülerek sonlandırılır:
- deleteCompleted:
return:
gcsDeletion: ${gcsDeletionResult}
firestoreDeletion: ${firestoreDeletionResult.code}
Aşağıdaki adımlarda, iş akışlarının tüm harici bağımlılıklarını (paketler, Cloud Functions, Cloud Run hizmetleri ve Firestore veritabanı) oluşturacağız.
7. Paketleri oluşturma
Resimler için 2 pakete ihtiyacınız vardır: 1 paket orijinal yüksek çözünürlüklü resimleri kaydetmek, 1 paket ise resimlerin küçük resimlerini kaydetmek için.
gsutil aracını kullanarak kullanıcıların resim yükleyebileceği, herkese açık ve bölgesel (bu örnekte Avrupa) bir paket oluşturun:
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şturulduğunu ve herkese açık olduğunu tekrar kontrol edebilirsiniz:

8. Vision Data Transform (Cloud Functions işlevi)
Workflows.yaml, init, eventTypeSwitch, eventTypeNotSupported adımlarıyla başlıyor. Bunlar, gruplardan gelen etkinliklerin doğru adımlara yönlendirilmesini sağlar.
object.finalize etkinliğinde, imageAnalysisCall adımında oluşturulan resmin meta verilerini ayıklamak için Vision API'ye bir çağrı yapılır. Bu adımların tümü İş Akışları'nda yapılır:

Ardından, Vision API'den döndürülen verileri Firestore'a kaydedebilmek için dönüştürmemiz gerekir. Daha açık şekilde belirtmek gerekirse:
- Resim için döndürülen etiketleri listeleyin.
- Resmin baskın rengini alın.
- Resmin güvenli olup olmadığını belirleyin.
Bu işlem, Cloud Functions'da kodla yapılır ve Workflows bu işlevi basitçe çağırır:

Kodu keşfetme
Cloud Functions işlevinin adı vision-data-transform'dır. Tam kodunu index.js dosyasında kontrol edebilirsiniz. Gördüğünüz gibi, bu işlevin tek amacı, resim meta verilerini Firestore'da rahatça saklamak için JSON'dan JSON'a dönüştürme işlemidir.
Cloud Functions'a dağıtma
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 şunlarla 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ünü yapmak için bu işlevi çağırabilir.
9. Veritabanını hazırlama
İş akışlarında bir sonraki adım, resim verilerinden resmin 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:

Bu işlemlerin her ikisi de İş Akışları'nda yapılır ancak meta verilerin depolanması için Firestore veritabanını oluşturmanız gerekir.
Öncelikle, Firestore veritabanının bulunmasını istediğiniz bölgede bir App Engine uygulaması oluşturun (Firestore için gereklidir):
export REGION_FIRESTORE=europe-west2
gcloud app create --region=${REGION_FIRESTORE}
Ardından, Firestore veritabanını aynı bölgede oluşturun:
gcloud firestore databases create --region=${REGION_FIRESTORE}
Dokümanlar, koleksiyonumuzda programatik olarak oluşturulur ve 4 alan içerir:
- name (dize): Yüklenen resmin dosya adı. Bu, aynı zamanda belgenin anahtarıdır.
- labels (dizeler dizisi): Vision API tarafından tanınan öğelerin etiketleri
- color (dize): Baskın rengin onaltılık renk kodu (ör. #ab12ef)
- created (tarih): Bu resmin meta verilerinin depolandığı zaman damgası
- thumbnail (boolean): Bu resim için küçük resim oluşturulmuşsa mevcut ve doğru olacak isteğe bağlı bir alan
Küçük resimleri olan fotoğrafları bulmak için Firestore'da arama yapacağımız ve oluşturulma tarihine göre sıralama yapacağımız için bir arama dizini oluşturmamız gerekir. Dizini aşağıdaki komutla 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 sürebileceğini unutmayın.
Dizin oluşturulduktan sonra Cloud Console'da görebilirsiniz:

İş akışları storeMetadata adımı artık resim meta verilerini Firestore'da depolayabilir.
10. Küçük resim hizmeti (Cloud Run)
Zincirdeki bir sonraki adım, resmin küçük resmini oluşturmaktır. Bu işlem, Cloud Run hizmetindeki kodda yapılır ve Workflows, thumbnailCall adımında bu hizmeti çağırır:

Kodu keşfetme
Cloud Run hizmetinin adı thumbnails'dir. Tam kodunu index.js dosyasında kontrol edebilirsiniz.
Container görüntüsünü oluşturma ve yayınlama
Cloud Run, container'ları çalıştırır ancak önce container görüntüsünü (Dockerfile içinde tanımlanır) oluşturmanız gerekir. Container görüntülerini oluşturmak ve ardından Google Container Registry'de barındırmak için Google Cloud Build kullanılabilir.
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 kapsayıcı, Google Container Registry'ye dağıtılır.
Cloud Run'a dağıtma
Gerekli bazı değişkenleri ve yapılandırmayı ayarlayın:
export BUCKET_THUMBNAILS=thumbnails-${GOOGLE_CLOUD_PROJECT}
export REGION=europe-west1
gcloud config set run/region ${REGION}
gcloud config set run/platform managed
Aşağıdaki 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)
Zincirin bir sonraki halkası, en son resimlerden kolaj oluşturmaktır. Bu işlem, Cloud Run hizmetindeki kodda yapılır ve Workflows, collageCall adımında bu hizmeti çağırır:

Kodu keşfetme
Cloud Run hizmetinin adı collage'dir. Tam kodunu index.js dosyasında kontrol edebilirsiniz.
Container görüntüsünü oluşturma ve yayınlama
Cloud Run, container'ları çalıştırır ancak önce container görüntüsünü (Dockerfile içinde tanımlanır) oluşturmanız gerekir. Container görüntülerini oluşturmak ve ardından Google Container Registry'de barındırmak için Google Cloud Build kullanılabilir.
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 kapsayıcı, Google Container Registry'ye dağıtılır.
Cloud Run'a dağıtma
Gerekli bazı değişkenleri ve yapılandırmayı ayarlayın:
export BUCKET_THUMBNAILS=thumbnails-${GOOGLE_CLOUD_PROJECT}
export REGION=europe-west1
gcloud config set run/region ${REGION}
gcloud config set run/platform managed
Dağıtma:
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. Workflows collageCall adımı bu hizmeti çağırabilir:

12. İş akışlarının dağıtımı
Workflows'ün tüm harici bağımlılıklarını dağıttık. Kalan tüm adımlar (finalizeCompleted, pictureGarbageCollectionGCS, pictureGarbageCollectionFirestore, deleteCompleted) Workflows tarafından tamamlanabilir.
İş akışlarını dağıtma zamanı geldi.
workflows.yaml dosyasını içeren klasöre gidin ve dosyayı şu komutla dağıtın:
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ılır ve Cloud Console'un İş Akışları bölümünde görülebilir:

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

İş akışını Cloud Console'dan doğru parametrelerle manuel olarak da yürütebilirsiniz. Bunun yerine, bir sonraki adımda Cloud Storage etkinliklerine yanıt olarak otomatik şekilde yürüteceğiz.
13. İş akışı tetikleyicileri (Cloud Functions)
İş akışı dağıtıldı ve hazır. Şimdi, bir 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şturma, yönetme ve yürütme için API'ler ve istemci kitaplıkları bulunur. Bu durumda, iş akışını tetiklemek için Workflows Execution API'yi ve daha spesifik olarak Node.js istemci kitaplığını kullanırsınız.
Cloud Storage etkinliklerini dinleyen Cloud Functions işlevinden iş akışlarını tetiklersiniz. Cloud Functions yalnızca bir etkinlik türünü dinleyebildiğinden hem oluşturma hem de silme etkinliklerini dinlemek için iki Cloud Functions işlevi dağıtırsınız:

Kodu keşfetme
Cloud Functions işlevinin adı trigger-workflow'dır. Tam kodunu index.js dosyasında kontrol edebilirsiniz.
Cloud Functions'a dağıtma
Klasöre gidin:
cd workflows/functions/trigger-workflow/nodejs
Gerekli bazı değişkenleri ve yapılandırmayı ayarlayın:
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}
Sonlandırma etkinliklerine yanıt veren 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 veren 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:

14. Ön uç (App Engine)
Bu adımda, Pic-a-daily: Lab 4—Create a web frontend (Pic-a-daily: Laboratuvar 4 - Web ön ucu oluşturma) başlıklı laboratuvarda Google App Engine'de bir web ön ucu oluşturacaksınız. Bu ön uç, kullanıcıların web uygulamasından resim yüklemesine, yüklenen resimlere ve küçük resimlerine göz atmasına olanak tanır.

App Engine hakkında daha fazla bilgi edinebilir ve kod açıklamasını Pic-a-daily: Lab 4—Create a web frontend başlıklı makalede okuyabilirsiniz.
Kodu keşfetme
App Engine uygulamasının adı frontend'dır. Tam kodunu index.js dosyasında kontrol edebilirsiniz.
App Engine'e Dağıtım
Klasöre gidin:
cd frontend
Seçtiğiniz bölgeyi ayarlayın ve app.yaml dosyasındaki GOOGLE_CLOUD_PROJECT öğesini 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ğıtma:
gcloud app deploy app.yaml -q
Bir veya iki dakika sonra, uygulamanın trafik sunduğu 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 ve App Engine'in sürüm oluşturma ve trafiği bölme gibi özelliklerini keşfetmek için Cloud Console'un App Engine bölümünü de ziyaret edebilirsiniz:

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

Resim yükleyin. Bu işlem, iş akışlarını tetiklemelidir. Cloud Console'da iş akışı yürütme işleminin Active durumunda olduğunu görebilirsiniz:

İş akışları tamamlandıktan sonra yürütme kimliğini tıklayarak farklı hizmetlerin çıkışını görebilirsiniz:

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

16. Temizleme (isteğe bağlı)
Uygulamayı tutmayı düşünmüyorsanız maliyetleri düşürmek ve genel olarak iyi bir bulut kullanıcısı olmak için kaynakları temizleyebilir, bunun için de projenin tamamını silebilirsiniz:
gcloud projects delete ${GOOGLE_CLOUD_PROJECT}
17. Tebrikler!
Hizmetleri düzenlemek ve çağırmak için Workflows'u kullanarak uygulamanın düzenlenmiş bir sürümünü oluşturdunuz.
İşlediğimiz konular
- App Engine
- Cloud Firestore
- Cloud Functions
- Cloud Run
- İş akışları