Foto setiap hari: Lab 5—Pembersihan setelah penghapusan gambar

1. Ringkasan

Di codelab ini, Anda akan membuat layanan Cloud Run baru, pembersih sampah gambar, yang akan dipicu oleh Eventarc, layanan baru untuk menerima peristiwa di Cloud Run. Saat gambar dihapus dari bucket gambar, layanan akan menerima peristiwa dari Eventarc. Kemudian, tindakan ini akan menghapus gambar dari bucket thumbnail dan juga menghapusnya dari koleksi gambar Firestore.

d93345bfc235f81e.png

Yang akan Anda pelajari

  • Cloud Run
  • Cloud Storage
  • Cloud Firestore
  • Eventarc

2. Penyiapan dan Persyaratan

Penyiapan lingkungan mandiri

  1. Login ke Google Cloud Console dan buat project baru atau gunakan kembali project yang sudah ada. Jika belum memiliki akun Gmail atau Google Workspace, Anda harus membuatnya.

96a9c957bc475304.png

b9a10ebdf5b5a448.png

a1e3c01a38fa61c2.png

  • Project name adalah nama tampilan untuk peserta project ini. String ini adalah string karakter yang tidak digunakan oleh Google API, dan Anda dapat memperbaruinya kapan saja.
  • Project ID harus unik di semua project Google Cloud dan tidak dapat diubah (tidak dapat diubah setelah ditetapkan). Cloud Console otomatis menghasilkan string unik; biasanya Anda tidak peduli dengan kata-katanya. Pada sebagian besar codelab, Anda harus mereferensikan Project ID (dan biasanya diidentifikasi sebagai PROJECT_ID). Jadi, jika Anda tidak menyukainya, buat ID acak lain, atau, Anda dapat mencoba sendiri dan melihat apakah tersedia. Kemudian file akan "dibekukan" setelah project dibuat.
  • Ada nilai ketiga, Nomor Project yang digunakan oleh beberapa API. Pelajari lebih lanjut ketiga nilai ini di dokumentasi.
  1. Selanjutnya, Anda harus mengaktifkan penagihan di Cloud Console untuk menggunakan API/resource Cloud. Menjalankan operasi dalam codelab ini seharusnya tidak memerlukan banyak biaya, bahkan mungkin tidak sama sekali. Untuk menonaktifkan resource agar tidak menimbulkan penagihan di luar tutorial ini, ikuti petunjuk "pembersihan" yang ada di akhir codelab. Pengguna baru Google Cloud memenuhi syarat untuk mengikuti program Uji Coba Gratis senilai $300 USD.

Mulai Cloud Shell

Meskipun Google Cloud dapat dioperasikan dari jarak jauh menggunakan laptop Anda, dalam codelab ini, Anda akan menggunakan Google Cloud Shell, lingkungan command line yang berjalan di Cloud.

Dari GCP Console, klik ikon Cloud Shell di toolbar kanan atas:

bce75f34b2c53987.png

Hanya perlu waktu beberapa saat untuk penyediaan dan terhubung ke lingkungan. Jika sudah selesai, Anda akan melihat tampilan seperti ini:

f6ef2b5f13479f3a.png

Mesin virtual ini berisi semua alat pengembangan yang Anda perlukan. Layanan ini menawarkan direktori beranda tetap sebesar 5 GB dan beroperasi di Google Cloud, sehingga sangat meningkatkan performa dan autentikasi jaringan. Semua pekerjaan Anda di lab ini dapat dilakukan hanya dengan browser.

3. Pengantar Eventarc

Eventarc memudahkan koneksi layanan Cloud Run dengan peristiwa dari berbagai sumber. Layanan ini menangani penyerapan, pengiriman, keamanan, otorisasi, dan penanganan error peristiwa untuk Anda.

776ed63706ca9683.pngS

Anda dapat menarik peristiwa dari sumber Google Cloud dan publikasi aplikasi Kustom ke Cloud Pub/Sub lalu mengirimkannya ke sink Google Cloud Run.

Peristiwa dari berbagai sumber Google Cloud dikirimkan dengan cara Cloud Audit Logs. Latensi dan ketersediaan pengiriman peristiwa dari sumber ini terikat dengan yang ada di Log Audit Cloud. Setiap kali peristiwa dari sumber Google Cloud diaktifkan, entri Cloud Audit Log yang sesuai akan dibuat.

Aplikasi kustom yang memublikasikan ke Cloud Pub/Sub dapat memublikasikan pesan ke topik Pub/Sub yang ditentukan dalam format apa pun.

Pemicu peristiwa adalah mekanisme pemfilteran untuk menentukan peristiwa mana yang akan dikirim ke sink yang mana.

Semua peristiwa ditayangkan dalam format CloudEvents v1.0 untuk interoperabilitas lintas layanan.

4. Sebelum memulai

Mengaktifkan API

Anda memerlukan layanan Eventarc untuk memicu layanan Cloud Run. Pastikan kebijakan ini diaktifkan:

gcloud services enable eventarc.googleapis.com

Anda akan melihat operasi berhasil diselesaikan:

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

Konfigurasi akun layanan

Akun layanan komputasi default akan digunakan dalam pemicu. Berikan peran eventarc.eventReceiver ke akun layanan komputasi default:

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

Berikan peran pubsub.publisher ke akun layanan Cloud Storage. Tindakan ini diperlukan untuk pemicu Eventarc Cloud Storage:

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

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

Jika Anda mengaktifkan akun layanan Pub/Sub pada atau sebelum 8 April 2021, berikan peran iam.serviceAccountTokenCreator ke akun layanan Pub/Sub:

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

5. Meng-clone kode

Clone kode, jika Anda belum melakukannya di codelab sebelumnya:

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

Selanjutnya, Anda dapat membuka direktori yang berisi layanan:

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

Anda akan memiliki tata letak file berikut untuk layanan:

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

Di dalam folder, Anda memiliki 3 file:

  • index.js berisi kode Node.js
  • package.json menentukan dependensi library

6. Mempelajari kode

Dependensi

File package.json menentukan dependensi library yang diperlukan:

{
  "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"
  }
}

Kita bergantung pada library Cloud Storage untuk menghapus gambar dalam Cloud Storage. Kami mendeklarasikan dependensi pada Cloud Firestore untuk juga menghapus metadata gambar yang telah disimpan sebelumnya. Selain itu, kami bergantung pada CloudEvents SDK dan library Google Events untuk membaca CloudEvents yang dikirim oleh Eventarc. Express adalah framework web JavaScript / Node. Bluebird digunakan untuk menangani promise.

index.js

Mari kita pelajari kode index.js lebih lanjut:

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');

Kita memerlukan berbagai dependensi yang diperlukan agar program kita dapat berjalan: Express adalah framework web Node yang akan kita gunakan, Bluebird adalah library untuk menangani promise JavaScript, Storage dan Firestore untuk bekerja sama dengan Google Cloud Storage (bucket gambar kami), dan datastore Cloud Firestore. Selain itu, kami mengharuskan CloudEvent membaca CloudEvent yang dikirim oleh Eventarc StoreObjectData dari library Google Events agar dapat membaca isi peristiwa Cloud Storage di CloudEvent.

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);
    }
});

Di atas, kita memiliki struktur pengendali Node: aplikasi kita akan merespons permintaan HTTP POST. Fungsi ini membaca CloudEvent dari permintaan HTTP dan kita sedang melakukan sedikit penanganan error jika terjadi kesalahan. Sekarang, mari kita lihat apa yang ada di dalam struktur ini.

Langkah berikutnya adalah mengambil dan mengurai isi CloudEvent serta mengambil nama objek:

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

const objectName = storageObjectData.name;

Setelah mengetahui nama gambar, kita dapat menghapusnya dari bucket thumbnail:

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}.`);
}

Sebagai langkah terakhir, hapus juga metadata gambar dari koleksi Firestore:

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}'.`);

Sekarang saatnya membuat skrip Node kita memproses permintaan yang masuk. Periksa juga apakah variabel lingkungan yang diperlukan telah ditetapkan:

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

7. Menguji secara lokal

Uji kode secara lokal untuk memastikan kode berfungsi sebelum di-deploy ke cloud.

Di dalam folder garbage-collector/nodejs, instal dependensi npm dan mulai server:

export BUCKET_THUMBNAILS=thumbnails-$GOOGLE_CLOUD_PROJECT

npm install; npm start

Jika semuanya berjalan dengan baik, server akan dimulai pada port 8080:

Started service on port 8080

Gunakan CTRL-C untuk keluar.

8. Membangun dan men-deploy ke Cloud Run

Sebelum men-deploy ke Cloud Run, tetapkan region Cloud Run ke salah satu region dan platform yang didukung ke managed:

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

Anda dapat memeriksa apakah konfigurasi telah disetel:

gcloud config list

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

Daripada mem-build dan memublikasikan image container menggunakan Cloud Build secara manual, Anda juga dapat mengandalkan Cloud Run untuk membangun image container tersebut menggunakan Google Cloud Buildpacks.

Jalankan perintah berikut untuk membangun image container menggunakan Google Cloud Buildpack, lalu deploy image container ke Cloud Run:

SERVICE_NAME=garbage-collector-service

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

Perhatikan flag –-source. Tindakan ini menandai Cloud Run untuk menggunakan Google Cloud Buildpack guna membangun image container tanpa Dockerfile.. Flag --no-allow-unauthenticated menjadikan layanan Cloud Run sebagai layanan internal yang hanya akan dipicu oleh akun layanan tertentu. Kemudian, Anda akan membuat Pemicu dengan akun layanan komputasi default yang memiliki peran run.invoker untuk memanggil layanan Cloud Run internal.

9. Buat Pemicu

Di Eventarc, Pemicu menentukan layanan yang akan mendapatkan jenis peristiwa. Dalam hal ini, Anda ingin layanan menerima peristiwa saat file dihapus di dalam bucket.

Tetapkan lokasi Pemicu di wilayah yang sama dengan bucket gambar yang diupload:

gcloud config set eventarc/location eu

Buat pemicu AuditLog untuk memfilter peristiwa storage.objects.delete dan mengirimkannya ke layanan Cloud Run:

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

Anda dapat memeriksa kembali apakah Pemicu dibuat dengan perintah ini:

gcloud eventarc triggers list

10. Menguji layanan

Untuk menguji apakah layanan berfungsi, buka bucket uploaded-pictures dan hapus salah satu gambar. Anda akan melihat di log layanan bahwa gambar yang relevan telah dihapus di bucket thumbnails dan juga dokumennya dihapus dari koleksi Firestore pictures.

519abf90e7ea4d12.pngS

11. Pembersihan (Opsional)

Jika tidak ingin melanjutkan lab lain dalam seri ini, Anda dapat menghapus resource untuk menghemat biaya dan menjadi cloud citizen yang baik secara keseluruhan. Anda dapat membersihkan resource satu per satu seperti berikut.

Hapus layanan:

gcloud run services delete $SERVICE_NAME -q

Hapus pemicu Eventarc:

gcloud eventarc triggers delete trigger-$SERVICE_NAME -q

Atau, Anda dapat menghapus seluruh project:

gcloud projects delete $GOOGLE_CLOUD_PROJECT

12. Selamat!

Selamat! Anda telah membuat layanan Cloud Run, pembersih sampah gambar, yang dipicu oleh Eventarc, layanan baru untuk menerima peristiwa di Cloud Run. Saat gambar dihapus dari bucket gambar, layanan akan menerima peristiwa dari Eventarc. Kemudian, tindakan ini akan menghapus gambar dari bucket thumbnail dan juga menghapusnya dari koleksi gambar Firestore.

Yang telah kita bahas

  • Cloud Run
  • Cloud Storage
  • Cloud Firestore
  • Eventarc