Günlük resim: Laboratuvar 3: En yeni resimlerden bir kolaj oluşturun

Günlük resim:
Laboratuvar 3:
En yeni resimlerden bir kolaj oluşturun

Bu codelab hakkında

subjectSon güncelleme Oca 31, 2023
account_circleYazan: Guillaume Laforge, Mete Atamel

1. Genel Bakış

Bu kod laboratuvarında, Cloud Scheduler tarafından düzenli aralıklarla tetiklenecek yeni bir Cloud Run hizmeti (kolaj hizmeti) oluşturacaksınız. Hizmet, en son yüklenen resimleri getirir ve bu resimlerden bir kolaj oluşturur: Cloud Firestore'daki son resimlerin listesini bulur ve ardından gerçek resim dosyalarını Cloud Storage'dan indirir.

df20f5d0402b54b4.png

Neler öğreneceksiniz?

  • Cloud Run
  • Cloud Scheduler
  • Cloud Storage
  • Cloud Firestore

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. API'leri etkinleştir

Cloud Run hizmetini düzenli aralıklarla tetiklemek için bir Cloud Scheduler gerekir. Etkin olduğundan emin olun:

gcloud services enable cloudscheduler.googleapis.com

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

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

4. 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/collage/nodejs

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

services
 |
 ├── collage
      |
      ├── nodejs
           |
           ├── Dockerfile
           ├── 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
  • Dockerfile, container görüntüsünü tanımlar

5. Kodu inceleyin

Bağımlılıklar

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

{
 
"name": "collage_service",
 
"version": "0.0.1",
 
"main": "index.js",
 
"scripts": {
   
"start": "node index.js"
 
},
 
"dependencies": {
   
"bluebird": "^3.7.2",
   
"express": "^4.17.1",
   
"imagemagick": "^0.1.3",
   
"@google-cloud/firestore": "^4.9.9",
   
"@google-cloud/storage": "^5.8.3"
 
}
}

Cloud Storage'daki görüntü dosyalarını okumak ve kaydetmek için Cloud Storage kitaplığından yararlanırız. Daha önce depoladığımız resim meta verilerini getirmek için Cloud Firestore'a bağımlılık bildiriyoruz. Express, bir JavaScript / Düğüm web çerçevesidir. Bluebird, verilen görevleri yerine getirmek için kullanılıyor. imagemagick, resimleri değiştirmek için kullanılan bir kitaplıktır.

Dockerfile

Dockerfile, uygulamanın container görüntüsünü tanımlar:

FROM node:14-slim

# installing Imagemagick
RUN
set -ex; \
  apt
-get -y update; \
  apt
-get -y install imagemagick; \
  rm
-rf /var/lib/apt/lists/*

WORKDIR /picadaily/services/collage
COPY package*.json ./
RUN npm install --production
COPY . .
CMD [ "npm", "start" ]

Açık renkli bir Node 14 temel görüntüsü kullanıyoruz. imagemagick kitaplığını yüklüyoruz. Ardından, kodumuzun gerektirdiği NPM modüllerini yükleyeceğiz ve düğüm kodumuzu npm başlangıcında çalıştıracağız.

index.js

index.js kodumuzu daha yakından inceleyelim:

const express = require('express');
const imageMagick = require('imagemagick');
const Promise = require("bluebird");
const path = require('path');
const {Storage} = require('@google-cloud/storage');
const Firestore = require('@google-cloud/firestore');

Programımızın çalışması için gereken çeşitli bağımlılıklar gereklidir: Express, kullanacağımız Düğüm web çerçevesi, ImageMagick, görüntü işleme yönelik kitaplık, Bluebird, JavaScript vaatlerini yönetmek için kullanılan bir kitaplıktır, Path dosya ve dizin yollarının işlenmesi için kullanılır. Path'in amacı dosya ve dizin yollarının işlenmesidir. Storage ve Firestore, sırasıyla Google Cloud Storage (resim paketlerimiz) ve Cloud Firestore veri deposuyla çalışmak için kullanılır.

const app = express();

app
.get('/', async (req, res) => {
   
try {
        console
.log('Collage request');

       
/* ... */

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

Yukarıda, Düğüm işleyicimizin yapısını görebilirsiniz: Uygulamamız HTTP GET isteklerine yanıt verir. Ayrıca, bir şeyler ters giderse diye bazı hataları ele alıyoruz. Şimdi bu yapının içinde neler olduğuna bakalım.

const thumbnailFiles = [];
const pictureStore = new Firestore().collection('pictures');
const snapshot = await pictureStore
   
.where('thumbnail', '==', true)
   
.orderBy('created', 'desc')
   
.limit(4).get();

if (snapshot.empty) {
    console
.log('Empty collection, no collage to make');
    res
.status(204).send("No collage created.");
} else {

   
/* ... */

}

Kolaj hizmetimiz için en az dört resim (küçük resimleri oluşturulmuş) gerekir. Bu nedenle önce 4 resim yüklediğinizden emin olun.

Kullanıcılarımızın yüklediği son 4 resmi, Cloud Firerstore'da depolanan meta verilerden alırız. Elde edilen koleksiyonun boş olup olmadığını kontrol eder ve kodumuzun else dalında işleme devam ederiz.

Dosya adları listesini toplayalım:

snapshot.forEach(doc => {
    thumbnailFiles
.push(doc.id);
});
console
.log(`Picture file names: ${JSON.stringify(thumbnailFiles)}`);

Bu dosyaların her birini küçük resim paketinden indireceğiz. Küçük resim paketinin adı, dağıtım sırasında belirlediğimiz bir ortam değişkeninden alınır:

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

await
Promise.all(thumbnailFiles.map(async fileName => {
   
const filePath = path.resolve('/tmp', fileName);
    await thumbBucket
.file(fileName).download({
        destination
: filePath
   
});
}));
console
.log('Downloaded all thumbnails');

En son küçük resimler yüklendikten sonra, bu küçük resimlerden oluşan 4x4 bir ızgara oluşturmak için ImageMagick kitaplığını kullanacağız. Geri çağırma odaklı kodu async / await uyumlu koda dönüştürmek için Bluebird kitaplığını ve Promise uygulamasını kullanıyoruz. Ardından resim kolajını geliştirmek için çalışıyoruz:

const collagePath = path.resolve('/tmp', 'collage.png');

const thumbnailPaths = thumbnailFiles.map(f => path.resolve('/tmp', f));
const convert = Promise.promisify(im.convert);
await convert
([
   
'(', ...thumbnailPaths.slice(0, 2), '+append', ')',
   
'(', ...thumbnailPaths.slice(2), '+append', ')',
   
'-size', '400x400', 'xc:none', '-background', 'none',  '-append',
    collagePath
]);
console
.log("Created local collage picture");

Kolaj resmi diske geçici olarak geçici olarak kaydedildiğinden, şimdi Cloud Storage'a yüklememiz ve başarılı bir yanıt döndürmemiz gerekiyor (durum kodu 2xx):

await thumbBucket.upload(collagePath);
console
.log("Uploaded collage to Cloud Storage bucket ${process.env.BUCKET_THUMBNAILS}");

res
.status(204).send("Collage created.");

Şimdi sıra, Düğüm komut dosyamızın gelen istekleri dinlemesini sağlamak:

const PORT = process.env.PORT || 8080;

app
.listen(PORT, () => {
    console
.log(`Started collage service on port ${PORT}`);
});

Kaynak dosyamızın sonunda, Express'in web uygulamamızı gerçekten 8080 varsayılan bağlantı noktasında başlatmasını sağlama talimatlarını bulabilirsiniz.

6. Yerel olarak test et

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

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

npm install; npm start

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

Started collage service on port 8080

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

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

gcloud config set run/region europe-west1
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.

Container görüntüsünü derlemek için aşağıdaki komutu çalıştırın:

BUCKET_THUMBNAILS=thumbnails-$GOOGLE_CLOUD_PROJECT
SERVICE_NAME=collage-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'daki kaynak tabanlı dağıtımdır . Kaynak kodu dizininde bir Dockerfile varsa yüklenen kaynak kodu bu Dockerfile kullanılarak oluşturulur. Kaynak kodu dizininde Dockerfile yoksa Google Cloud derleme paketleri, kullandığınız dili otomatik olarak algılar ve Google tarafından yönetilen güvenli bir temel görüntü kullanarak üretime hazır bir container görüntüsü oluşturmak için kodun bağımlılıklarını getirir. Bu işlem, Cloud Run'ı Dockerfile politikasında tanımlanan container görüntüsünü oluşturmak için Google Cloud Buildpacks'i kullanması yönünde işaretler.

Kaynak tabanlı dağıtımın, derlenen container'ları depolamak için Artifact Registry'yi kullandığını da unutmayın. Artifact Registry, Google Container Registry'nin modern bir sürümüdür. CLI, projede etkinleştirilmemişse API'yi etkinleştirmenizi ister ve dağıtım yaptığınız bölgede cloud-run-source-deploy adlı bir depo oluşturur.

--no-allow-unauthenticated işareti, Cloud Run hizmetini yalnızca belirli hizmet hesapları tarafından tetiklenen bir dahili hizmet haline getirir.

8. Cloud Scheduler'ı kurma

Cloud Run hizmeti hazır ve dağıtıldığına göre artık düzenli programı oluşturup hizmeti dakikada bir çağırabilirsiniz.

Bir hizmet hesabı oluşturun:

SERVICE_ACCOUNT=collage-scheduler-sa
gcloud iam service-accounts create $SERVICE_ACCOUNT \
   --display-name "Collage Scheduler Service Account"

Hizmet hesabına Cloud Run hizmetini çağırma izni verin:

gcloud run services add-iam-policy-binding $SERVICE_NAME \
   --member=serviceAccount:$SERVICE_ACCOUNT@$GOOGLE_CLOUD_PROJECT.iam.gserviceaccount.com \
   --role=roles/run.invoker

Her 1 dakikada bir yürütülecek bir Cloud Scheduler işi oluşturun:

SERVICE_URL=$(gcloud run services describe $SERVICE_NAME --format 'value(status.url)')
gcloud scheduler jobs create http $SERVICE_NAME-job --schedule "* * * * *" \
   --http-method=GET \
   --location=europe-west1 \
   --uri=$SERVICE_URL \
   --oidc-service-account-email=$SERVICE_ACCOUNT@$GOOGLE_CLOUD_PROJECT.iam.gserviceaccount.com \
   --oidc-token-audience=$SERVICE_URL

Cloud Console'daki Cloud Scheduler bölümüne giderek dosyanın kurulduğunu ve Cloud Run hizmet URL'sine işaret ettiğini görebilirsiniz:

35119e28c1da53f3.png

9. Hizmeti test etme

Kurulumun çalışıp çalışmadığını test etmek için kolaj resminin (collage.png adlı) thumbnails grubunu kontrol edin. Hizmetin günlüklerini de kontrol edebilirsiniz:

93922335a384be2e.png

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

Cloud Scheduler işini silin:

gcloud scheduler jobs delete $SERVICE_NAME-job -q

Alternatif olarak projenin tamamını silebilirsiniz:

gcloud projects delete $GOOGLE_CLOUD_PROJECT

11. Tebrikler!

Tebrikler! Planlı bir hizmet oluşturdunuz: Pub/Sub konularına dakikada bir ileti ileten Cloud Scheduler sayesinde Cloud Run kolaj hizmetiniz çağrılır. Bu hizmet, oluşturulan resimleri bir araya getirerek belirli bir resim elde etmenizi sağlar.

İşlediklerimiz

  • Cloud Run
  • Cloud Scheduler
  • Cloud Storage
  • Cloud Firestore

Sonraki Adımlar