Merancang pengalaman self-service bagi developer: portal yang bisa dipakai sendiri, request workflows dengan approval yang tepat, dan aturan emas agar self-service tidak berubah menjadi pabrik tiket baru

Setelah sebelas episode membangun fondasi teknis (K8s, GitOps, IDP, CI/CD, observability, secrets, cost), ada satu pertanyaan yang menentukan apakah semua itu benar-benar dipakai: bagaimana developer mendapatkan sesuatu dari platform? Jika jawabannya "buat tiket ke tim platform", maka kita baru memindahkan masalah, bukan menyelesaikannya. Episode ini membahas self-service — puncak pengalaman platform engineering.
Mengapa self-service adalah tujuan akhir? Ingat mindset produk di episode 2: pengguna (developer) memilih berdasarkan kemudahan. Platform yang butuh tiket selalu lebih lambat daripada cara lama yang sudah biasa. Self-service bukan kemewahan — ia adalah mekanisme adopsi. Semakin bisa dikerjakan sendiri, semakin besar platform dipakai, dan semakin terkendali cara kerja semua orang.
Self-service bukan berarti "kasih semua orang akses ke semua". Justru sebaliknya. Empat prinsip:
Dengan prinsip ini, self-service mengurangi beban tim platform dan menambah kecepatan developer — bukan salah satu saja.
Kata kuncinya adalah mengubah tiket (ad-hoc, menunggu manusia) menjadi alur (deterministik, terotomasi). Perbedaan mendasar:
| Tiket | Self-Service Flow |
|---|---|
| "Minta database MySQL" | Klik "create db" → lahir otomatis dalam 3 menit |
| "Minta akses ke cluster" | Grant otomatis dari group SSO yang sudah ditentukan |
| "Request namespace baru" | Template + policy menghasilkan namespace sesuai aturan |
| Menunggu jawaban manusia | Feedback langsung, error message yang jelas |
Semua alur ini kita sudah punya bahannya: template scaffolder (episode 6), modul Terraform (episode 5), RBAC berbasis group (episode 4), dan policy-as-code (episode 5/10). Self-service adalah cara menyatukan semuanya menjadi alur yang bisa diklik developer.
Mari kita rancang flow paling penting: developer membuat service baru dari nol.
Developer membuka Backstage → klik "Create Service" → mengisi form (nama, owner, bahasa). Template (episode 6) menghasilkan:
catalog-info.yaml yang mendaftarkan service di catalog.Pipeline (episode 7) memanggil modul Terraform yang membuat:
module "service_bootstrap" {
source = "./modules/service-bootstrap"
service = "payments-api"
team = "payments"
environment = "dev"
# namespace, quota, RBAC, database, secrets path
# semuanya lahir dari satu panggilan
}Policy-as-code (episode 16) memverifikasi bahwa yang lahir sesuai standar — namespace ber-label, quota ada, secrets path sesuai convention. Jika melanggar, deployment ditolak dengan pesan jelas.
Satu klik, nol manusia di tengah. Inilah self-service yang sebenarnya.
Approval tetap diperlukan untuk keputusan berdampak besar. Kuncinya: bukan jangan ada approval, tapi approval yang tepat sasaran.
| Aksi | Approval? | Siapa |
|---|---|---|
| Service dev baru | Tidak | — |
| Deploy ke staging | Tidak (otomatis) | — |
| Deploy ke prod | Tidak (canary + SLO) | — |
| Akses production data | Ya | Owner tim + security |
| Ekspos service publik | Ya | Platform + security |
| Naik quota jauh di atas baseline | Ya | Platform (FinOps) |
| Registry push di luar policy | Tidak — ditolak policy | — |
Perhatikan polanya: keputusan berulang tidak butuh approval; keputusan langka dan berisiko butuh. Approval di-backend oleh policy bukan manusia jika memungkinkan.
Approval paling baik disatukan ke alur yang sudah ada — misalnya PR ke repo GitOps. "Request production akses" = membuat PR ke repo config → reviewer dari security → merge → otomatis berlaku:
# PR ini, setelah di-review, menjadi:
apiVersion: v1
kind: ServiceAccount
metadata:
name: payments-release
namespace: team-payments-prod
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: payments-release
namespace: team-payments-prod
subjects:
- kind: ServiceAccount
name: payments-release
namespace: team-payments-prod
roleRef:
kind: Role
name: team-operator
apiGroup: rbac.authorization.k8s.ioKeuntungannya: semua request dan approval terekam di git, auditable, bisa di-revert, dan mengikuti alur yang sama dengan kode. Tidak ada lagi "saya approve di chat".
Important
Prinsip "approval via GitOps" adalah pembeda platform engineering modern: semua perubahan yang berdampak lewat perubahan kode yang bisa di-review, bukan keputusan lisan. Jika kalian menemukan diri mengetik kubectl di produksi secara manual, itu sinyal approval flow kalian belum benar.
Self-service tanpa dukungan yang baik adalah resep frustrasi. Ketika flow gagal, developer butuh tahu apa yang salah dan bagaimana memperbaikinya. Tiga lapisan dukungan:
Self-service harus diukur — adopsi adalah KPI platform (episode 22):
| Metrik | Target |
|---|---|
| % deploy melalui golden path | > 80% |
| Time-to-provision environment | < 15 menit |
| % request tanpa intervensi manusia | > 90% |
| Waktu menunggu approval | < 24 jam (untuk yang butuh) |
Tip
Uji golden path setiap minggu: buat service baru dari nol lewat portal, deploy, dan lihat berapa lama. Catat waktunya. Jika waktu memburuk atau ada langkah manual yang menyusup, perbaiki segera. Golden path yang membusuk adalah alasan utama developer kembali ke cara lama.
Inti yang harus dibawa pulang:
Di episode 13 selanjutnya kita menaikkan abstraksi satu tingkat lebih tinggi: app delivery platform (PaaS) — membangun aplikasi tanpa menyentuh infra sama sekali, dengan buildpacks dan app runners yang menyembunyikan Kubernetes sepenuhnya. Self-service jadi lebih dari sekadar alur — menjadi pengalaman tanpa memahami infra!