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.

Neler öğreneceksiniz?
- Cloud Run
- Cloud Storage
- Cloud Firestore
- Eventarc
2. Kurulum ve Gereksinimler
Yönlendirmesiz ortam kurulumu
- 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.



- 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_IDolarak 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.
- 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:

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

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.

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