Membangun aplikasi tanpa memikirkan server: arsitektur serverless dengan scale-to-zero, bersifat event-driven, dan tagihan per eksekusi dalam milidetik. Episode ini membahas pemicu event, contoh fungsi Node.js untuk Lambda, serta perbandingan Lambda, Cloud Functions, Cloud Run, dan Azure Functions.

Di episode 10 kita belajar menyimpan data non-relasional dan mempercepatnya dengan cache. Namun semua itu tetap berjalan di atas server yang harus kalian hitung kapasitasnya, jaga uptime-nya, dan patchnya. Bagaimana jika seluruh pekerjaan itu dihilangkan — kalian cukup menulis kode, dan cloud menangani sisanya?
Episode 11 ini membuka paradigma serverless: arsitektur di mana server tidak lagi menjadi unit yang kalian pikirkan. Kita akan membahas prinsip scale-to-zero dan pay-per-execution, event-driven architecture, jenis pemicu event, contoh fungsi Lambda dalam Node.js, cara deploy-nya lewat CLI, serta peta layanan FaaS di AWS, GCP, dan Azure.
Nama "serverless" menyesatkan — server tetap ada, hanya saja tidak lagi menjadi tanggung jawab kalian. Provider menyediakan lingkungan eksekusi yang tersembunyi di balik layar, dan kalian hanya berinteraksi dengan dua hal: kode fungsi dan event yang memicunya.
Tiga sifat yang membedakan serverless dari semua yang kita bahas sebelumnya:
Tip
Analogi terbaiknya adalah ojek online versus menyewa mobil dengan sopir. Menyewa sopir (VM) berarti membayar penuh selama disewa, walau mobil menganggur. Serverless seperti memesan ojek hanya saat butuh: datang cepat saat dipanggil, pergi saat selesai, dan membayar hanya untuk jarak yang ditempuh. Jika traffic kalian sporadis — kadang ramai, kadang sepi — ojek jauh lebih hemat; jika melayani traffic konstan, sopir pribadi bisa lebih murah.
FaaS adalah bentuk serverless yang paling murni: satu fungsi, satu respons, tanpa server yang terlihat. Ada dua sifat teknis yang wajib kalian pahami sejak awal:
Important
Sifat stateless inilah yang paling sering mengganggu developer baru. Jangan pernah menyimpan sesi pengguna, file sementara, atau variabel global yang berubah-ubah di dalam fungsi serverless. Jika kalian butuh data yang bertahan antar eksekusi, simpan di luar — inilah alasan kenapa episode 9 dan 10 (database dan cache) adalah prasyarat alami sebelum terjun ke serverless.
Fungsi serverless tidak punya tombol on — ia bangun hanya ketika event tiba. Empat pola pemicu yang paling umum:
| Pemicu | Contoh | Alur |
|---|---|---|
| HTTP API | REST endpoint | Browser memanggil URL, fungsi mengeksekusi dan membalas |
| File baru | Object storage | Pengguna upload file, fungsi memprosesnya (resize, scan) |
| Perubahan database | Stream atau CDC | Baris baru ditulis, fungsi merespons (notifikasi, agregasi) |
| Pesan antrian | Queue atau topic | Service A mengirim pesan, service B memprosesnya asinkron |
Bayangkan sistem pengelolaan foto: pengguna mengupload gambar (event file), fungsi dipicu untuk membuat thumbnail lalu menyimpannya, kemudian mengirim pesan ke antrian, yang memicu fungsi lain untuk mengirim notifikasi. Tidak ada server yang berjalan terus-menerus — seluruh pipeline bangun hanya saat diperlukan.
Note
Satu prinsip arsitektur yang baik: jadikan setiap fungsi mengerjakan satu hal saja. Fungsi yang menangani thumbnail, resize, dan notifikasi sekaligus akan sulit diuji, sulit diskalakan, dan membayar lebih. Kecil, fokus, dan tidak saling berbagi state — inilah gaya yang direkomendasikan seluruh provider.
Fungsi Lambda mengekspor sebuah handler. Contoh berikut menerima request HTTP, mengambil parameter nama, dan mengembalikan JSON:
export const handler = async (event) => {
const name = event.queryStringParameters?.name ?? "dunia";
return {
statusCode: 200,
headers: { "Content-Type": "application/json" },
body: JSON.stringify({
message: `Halo, ${name}!`
})
};
};Perhatikan struktur event yang masuk: untuk pemicu HTTP, ia membawa method, path, header, query string, dan body. Pemicu yang berbeda membentuk event yang berbeda pula — event dari file upload berisi nama bucket dan object, event dari antrian berisi daftar pesan. Satu fungsi yang sama bisa dipasang ke berbagai pemicu.
Setelah handler siap, fungsi dibuat lewat aws lambda create-function:
aws lambda create-function \
--function-name hello-cloud \
--runtime nodejs20.x \
--role arn:aws:iam::123456789012:role/lambda-basic-execution \
--handler index.handler \
--zip-file fileb://handler.zipFlag pentingnya: --runtime menentukan versi bahasa, --handler index.handler menunjukkan file index.js dengan fungsi bernama handler, --role adalah peran IAM yang memberi izin fungsi untuk berjalan (misalnya membaca tabel DynamoDB), dan --zip-file mengirim kode yang sudah dikemas.
Caution
--role bukan pilihan biasa — ia adalah kunci keamanan. Fungsi Lambda berjalan dengan izin IAM persis seperti VM: jika peran terlalu lebar, fungsi yang terekspos bisa mengakses sumber daya yang tidak seharusnya. Prinsip least privilege di episode 4 berlaku sama di sini — beri peran hanya izin yang benar-benar dibutuhkan fungsi itu.
| Kebutuhan | AWS | GCP | Azure |
|---|---|---|---|
| Function as a Service | Lambda | Cloud Functions | Azure Functions |
| Container serverless | - | Cloud Run | Azure Container Apps |
| Penghitung biaya | Per request dan durasi (GB-s) | Per request dan durasi | Per eksekusi dan durasi |
Konsepnya identik antar penyedia: satu fungsi, pemicu event, skala otomatis, dan tagihan per eksekusi. GCP dan Azure juga menawarkan varian menarik: Cloud Run dan Azure Container Apps menjalankan container yang bisa scale-to-zero — semacam jembatan menuju topik episode 12 — tetap menagih per penggunaan tetapi tidak dibatasi bentuk fungsi.
Tip
Pilih antara fungsi dan container serverless berdasarkan kebutuhan: fungsi untuk glue logic, pipeline event, dan API sederhana; container serverless untuk aplikasi lengkap dengan dependency berat atau framework penuh yang tidak nyaman dipaksa masuk ke bentuk fungsi.
Serverless bukan jawaban untuk semua. Pertimbangkan saat yang tepat memakainya:
Serverless menggeser kompleksitas dari operasional ke arsitektur. Kalian tidak lagi memikirkan patch dan scaling, tetapi harus berpikir dalam bentuk event, state eksternal, dan batas durasi eksekusi.
Pada episode 11 ini kalian telah memahami fondasi serverless: scale-to-zero yang menghentikan eksekusi dan tagihan saat tidak ada event, event-driven architecture dengan empat pola pemicu utama — HTTP API, file upload, perubahan database, dan pesan antrian — serta pay-per-execution yang menghitung biaya per milidetik. Kalian juga melihat contoh fungsi Lambda Node.js dan cara deploy-nya lewat aws lambda create-function, plus peta layanan Lambda, Cloud Functions, dan Azure Functions.
Kunci yang harus dibawa pulang:
Fungsi serverless ideal untuk potongan logika kecil. Bagaimana jika kalian butuh fleksibilitas penuh atas aplikasi — dependency apa pun, proses jangka panjang, port tersendiri — namun tetap ingin menjalankannya dengan cara yang portable dan skalabel? Episode 12 menjawabnya: Managed Container & Kubernetes Services — standar modern untuk mengemas, mengirim, dan mengatur aplikasi.