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ı) oluşturacaksınız. Resimler paketinden bir resim silindiğinde hizmet, Eventarc'tan bir etkinlik alır. Ardından, resmi küçük resimler 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

Yönlendirmesiz 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 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 dizisidir ve istediğiniz zaman güncelleyebilirsiniz.
  • Proje kimliği, tüm Google Cloud projelerinde benzersiz olmalı 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ğine (genellikle PROJECT_ID olarak tanımlanır) başvurmanız gerekir. Bu nedenle, beğenmezseniz başka bir rastgele kimlik oluşturabilir veya kendi kimliğinizi deneyip kullanılabilir olup olmadığını görebilirsiniz. Proje oluşturulduktan sonra bu değer "dondurulur".
  • 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 neredeyse hiç maliyetli değildir. Bu eğitimin ötesinde faturalandırma ücreti alınmaması için kaynakları kapatmak üzere codelab'in sonunda bulunan "temizleme" talimatlarını uygulayın. 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:

bce75f34b2c53987.png

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:

f6ef2b5f13479f3a.png

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. Eventarc'a giriş

Eventarc, Cloud Run hizmetlerini çeşitli kaynaklardaki etkinliklere bağlamayı kolaylaştırır. Etkinlik alımı, teslimi, güvenliği, yetkilendirme ve hata işleme işlemlerini sizin için gerçekleştirir.

776ed63706ca9683.png

Google Cloud kaynaklarından ve Cloud Pub/Sub'a yayın yapan özel uygulamalardan etkinlikler çekebilir ve bunları Google Cloud Run havuzlarına iletebilirsiniz.

Çeşitli Google Cloud kaynaklarındaki etkinlikler Cloud Denetleme Günlükleri aracılığıyla sağlanır. Bu kaynaklardan etkinlik tesliminin gecikme süresi ve kullanılabilirliği, Cloud Denetleme Günlükleri'ninkine bağlıdır. Bir Google Cloud kaynağından etkinlik tetiklendiğinde ilgili bir Cloud Denetleme Günlüğü girişi oluşturulur.

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

Etkinlik tetikleyicileri, hangi etkinliklerin hangi hedefe teslim edileceğini belirten filtreleme mekanizmasıdır.

Tüm etkinlikler, hizmetler arası birlikte çalışabilirlik için CloudEvents v1.0 biçiminde sunulur.

4. Başlamadan önce

API'leri etkinleştir

Cloud Run hizmetini tetiklemek için Eventarc hizmetine ihtiyacınız vardır. Etkinleştirildiğinden emin olun:

gcloud services enable eventarc.googleapis.com

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

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 hizmet 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. Eventarc Cloud Storage tetikleyicisi için bu 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 daha önce 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 klonlayın

Önceki kod laboratuvarında henüz 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örde 3 dosya bulunur:

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

6. Kodu keşfetme

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 verilerini de silmek için Cloud Firestore'a bağımlılık bildiriyoruz. Ayrıca, Eventarc tarafından gönderilen CloudEvents'i okumak için CloudEvents SDK'sına ve Google Events kitaplıklarına bağımlıyız. Express, bir JavaScript / Node web çerçevesidir. Bluebird, sözleri işlemek 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 vardır: Express, kullanacağımız Node web çerçevesidir. Bluebird, JavaScript vaatlerini işlemek için kullanılan bir kitaplıktır. Storage ve Firestore, sırasıyla Google Cloud Storage (resim paketlerimiz) ve Cloud Firestore veri deposuyla çalışmak için kullanılır. Ayrıca, CloudEvent'in Cloud Storage etkinlik gövdesini okumak için Google Events 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, Node işleyicimizin yapısını görüyoruz: Uygulamamız HTTP POST isteklerine yanıt veriyor. HTTP isteğinden CloudEvent'i okur ve bir hata oluşması ihtimaline karşı biraz hata işleme yaparız. Ş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 küçük resimler 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 Node komut dosyamızın gelen istekleri dinlemesini sağlama zamanı. 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 etme

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

garbage-collector/nodejs klasöründe npm bağımlılıklarını yükleyin ve sunucuyu başlatın:

export BUCKET_THUMBNAILS=thumbnails-$GOOGLE_CLOUD_PROJECT

npm install; npm start

Her şey yolunda gittiyse sunucu 8080 numaralı bağlantı noktasında başlatılır:

Started service on port 8080

Çıkmak için CTRL-C öğesini kullanın.

8. Cloud Run'da derleme ve dağıtım

Cloud Run'a dağıtmadan önce Cloud Run bölgesini desteklenen bölgelerden biri olarak 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 ayarlandığını şu şekilde kontrol edebilirsiniz:

gcloud config list

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

Cloud Build'i kullanarak container görüntüsünü manuel olarak oluşturup yayınlamak yerine, Google Cloud Buildpacks'i kullanarak container görüntüsünü sizin için oluşturması konusunda Cloud Run'a da güvenebilirsiniz.

Google Cloud Buildpack'leri kullanarak container görüntüsünü oluşturmak ve ardından container görüntüsünü Cloud Run'a dağıtmak için aşağıdaki komutu çalıştırı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, Cloud Run'ı Google Cloud Buildpack'leri kullanarak kapsayıcı görüntüsünü Dockerfile. olmadan oluşturacak şekilde 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, dahili Cloud Run hizmetlerini çağırmak için run.invoker rolüne sahip varsayılan işlem hizmeti hesabıyla bir tetikleyici oluşturacaksınız.

9. Tetikleyici oluşturma

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

Tetikleyici'nin konumunu, yüklenen resimlerin bulunduğu paketle 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şturulduğunu aşağıdaki komutla doğrulayabilirsiniz:

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, thumbnails paketindeki ilgili resmi ve dokümanını pictures Firestore koleksiyonundan sildiğini hizmet günlüklerinde görmeniz gerekir.

519abf90e7ea4d12.png

11. Temizleme (isteğe bağlı)

Serideki diğer laboratuvarlara devam etmeyi düşünmüyorsanız maliyetleri düşürmek ve genel olarak iyi bir bulut kullanıcısı olmak için kaynakları temizleyebilirsiniz. Kaynakları tek tek aşağıdaki şekilde temizleyebilirsiniz.

Hizmeti silme:

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 almak için yeni bir hizmet olan Eventarc tarafından tetiklenen bir Cloud Run hizmeti (görüntü çöp toplayıcı) oluşturdunuz. Resimler paketinden bir resim silindiğinde hizmet, Eventarc'tan bir etkinlik alır. Ardından, resmi küçük resimler paketinden siler ve Firestore resim koleksiyonundan da kaldırır.

İşlediğimiz konular

  • Cloud Run
  • Cloud Storage
  • Cloud Firestore
  • Eventarc