Foto setiap hari: Lab 5—Pembersihan setelah penghapusan gambar

1. Ringkasan

Dalam codelab ini, Anda akan membuat layanan Cloud Run baru, pengumpul 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, gambar tersebut akan dihapus dari bucket thumbnail dan juga dihapus 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 Konsol GCP, 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 Anda menghubungkan layanan Cloud Run dengan peristiwa dari berbagai sumber. Layanan ini menangani penyerapan, pengiriman, keamanan, otorisasi, dan penanganan error untuk Anda.

776ed63706ca9683.png

Anda dapat menarik peristiwa dari sumber Google Cloud dan Aplikasi kustom yang memublikasikan ke Cloud Pub/Sub, lalu mengirimkannya ke sink Google Cloud Run.

Peristiwa dari berbagai sumber Google Cloud dikirimkan melalui Cloud Audit Logs. Latensi dan ketersediaan pengiriman peristiwa dari sumber ini terkait dengan latensi dan ketersediaan Cloud Audit Logs. 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 dikirimkan ke sink mana.

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

4. Sebelum memulai

Mengaktifkan API

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

gcloud services enable eventarc.googleapis.com

Anda akan melihat operasi selesai dengan berhasil:

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

Konfigurasi akun layanan

Akun layanan komputasi default akan digunakan di 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. Hal ini diperlukan untuk pemicu Cloud Storage Eventarc:

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. Buat clone kode

Lakukan clone kode, jika Anda belum melakukannya di lab kode sebelumnya:

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

Kemudian, 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. Kita mendeklarasikan dependensi pada Cloud Firestore, untuk juga menghapus metadata gambar yang kita simpan 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 lihat lebih dekat kode index.js kita:

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 adalah untuk bekerja masing-masing dengan Google Cloud Storage (bucket gambar kita), dan datastore Cloud Firestore. Selain itu, kami memerlukan CloudEvent untuk membaca CloudEvent yang dikirim oleh Eventarc StoreObjectData dari library Google Events untuk membaca isi peristiwa Cloud Storage dari 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 merespons permintaan POST HTTP. Fungsi ini membaca CloudEvent dari permintaan HTTP dan kita melakukan sedikit penanganan error jika terjadi masalah. 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 metadata gambar dari koleksi Firestore juga:

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. Selain itu, pastikan 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 men-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 lancar, 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 yang didukung dan platform ke managed:

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

Anda dapat memeriksa apakah konfigurasi telah ditetapkan:

gcloud config list

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

Daripada membuat dan memublikasikan image container menggunakan Cloud Build secara manual, Anda juga dapat mengandalkan Cloud Run untuk membuat image container bagi Anda menggunakan Buildpack Google Cloud.

Jalankan perintah berikut untuk membangun image container menggunakan Buildpack Google Cloud, lalu men-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 tanda –-source. Tindakan ini menandai Cloud Run untuk menggunakan Google Cloud Buildpacks guna mem-build image container tanpa Dockerfile. Flag --no-allow-unauthenticated menjadikan layanan Cloud Run sebagai layanan internal yang hanya akan dipicu oleh akun layanan tertentu. Selanjutnya, Anda akan membuat Pemicu dengan akun layanan compute default yang memiliki peran run.invoker untuk memanggil layanan Cloud Run internal.

9. Membuat Pemicu

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

Tetapkan lokasi Pemicu di region 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 bahwa Pemicu telah dibuat dengan perintah ini:

gcloud eventarc triggers list

10. Uji layanan

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

519abf90e7ea4d12.png

11. Membersihkan (Opsional)

Jika tidak berniat melanjutkan lab lainnya dalam seri ini, Anda dapat membersihkan resource untuk menghemat biaya dan menjadi pengguna cloud yang baik secara keseluruhan. Anda dapat membersihkan resource satu per satu sebagai 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, pengumpul sampah image, 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, gambar tersebut akan dihapus dari bucket thumbnail dan juga dihapus dari koleksi gambar Firestore.

Yang telah kita bahas

  • Cloud Run
  • Cloud Storage
  • Cloud Firestore
  • Eventarc