Günlük resim: Laboratuvar 5 - Görüntü silindikten sonra temizleme

1. Genel Bakış

Bu kod laboratuvarında, Cloud Run'da etkinlik almak için yeni bir hizmet olan Eventarc tarafından tetiklenecek yeni bir Cloud Run hizmeti (görüntü çöpü toplayıcısı) oluşturacaksınız. Resim paketinden bir resim silindiğinde hizmet, Eventarc'tan bir etkinlik alır. Ardından, resmi küçük resim paketinden siler ve Firestore resim koleksiyonundan da kaldırır.

d93345bfc235f81e.png

Neler öğreneceksiniz?

  • Cloud Run
  • Cloud Storage
  • Cloud Firestore
  • Eventarc

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.

96a9c957bc475304.png

b9a10ebdf5b5a448.png

a1e3c01a38fa61c2.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 ve bunu istediğiniz zaman güncelleyebilirsiniz.
  • Proje Kimliği, tüm Google Cloud projelerinde benzersiz olmalıdır 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ğine referans vermeniz gerekir (ve bu kimlik genellikle PROJECT_ID olarak tanımlanır). Beğenmezseniz başka bir rastgele kod oluşturun ya da kendi proje kimliğinizi deneyip mevcut olup olmadığına bakın. Sıcaklık "soğudu" takip etmeniz gerekir.
  • 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. Ardından, 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ırmayla karşılaşmamak için kaynakları kapatmak istiyorsanız tüm "temizleme" işlemlerini uygulayın buradaki talimatları uygulayın. 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. Eventarc'a Giriş

Eventarc, Cloud Run hizmetlerini çeşitli kaynaklardan gelen etkinliklere bağlamayı kolaylaştırır. Etkinlik kullanımı, teslimi, güvenlik, yetkilendirme ve hata giderme gibi işleri sizin yerinize halleder.

776ed63706ca9683.png

Google Cloud kaynaklarından ve Cloud Pub/Sub'a yayınlanan özel uygulamalardan etkinlik alabilir ve bu etkinlikleri Google Cloud Run havuzlarına dağıtabilirsiniz.

Çeşitli Google Cloud kaynaklarından gelen etkinlikler, Cloud Denetleme Günlükleri aracılığıyla sağlanır. Bu kaynaklardan gelen olay yayınındaki gecikme ve kullanılabilirlik, Cloud Denetleme Günlüklerine bağlıdır. Bir Google Cloud kaynağından bir etkinlik tetiklendiğinde buna karşılık gelen bir Cloud Denetleme Günlüğü girişi oluşturulur.

Cloud Pub/Sub'a yayınlanan özel uygulamalar, herhangi bir biçimde belirttikleri bir Pub/Sub konusuna mesaj yayınlayabilir.

Etkinlik tetikleyicileri, hangi etkinliklerin hangi havuza yayınlanacağını belirleyen filtreleme mekanizmasıdır.

Hizmetler arası birlikte çalışabilirlik için tüm etkinlikler, CloudEvents v1.0 biçiminde sağlanır.

4. Başlamadan önce

API'leri etkinleştir

Cloud Run hizmetini tetiklemek için Eventarc hizmetine ihtiyacınız vardır. Etkin olduğundan emin olun:

gcloud services enable eventarc.googleapis.com

İşlemin başarıyla tamamlandığını göreceksiniz:

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

Hizmet hesaplarını yapılandır

Tetikleyicilerde varsayılan Compute hizmet hesabı kullanılır. Varsayılan Compute Engine hizmeti hesabına eventarc.eventReceiver rolünü verin:

PROJECT_NUMBER=$(gcloud projects describe $GOOGLE_CLOUD_PROJECT --format='value(projectNumber)')

gcloud projects add-iam-policy-binding $GOOGLE_CLOUD_PROJECT \
    --member serviceAccount:$PROJECT_NUMBER-compute@developer.gserviceaccount.com \
    --role roles/eventarc.eventReceiver

Cloud Storage hizmet hesabına pubsub.publisher rolünü verin. Bu, Eventarc Cloud Storage tetikleyicisi için gereklidir:

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

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

Pub/Sub hizmet hesabını 8 Nisan 2021'de veya öncesinde etkinleştirdiyseniz Pub/Sub hizmet hesabına iam.serviceAccountTokenCreator rolünü verin:

gcloud projects add-iam-policy-binding $PROJECT_ID \
  --member serviceAccount:service-$PROJECT_NUMBER@gcp-sa-pubsub.iam.gserviceaccount.com \
  --role roles/iam.serviceAccountTokenCreator

5. Kodu klonlama

Önceki kod laboratuvarında yapmadıysanız kodu klonlayın:

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

Ardından, hizmeti içeren dizine gidebilirsiniz:

cd serverless-photosharing-workshop/services/garbage-collector/nodejs

Hizmet için aşağıdaki dosya düzenine sahip olursunuz:

services
 |
 ├── garbage-collector
      |
      ├── nodejs
           |
           ├── index.js
           ├── package.json

Klasörün içinde 3 dosya bulunur:

  • index.js, Node.js kodunu içerir
  • package.json, kitaplık bağımlılıklarını tanımlar

6. Kodu inceleyin

Bağımlılıklar

package.json dosyası, gerekli kitaplık bağımlılıklarını tanımlar:

{
  "name": "garbage_collector_service",
  "version": "0.0.1",
  "main": "index.js",
  "scripts": {
    "start": "node index.js"
  },
  "dependencies": {
    "cloudevents": "^4.0.1",
    "express": "^4.17.1",
    "@google/events": "^3.1.0",
    "@google-cloud/firestore": "^4.9.9",
    "@google-cloud/storage": "^5.8.3"
  }
}

Cloud Storage'daki görüntüleri silmek için Cloud Storage kitaplığını kullanırız. Daha önce depoladığımız resim meta verilerinin de silinmesi için Cloud Firestore'a bağımlılık bildiriyoruz. Ek olarak, Eventarc tarafından gönderilen CloudEvents'ı okumak için CloudEvents SDK'sı ve Google Etkinlik kitaplıkları kullanılır. Express, bir JavaScript / Düğüm web çerçevesidir. Bluebird, verilen sözlerin yerine getirilmesi için kullanılır.

index.js

index.js kodumuzu daha yakından inceleyelim:

const express = require('express');
const {Storage} = require('@google-cloud/storage');
const Firestore = require('@google-cloud/firestore');
const { HTTP } = require("cloudevents");
const {toStorageObjectData} = require('@google/events/cloud/storage/v1/StorageObjectData');

Programımızın çalışması için gereken çeşitli bağımlılıklar mevcuttur: Express, kullanacağımız Düğüm web çerçevesi, Bluebird, JavaScript etkinliklerini yerine getirmek için bir kitaplıktır. Storage ve Firestore, sırasıyla Google Cloud Storage (resim paketlerimiz) ve Cloud Firestore veri deposu ile çalışmak içindir. Ek olarak, CloudEvent'in Cloud Storage etkinlik gövdesini okumak için CloudEvent'in, Google Etkinlik kitaplığından Eventarc StoreObjectData tarafından gönderilen CloudEvent'i okuması gerekir.

const app = express();
app.use(express.json());

app.post('/', async (req, res) => {
    try {
        const cloudEvent = HTTP.toEvent({ headers: req.headers, body: req.body });
        console.log(cloudEvent);


        /* ... */

    } catch (err) {
        console.log(`Error: ${err}`);
        res.status(500).send(err);
    }
});

Yukarıda, Düğüm işleyicimizin yapısını görebilirsiniz: Uygulamamız HTTP POST isteklerine yanıt verir. CloudEvent'i HTTP isteğinden okuyor. Bir şeyler ters gitse bile bazı hatalarla ilgili işlemler yapıyoruz. Şimdi bu yapının içinde neler olduğuna bakalım.

Sonraki adım, CloudEvent gövdesini alıp ayrıştırmak ve nesne adını almaktır:

const storageObjectData = toStorageObjectData(cloudEvent.data);
console.log(storageObjectData);

const objectName = storageObjectData.name;

Resim adını öğrendikten sonra resmi küçük resim paketinden silebiliriz:

try {
    await storage.bucket(bucketThumbnails).file(objectName).delete();
    console.log(`Deleted '${objectName}' from bucket '${bucketThumbnails}'.`);
}
catch(err) {
    console.log(`Failed to delete '${objectName}' from bucket '${bucketThumbnails}': ${err}.`);
}

Son adım olarak, resim meta verilerini Firestore koleksiyonundan da silin:

try {
    const pictureStore = new Firestore().collection('pictures');
    const docRef = pictureStore.doc(objectName);
    await docRef.delete();

    console.log(`Deleted '${objectName}' from Firestore collection 'pictures'`);
}
catch(err) {
    console.log(`Failed to delete '${objectName}' from Firestore: ${err}.`);
}

res.status(200).send(`Processed '${objectName}'.`);

Şimdi sıra Düğüm komut dosyamızın gelen istekleri dinlemesini sağlamak. Ayrıca, gerekli ortam değişkenlerinin ayarlandığından emin olun:

app.listen(PORT, () => {
    if (!bucketThumbnails) throw new Error("BUCKET_THUMBNAILS not set");
    console.log(`Started service on port ${PORT}`);
});

7. Yerel olarak test et

Buluta dağıtmadan önce çalıştığından emin olmak için kodu yerel olarak test edin.

garbage-collector/nodejs klasörünün içinde, npm bağımlılarını yükleyin ve sunucuyu başlatın:

export BUCKET_THUMBNAILS=thumbnails-$GOOGLE_CLOUD_PROJECT

npm install; npm start

Her şey yolundaysa sunucu, 8080 numaralı bağlantı noktasından başlatılmalıdır:

Started service on port 8080

Çıkmak için CTRL-C tuşunu kullanın.

8. Derleme ve Cloud Run'a dağıtma

Cloud Run'a dağıtmadan önce Cloud Run bölgesini desteklenen bölgelerden birine ve platformu managed olarak ayarlayın:

REGION=europe-west1
gcloud config set run/region $REGION
gcloud config set run/platform managed

Yapılandırmanın ayarlanıp ayarlanmadığını kontrol edebilirsiniz:

gcloud config list

...
[run]
platform = managed
region = europe-west1

Cloud Build'i kullanarak manuel olarak container görüntüsü oluşturup yayınlamak yerine, Google Cloud Buildpacks'i kullanarak container görüntüsünü oluşturma konusunda Cloud Run'dan da yararlanabilirsiniz.

Google Cloud Buildpack'leri kullanarak container görüntüsünü oluşturmak için aşağıdaki komutu çalıştırın, ardından container görüntüsünü Cloud Run'a dağıtın:

SERVICE_NAME=garbage-collector-service

gcloud run deploy $SERVICE_NAME \
    --source . \
    --no-allow-unauthenticated \
    --update-env-vars BUCKET_THUMBNAILS=$BUCKET_THUMBNAILS

–-source işaretine dikkat edin. Bu işlem, Cloud Run'ı Dockerfile. olmadan container görüntüsü oluşturmak üzere Google Cloud Buildpacks'i kullanması için işaretler. --no-allow-unauthenticated işareti, Cloud Run hizmetini yalnızca belirli hizmet hesapları tarafından tetiklenecek bir dahili hizmet haline getirir. Daha sonra varsayılan Compute Engine hizmet hesabını kullanarak dahili Cloud Run hizmetlerini çağırmak için run.invoker rolüne sahip bir tetikleyici oluşturacaksınız.

9. Tetikleyici oluşturun

Eventarc'ta bir tetikleyici, hangi hizmetin ne tür etkinlikler alması gerektiğini tanımlar. Bu durumda, paketteki bir dosya silindiğinde hizmetin etkinlikleri almasını istersiniz.

Tetikleyicinin konumunu yüklenen resim grubu ile aynı bölgeye ayarlayın:

gcloud config set eventarc/location eu

storage.objects.delete etkinliklerini filtrelemek ve Cloud Run hizmetine göndermek için bir AuditLog tetikleyicisi oluşturun:

BUCKET_IMAGES=uploaded-pictures-$GOOGLE_CLOUD_PROJECT

gcloud eventarc triggers create trigger-$SERVICE_NAME \
  --destination-run-service=$SERVICE_NAME \
  --destination-run-region=$REGION \
  --event-filters="type=google.cloud.storage.object.v1.deleted" \
  --event-filters="bucket=$BUCKET_IMAGES" \
  --service-account=$PROJECT_NUMBER-compute@developer.gserviceaccount.com

Tetikleyicinin oluşturulup oluşturulmadığını şu komutla tekrar kontrol edebilirsiniz:

gcloud eventarc triggers list

10. Hizmeti test etme

Hizmetin çalışıp çalışmadığını test etmek için uploaded-pictures paketine gidin ve resimlerden birini silin. Hizmetin günlüklerinde, thumbnails paketindeki ilgili resmi ve dokümanın pictures Firestore koleksiyonundan sildiğini görebilirsiniz.

519abf90e7ea4d12.png

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

Serideki diğer laboratuvarlarla devam etmeyi düşünmüyorsanız maliyet tasarrufu yapmak ve genel olarak iyi bir bulut vatandaşı olmak için kaynakları temizleyebilirsiniz. Kaynakları aşağıda açıklandığı şekilde tek tek temizleyebilirsiniz.

Hizmeti silin:

gcloud run services delete $SERVICE_NAME -q

Eventarc tetikleyicisini silin:

gcloud eventarc triggers delete trigger-$SERVICE_NAME -q

Alternatif olarak projenin tamamını silebilirsiniz:

gcloud projects delete $GOOGLE_CLOUD_PROJECT

12. Tebrikler!

Tebrikler! Cloud Run'da etkinlik almaya yönelik yeni bir hizmet olan Eventarc tarafından tetiklenen bir Cloud Run hizmeti (görüntü çöp toplayıcısı) oluşturdunuz. Resim paketinden bir resim silindiğinde hizmet, Eventarc'tan bir etkinlik alır. Ardından, resmi küçük resim paketinden siler ve Firestore resim koleksiyonundan da kaldırır.

İşlediklerimiz

  • Cloud Run
  • Cloud Storage
  • Cloud Firestore
  • Eventarc