Pada lab kali ini kita akan membahas service Pub/Sub loosely-coupled baik untuk synchronous atau asynchronous workflow.
Disini kita akan menggunakan Cloud Storage notification configuration untuk publish messages ke Pub/Sub Topics. Kemudian membuat cloud function dengan push subscription trigger.
Skenarionya adalah website menerima upload image yang akan disimpan dalam Cloud Storage, akan mentrigger notification berupa message yang dipublish ke Pub/Sub Topics. Kemudian kita akan membuat cloud function yang menerima push subscription dari topics, kemudian cloud function akan menjalankan fungsi untuk membuat thumbnail dari image yang diupload.
Skenario diatas menunjukan loosely coupled dimana proses upload image dan pembuatan thumbnail merupakan proses yang terpisah, mencegah proses blocking.
Untuk kesederhanaan Lab, kita tidak akan membuat website, tapi cukup mengupload image ke dalam cloud storage secara manual.
Untuk mengikuti lab diperlukan GCP project dan menggunakan Cloud console, shell dan editor. Anda juga memerlukan beberapa contoh image untuk keperluan testing.
Membuat Topic
Mari kita mulai lab. Pertama kita buat Pub/Sub Topics. Buka menu Pub/Sub melalui burger menu. Pada halaman Pub/Sub, tekan tombol Create Topic. (untuk langkah detail lihat Lab: Google Cloud Pub/Sub).
Akan tampil popup window create topic, Beri nama Topic, pada Lab digunakan newImage. Kemudian tekan tombol Create Topic.
Membuat Bucket
Masuk ke Cloud Storage melalui menu Burger. Kita akan membuat dua bucket untuk images dan thumbnails.
Tekan tombol Create Bucket. Perhatikan, bucket dalam scope Global namespace, bukan dalam project.

Pada window Create Bucket, beri nama bucket. Karena scope adalah global, salah satu saran penamaan adalah dengan menambahkan project prefix agar mudah dikenali.
Untuk opsi lainnya gunakan default. Jadi langsung tekan tombol Create.

Menambahkan Notification Configuration.
Buka Cloud Shell. Akan kita gunakan gsutil untuk membuat notification configuration pada images bucket.
Gunakan perintah berikut:
$ gsutil notification create -f json -e OBJECT_FINALIZE -t projects/nama_project_anda/topics/newImage gs://nama-bucket-images-anda
Membuat Cloud Function
Kita akan gunakan Cloud Shell Editor untuk membuat fungsi.
Pertama kita buat direktori untuk menyimpan fungsi, pada lab digunakan gen_thumbnail. Kemudian masuk ke direktori tersebut.
$ mkdir gen_thumbnail
$ cd gen_thumbnail
Dalam direktori tersebut, buat file baru main.py melalui Cloud Shell Editor. Masukan code berikut dan save:
from wand.image import Image
from google.cloud import storage
client = storage.Client()
thumbnail_bucket = 'nama-thumbnail-bucket-anda'
def gen_thumbnail(data, context):
bucket = data['attributes']['bucketId']
image = data['attributes']['objectId']
thumbnail = 'thumbnail -' + image
bucket = client.get_bucket(bucket)
blob = bucket.get_blob(image)
imagedata = blob.download_as_string()
newimage = Image(blob=imagedata)
newimage.sampe(300, 300)
bucket = client.get_bucket(thumbnail_bucket)
newblob = bucket.blob(thumbnail)
newblob.upload_from_string(newimage.make_blob())
kemudian buat file kedua yaitu requirements.txt, gunakan text dibawah kemudian simpan.
google-cloud-storage wand
Kemudian kembali ke shell, lalu jalankan perintah untuk deploy function.
$ gcloud functions deploy gen_thumbnail --runtime python37 --trigger-topic newImage
Akan tampil pertanyaan “Allow unauthenticated invocation of new function [gen_thumbnail]?” kita jawab N.
Tunggu gcloud selesai deploy fungsi, pertama kali deploy bisa memerlukan beberapa menit.
Setelah selesai, Anda bisa fungsi yang sudah di deploy melalui burger menu Cloud Functions.
Dapat dilihat fungsi gen_thumbnail telah dideploy. Click fungsi tersebut, lalu masuk ke tab trigger. Dapat dilihat nama topic yang digunakan yaitu newImage.
Tekan link newImage, untuk masuk ke section PubSub. Pilih menu Subcsriptions, dapat dilihat push function.

Sampai disini kita sudah selesai menyiapkan arsitektur untuk kebutuhan lab ini. Berikutnya kita lakukan testing dengan mengupload image.
Buka cloud storage melalui burger menu. Masuk ke image bucket Anda. Upload image dengan menekan tombol Upload files.

Setelah upload selesai, periksa thumbnail bucket Anda. Bila tidak ada masalah, maka thumbnail akan tersedia didalam bucket tersebut.
Anda dapat cek juga pada window Cloud Functions, dapat dilihat graph yang menunjukan function Invocation.

Sampai disini lab sudah selesai. Kesimpulannya adalah kita dapat memanfaatkan Pub/Sub untuk membuat loosely-decoupled architecture pada aplikasi.
Perhatian: Jangan lupa untuk menghapus instance yang telah dibuat.
- Delete Pub/Sub Topics.
- Delete functions gen_thumbnail.
- Delete bucket images dan thumbnails.