Eventarc ve Cloud Functions'ı kullanarak Cloud Storage'dan etkinlik işlemeyi tetikleme (2. nesil)

1. Genel Bakış

Bu laboratuvarda, etkinlik işlemeyi tetiklemek için Cloud Storage paket etkinliklerini ve Eventarc'ı nasıl kullanacağınızı öğreneceksiniz. Verileri analiz etmek ve görüntüleri işlemek için Cloud Functions'ı (2. nesil) kullanacaksınız. İşlev, Google'ın Vision API'sini kullanır ve ortaya çıkan görüntüyü tekrar Cloud Storage paketine kaydeder.

4756e4c218d84e26.png

Öğrenecekleriniz

Görüntü işleme ardışık düzeni derleme

  • Storage paketlerini yapılandırma
  • Cloud Storage'da nesneleri okumak ve yazmak için Cloud Functions işlevi oluşturma
  • Yemek resimlerini algılamak için Vision API'yi entegre edin
  • Cloud Functions işlevi dağıtma
  • Eventarc tetikleyicisi dağıtma
  • Uçtan uca çözümü test edin ve doğrulayın

Ön koşullar

  • Bu laboratuvarda Cloud Console ve kabuk ortamları hakkında bilgi sahibi olmanız gerekir.
  • Önceki Cloud Storage, Cloud Functions veya Vision API deneyimi faydalı olmakla birlikte zorunlu değildir.

2. Kurulum ve Gereksinimler

Cloud projesi 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 etkinleştirme

Arama çubuğunun sağındaki simgeyi tıklayarak Cloud Shell'i etkinleştirin.

8613854df02635a3.png

Ortam Kurulumu

  1. Cloud Shell terminalinde aşağıdaki komutları çalıştırarak proje ve kaynakla ilgili ortam değişkenleri oluşturun.
export PROJECT_ID=$(gcloud config get-value project)
export PROJECT_NAME=$(gcloud config get-value project)
export PROJECT_NUMBER=$(gcloud projects describe $PROJECT_ID --format='value(projectNumber)')
export REGION=us-east1 
export UPLOAD_BUCKET=gs://menu-item-uploads-$PROJECT_ID
export BUCKET_THUMBNAILS=gs://menu-item-thumbnails-$PROJECT_ID
export MENU_SERVICE_NAME=menu-service
export USER_EMAIL=$(gcloud config list account --format "value(core.account)")
  1. Laboratuvar için gerekli API'leri etkinleştirin
gcloud services enable \
    vision.googleapis.com \
    cloudfunctions.googleapis.com \
    pubsub.googleapis.com \
    cloudbuild.googleapis.com \
    logging.googleapis.com \
    eventarc.googleapis.com \
    artifactregistry.googleapis.com \
    run.googleapis.com \
    --quiet
  1. Laboratuvar için gerekli API'leri etkinleştirin. (Qwiklabs'e özel adım)
gcloud services disable cloudfunctions.googleapis.com
gcloud services enable cloudfunctions.googleapis.com
  1. Depoyu klonlama
git clone https://github.com/GoogleCloudPlatform/cymbal-eats.git && cd cymbal-eats/cloud-functions

3. Cloud Storage paketlerini yapılandırma

Depolama Paketleri Oluşturma

Görüntü işleme ardışık düzeniniz için yükleme ve küçük resim içeren Cloud Storage paketleri oluşturma

İki paket oluşturmak için gsutil mb komutunu ve benzersiz bir ad kullanın:

  1. Resimlerin önce yükleneceği yükleme paketi
  2. Oluşturulan küçük resimleri depolamak için küçük resim grubu

Yeni görüntüler yüklemek için paket oluşturun:

gsutil mb -p $PROJECT_ID -l $REGION $UPLOAD_BUCKET

Örnek çıkış:

Creating gs://menu-item-uploads-cymbal-eats-8399-3119/...

Oluşturulan küçük resimleri depolamak için bir paket oluşturun:

gsutil mb -p $PROJECT_ID -l $REGION $BUCKET_THUMBNAILS

Örnek çıkış:

Creating gs://menu-item-thumbnails-cymbal-eats-8399-3119/...

Paket izinlerini güncelleme

Depolama paketi izinlerini kullanıcılara okuma izinleri verecek şekilde güncelleyin.

Paketinizdeki nesneleri okuma ve yazma izni vermek için gsutil iam ch komutunu kullanın:

gsutil iam ch allUsers:objectViewer $UPLOAD_BUCKET
gsutil iam ch allUsers:objectViewer $BUCKET_THUMBNAILS

Örnek çıkış

Updated IAM policy for project [cymbal-eats-8399-3119].
[...]

4. Hizmet hesaplarını yapılandır

Küçük resimleri işlemek için Cloud Functions işlevinin özel bir hizmet hesabı oluşturun:

export CF_SERVICE_ACCOUNT=thumbnail-service-sa
gcloud iam service-accounts create ${CF_SERVICE_ACCOUNT}

Artifact Registry'den okuma işlemlerine izin vermek için artifactregistry.reader rolünü verin:

gcloud projects add-iam-policy-binding $PROJECT_ID \
  --member "serviceAccount:${CF_SERVICE_ACCOUNT}@${PROJECT_ID}.iam.gserviceaccount.com" \
  --role "roles/artifactregistry.reader"

Oluşturulan resimlerin küçük resim paketinde depolanmasına izin vermek için storage.objectCreator rolünü verin:

gcloud projects add-iam-policy-binding $PROJECT_ID \
  --member "serviceAccount:${CF_SERVICE_ACCOUNT}@${PROJECT_ID}.iam.gserviceaccount.com" \
  --role "roles/storage.objectCreator"

Cloud Run hizmet çağrısına izin vermek için run.invoker rolünü verin:

gcloud projects add-iam-policy-binding $PROJECT_ID \
  --member "serviceAccount:${CF_SERVICE_ACCOUNT}@${PROJECT_ID}.iam.gserviceaccount.com" \
  --role "roles/run.invoker"

Sağlayıcılardan etkinlik almaya izin vermek için eventarc.eventReceiver rolünü verin:

gcloud projects add-iam-policy-binding $PROJECT_ID \
  --member "serviceAccount:${CF_SERVICE_ACCOUNT}@${PROJECT_ID}.iam.gserviceaccount.com" \
  --role "roles/eventarc.eventReceiver"

Cloud Storage hizmet hesabına pubsub.publisher rolünü verin. Böylece, görüntüler pakete yüklendiğinde hizmet hesabı etkinlikleri yayınlayabilir.

GCS_SERVICE_ACCOUNT=$(gsutil kms serviceaccount -p $PROJECT_NUMBER)

gcloud projects add-iam-policy-binding $PROJECT_NUMBER \
    --member "serviceAccount:$GCS_SERVICE_ACCOUNT" \
    --role "roles/pubsub.publisher"

5. Resim İşleme İşlevine Genel Bakış

Cloud Storage'dan görüntü indirmek için bir işlev oluşturun, resmin boyutunu değiştirin ve resmi Cloud Storage'a geri yükleyin. İşlev, görüntüye bir açıklama etiketi atamak için Vision API'yi çağırır. İşlev, açıklama etiketini kontrol eder. Etiket, resmi "Yiyecek" olarak tanımlarsa menü seçeneğinin resmini ve küçük resmini güncellemek için menü hizmetine bir etkinlik gönderilir.

4c3c3b758dba6a9f.png

Bir İşlevi Tetikleme

Cloud Storage işlevleri, Cloud Storage'dan gelen Pub/Sub bildirimlerine dayanır ve benzer etkinlik türlerini destekler:

Bu laboratuvarda, Cloud Storage'da bir nesne son haline geldiğinde bir işlevi dağıtacak ve tetikleyeceksiniz.

Nesne Sonlandırma

"Yazma" işlemi yapıldığında nesne sonlandırma etkinlikleri tetiklenir Cloud Storage Nesnesi'nin son hali başarıyla tamamlanır. Özellikle bu, yeni bir nesne oluşturma veya mevcut bir nesnenin üzerine yazmanın bu etkinliği tetikleyeceği anlamına gelir. Bu tetikleyici, arşiv ve meta veri güncelleme işlemlerini yok sayar.

6. Cloud Storage'ı entegre etme

Cloud Storage, nesnelerinizi Google Cloud'da depolamaya yönelik bir hizmettir. Nesne, herhangi bir biçimdeki bir dosyadan oluşan sabit bir veri parçasıdır. Nesneleri, paket adı verilen container'larda depolarsınız. Tüm paketler bir projeyle ilişkilendirilir ve projelerinizi bir kuruluş altında gruplandırabilirsiniz. İstemci kitaplıkları ve API'ler , Cloud Storage ile entegrasyon sağlar.

Bu laboratuvarda, nesneleri okumak ve Cloud Storage'a yazmak için istemci kitaplığını kullanacaksınız.

İstemci kitaplığını yükleme

Cloud istemci kitaplıkları, birçok popüler programlama dilinde mevcuttur. Kitaplıkları kullanmaya başlamak için istemci kitaplığını yüklemeniz gerekir.

İstemci kitaplığını kullanma

Uygulama ayrıntıları büyük ölçüde programlama diline bağlıdır. İstemci kitaplığını uygulamanızda kullanmak için ilk adım, Cloud Storage bağımlılıklarını içe aktarmaktır. Örneğin, Node.js projesinde, içe aktarma işlemleri package.json dosyasına eklenir. Aşağıdaki snippet'te bu laboratuvarın package.json dosyası bildirimi gösterilmektedir.

package.json

{
    "name": "thumbnail-service",
    "version": "0.1.0",
    "dependencies": {
      "@google-cloud/functions-framework": "^3.0.0",
      "@google-cloud/storage": "^5.18.2",
      "@google-cloud/vision": "^2.4.2",
        ...
    }
  }

CloudEvent geri çağırması kaydedin

Pakete yeni bir resim yüklendiğinde Cloud Storage tarafından tetiklenecek Functions Framework ile bir CloudEvent geri çağırması kaydedin.

index.js

functions.cloudEvent('process-thumbnails', async (cloudEvent) => {
    console.log(`Event ID: ${cloudEvent.id}`);
    console.log(`Event Type: ${cloudEvent.type}`);
    ...

Depolama alanı referans nesnesi oluşturma

İstemci kitaplıkları içe aktarıldıktan sonra, uygulamanızın etkileşimde bulunacağı yeni bir depolama alanı istemcisi ve paketler oluşturmanız gerekir.

index.js

const storage = new Storage();
const bucket = storage.bucket(file.bucket);
const thumbBucket = storage.bucket(process.env.BUCKET_THUMBNAILS);

Cloud Storage nesnelerini indirme

index.js

await bucket.file(file.name).download({
            destination: originalFile
        });

Cloud Storage'a nesne yükleme

Cloud Storage'a yükleme isteklerini tekli istek, devam ettirilebilir veya çok parçalı XML API'si üzerinden üç şekilde gönderebilirsiniz. Daha büyük yüklemeler veya canlı yayın yüklemeleri için devam ettirilebilir yüklemeleri kullanın. XML API ile dosyalar parçalar halinde yüklenir ve tek bir nesne olarak birleştirilir. Daha küçük nesneler için tekli istek yüklemelerini kullanın.

Aşağıdaki kod, tek istekli yükleme işlemini kullanarak bir görüntüyü bulut depolama alanına yükler.

index.js

const thumbnailImage = await thumbBucket.upload(thumbFile);

7. Vision API'yi entegre edin

Cloud Vision, geliştiricilerin görüntü etiketleme, yüz ve önemli nokta algılama, optik karakter tanıma (OCR) ve uygunsuz içeriği etiketleme gibi görme algılama özelliklerini uygulamalara kolayca entegre etmesine olanak tanır.

İstemci kitaplığını yükleme

Cloud istemci kitaplıkları, birçok popüler programlama dilinde mevcuttur. Kitaplıkları kullanmaya başlamak için istemci kitaplığını yüklemeniz gerekir.

Resim Annotator İstemcisi Oluşturma

Resmi istemci SDK'larını kullanarak Google API'lerine erişmek için, SDK'nın API'sini açıklayan API'nin keşif dokümanını temel alan bir hizmet nesnesi oluşturursunuz. Kimlik bilgilerinizi kullanarak bu kimliği Vision API'nin keşif hizmetinden getirmeniz gerekir.

index.js

const client = new vision.ImageAnnotatorClient();

Vision API isteği oluşturma

Vision API, görüntü dosyasının içeriğini isteğinizin gövdesine base64 kodlamalı bir dize olarak göndererek görüntü dosyasında özellik algılaması gerçekleştirebilir.

Resim kaynağını kullanarak resminize açıklama eklemek üzere bir istek oluşturmak için. Bu API'ye yapılan istek, istek listesi olan bir nesne biçimini alır. Bu listedeki her öğe iki bit bilgi içerir:

  • base64 kodlu görüntü verileri
  • Söz konusu resim hakkında ek açıklama eklemek istediğiniz özelliklerin listesi.

index.js

        const client = new vision.ImageAnnotatorClient();
        const visionRequest = {
            image: { source: { imageUri: `gs://${file.bucket}/${file.name}` } },
            features: [
                { type: 'LABEL_DETECTION' },
            ]
        };
        const visionPromise = client.annotateImage(visionRequest);

8. Cloud Functions İşlevi Dağıtma

Bu resim yeniden boyutlandırma hizmeti, daha büyük Cymbal Eats sisteminin bir parçasıdır. Bu bölümde yalnızca görüntü işleme özelliğiyle ilgili bileşenleri dağıtacaksınız. Tam yükleme işlemi, resmin yüklenmesi için bir kullanıcı arayüzü ve sonuç olarak ortaya çıkan meta verileri depolamak için bir aşağı akış isteği içerir. Bu özellikler bu laboratuvar kapsamında yüklenmez.

İşlev dağıtımı sırasında aşağıdaki bileşenler oluşturulur:

  • Cloud Functions işlevi
  • Cloud Run hizmeti
  • Eventarc tetikleyicisi
  • Pub/Sub Konusu ve Aboneliği

Cloud Shell terminalinde, menu-item-uploads-$PROJECT_ID üzerinde bir tetikleyici paketiyle Cloud Functions işlevini dağıtmak için aşağıdaki komutu çalıştırın:

gcloud functions deploy process-thumbnails \
  --gen2 \
  --runtime=nodejs16 \
  --source=thumbnail \
  --region=$REGION \
  --project=$PROJECT_ID \
  --entry-point=process-thumbnails \
  --trigger-bucket=$UPLOAD_BUCKET \
  --service-account="${CF_SERVICE_ACCOUNT}@${PROJECT_ID}.iam.gserviceaccount.com" \
  --set-env-vars=BUCKET_THUMBNAILS=$BUCKET_THUMBNAILS,MENU_SERVICE_URL=$MENU_SERVICE_URL \
  --max-instances=1 \
  --quiet

Dağıtım, yükleme depolama paketindeki bir izin sorunu nedeniyle başarısız olursa lütfen önceki adımdaki IAM değişikliklerinin yayılmasını bekleyin. Genellikle 1-2 dakika sürer ve ardından dağıtımı tekrar gerçekleştirmeyi deneyin.

Örnek çıkış

Deploying function (may take a while - up to 2 minutes)...done.
[...] 

Cloud konsolunda oluşturulan Cloud Functions işlevini inceleyin:

8148dd29e6757603.png

Cloud konsolunda işlev için oluşturulan Cloud Run hizmetini inceleyin:

42e970cdd48cae76.png

Cloud Console'da, işlev için oluşturulan Eventarc tetikleyicisini inceleyin:

9441995a5cc62e38.png

Cloud Console'da Eventarc tetikleyicisi için oluşturulan Pub/Sub Konusunu ve Abonelik'i inceleyin:

affe089c39ae1465.png

a4c41ede2af300db.png

9. Uçtan uca çözümü test edin ve doğrulayın

Cloud Storage'a yeni bir fotoğraf yükleyin ve görüntüler analiz edilirken ardışık düzenin ilerlemesini izleyin. Cloud Functions günlüklerini izleyerek uçtan uca çözümü test edeceksiniz.

Uygun bir resim yükleme

2fdd13b63d6148f4.jpeg

  1. Bu görüntüyü yerel makinenize kaydedin
  2. Dosyayı 1.jpg olarak yeniden adlandırın.
  3. Cloud Storage konsolunu açın
  4. menu-item-uploads-... grubunu tıklayın
  5. DOSYALARI YÜKLE'yi tıklayın.
  6. Depolama paketine 1.jpg dosyasını yükleme
  7. Cloud Console'da Cloud Functions'a gidin.
  8. İşleme-küçük resimleri'ni tıklayın
  9. GÜNLÜKLER sekmesini tıklayın.

7ab4e783e474c90d.png

  1. menu-item-thumbnails-$PROJECT_ID Cloud Storage paketine gidin
  2. Küçük resim paketinde küçük resim oluşturulduğunu doğrulayın

84d8023782eb3e0c.png

Gıda olmayan resim yükleme

İşlevin düzgün çalıştığını doğrulamak için, "Yiyecek" olarak sınıflandırılacak bir nesne içermeyen bir resim yükleyin. öğe.

3226a24251084b28.jpeg

  1. Bu görüntüyü yerel makinenize kaydedin
  2. Dosyayı 2.jpg olarak yeniden adlandırın.
  3. Cloud Storage konsolunu açın
  4. menu-item-uploads-... grubunu tıklayın
  5. DOSYALARI YÜKLE'yi tıklayın.
  6. Depolama paketine 2.jpg dosyasını yükleme
  7. Cloud Console'da Cloud Functions'a gidin.
  8. İşleme-küçük resimleri'ni tıklayın
  9. GÜNLÜKLER sekmesini tıklayın.

421c36c342fceea8.png

10. Tebrikler!

Tebrikler, laboratuvarı tamamladınız.

Sıradaki adım:

Diğer Cymbal Eats codelab'lerini keşfedin:

Temizleme

Bu eğiticide kullanılan kaynaklar için Google Cloud hesabınızın ücretlendirilmesini istemiyorsanız kaynakları içeren projeyi silin veya projeyi tutup tek tek kaynakları silin.

Projeyi silme

Faturalandırmayı ortadan kaldırmanın en kolay yolu, eğitim için oluşturduğunuz projeyi silmektir.