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.
Yang akan Anda pelajari
- Cloud Run
- Cloud Storage
- Cloud Firestore
- Eventarc
2. Penyiapan dan Persyaratan
Penyiapan lingkungan mandiri
- 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.
- 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.
- 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:
Hanya perlu waktu beberapa saat untuk penyediaan dan terhubung ke lingkungan. Jika sudah selesai, Anda akan melihat tampilan seperti ini:
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.
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.jspackage.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
.
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