Drift konfigurasi saat deployment terjadi ketika konfigurasi runtime yang diterapkan berbeda dari kondisi yang diharapkan, misalnya antar-environment, antar-replika, atau antara konfigurasi di Git dan sistem produksi. Ketika insiden muncul tepat setelah deployment, korelasikan waktu rilis dengan perubahan metrik, log, dan trace; kemudian bandingkan versi aplikasi serta revisi konfigurasi sebelum memutuskan rollback.
Rollback tidak selalu berarti mengembalikan aplikasi. Jika artefak aplikasi tidak berubah tetapi nilai timeout, endpoint, feature flag, secret, atau konfigurasi koneksi berubah, rollback konfigurasi dapat menjadi pilihan yang lebih tepat. Sebaliknya, rollback dapat berbahaya jika deployment telah menjalankan migrasi data yang tidak kompatibel atau menghasilkan efek samping yang tidak dapat dibatalkan.
Skenario: deployment berhasil, tetapi produksi mulai menghasilkan error
Anggap sebuah layanan pembayaran baru saja dideploy. Commit aplikasi yang sama lulus pengujian di staging, tetapi beberapa menit setelah masuk produksi terjadi kondisi berikut:
- Rasio respons HTTP 5xx meningkat.
- Latensi permintaan ke API pembayaran eksternal melonjak karena banyak timeout.
- Hanya pod baru yang bermasalah, sedangkan pod lama masih sehat selama rolling deployment.
- Log menunjukkan timeout efektif 300 milidetik, padahal tim mengharapkan 3.000 milidetik.
Investigasi menemukan bahwa versi aplikasi baru membaca variabel PAYMENT_API_TIMEOUT_MS. Staging sudah memakai nama tersebut, tetapi produksi masih menyediakan PAYMENT_TIMEOUT_MS. Aplikasi kemudian menggunakan nilai default 300 milidetik.
Insiden ini mempunyai dua dimensi. Produksi mengalami drift karena kontrak konfigurasi antar-environment tidak sama. Pada saat yang sama, aplikasi juga kurang aman karena menerima konfigurasi wajib yang hilang dan melanjutkan proses dengan nilai default yang terlalu agresif. Karena itu, menyebut insiden semata-mata sebagai bug aplikasi atau kesalahan operasi akan menghilangkan bagian penting dari akar masalah.
Gejala umum drift konfigurasi
- Artefak aplikasi yang sama berperilaku berbeda antar-environment.
- Error hanya terjadi pada sebagian replika karena tidak semua replika menerima revisi konfigurasi yang sama.
- Gangguan dimulai setelah perubahan ConfigMap, secret, feature flag, parameter store, atau manifest deployment.
- Restart sementara memperbaiki atau justru memicu masalah karena aplikasi membaca konfigurasi hanya saat startup.
- Log memperlihatkan fallback ke nilai default, endpoint yang salah, atau fitur yang tidak semestinya aktif.
- Konfigurasi di Git berbeda dari konfigurasi efektif pada runtime.
Deteksi drift konfigurasi saat deployment melalui observabilitas
Grafik error tanpa konteks rilis hanya menunjukkan bahwa sistem bermasalah. Agar deployment dapat dikorelasikan dengan gangguan, setiap rilis perlu mempunyai identitas yang menghubungkan versi aplikasi, revisi konfigurasi, environment, dan waktu deployment.
Tambahkan deployment marker
Pipeline deployment sebaiknya mengirim marker ke sistem observabilitas saat rollout dimulai, selesai, dibatalkan, atau di-rollback. Marker minimal memuat:
- Nama layanan dan environment.
- Deployment ID atau release ID.
- Versi image atau commit aplikasi.
- Revisi konfigurasi, bukan isi secret.
- Waktu mulai dan selesai.
- Status serta tautan menuju perubahan yang disetujui.
Identitas yang sama juga perlu tersedia pada log dan trace. Contoh log terstruktur saat aplikasi mulai:
{
"event": "service_started",
"service": "payment-api",
"environment": "production",
"app_version": "git-a1b2c3d",
"config_revision": "config-e4f5a6b",
"deployment_id": "deploy-20250308-1005"
}Jangan memasukkan token, password, private key, atau nilai secret ke dalam log. Untuk secret, catat identifier versi yang tidak sensitif jika penyedia secret mendukungnya. Hash konfigurasi juga harus dihitung dari representasi yang konsisten dan sudah mengeluarkan field rahasia; perbedaan urutan key atau format serialisasi dapat menghasilkan hash berbeda walaupun nilai efektifnya sama.
Korelasikan marker dengan metrik
Tampilkan marker deployment pada grafik rasio error, latensi, throughput, konsumsi resource, antrean, serta kesehatan dependency. Urutan pemeriksaannya dapat dibuat konsisten:
- Tentukan menit pertama perubahan metrik.
- Periksa deployment atau perubahan konfigurasi yang terjadi tepat sebelum titik tersebut.
- Kelompokkan metrik berdasarkan versi aplikasi, zona, replika, atau deployment ID jika cardinality masih terkendali.
- Bandingkan pod baru dengan pod lama selama periode rolling deployment.
- Periksa dependency untuk memastikan error bukan kebetulan bertepatan dengan rilis.
Hindari menjadikan nilai konfigurasi mentah sebagai label metrik karena dapat menambah cardinality dan membocorkan informasi sensitif. Versi aplikasi dan revisi konfigurasi biasanya lebih aman. Jika jumlah revisi terus bertambah, batasi penggunaannya pada event deployment atau observasi berumur pendek.
Gunakan log untuk melihat konfigurasi efektif
Log startup sebaiknya mencatat konfigurasi efektif yang aman, seperti mode fitur, batas koneksi, timeout, nama region, dan hostname dependency. Nilai sensitif harus disamarkan. Log validasi juga perlu menjelaskan key yang hilang atau tidak valid tanpa menampilkan secret.
Pada skenario pembayaran, pencarian berdasarkan deployment_id menunjukkan bahwa pod baru memakai timeout 300 milidetik. Pod lama menggunakan 3.000 milidetik. Perbedaan ini mempersempit penyelidikan dari seluruh codebase menjadi proses pemuatan konfigurasi.
Gunakan trace untuk menemukan batas kegagalan
Trace membantu membedakan waktu yang habis di aplikasi sendiri, database, antrean, atau API eksternal. Tambahkan atribut versi aplikasi dan revisi konfigurasi sebagai atribut resource atau metadata trace yang konsisten. Setelah itu:
- Bandingkan trace sukses dari versi lama dengan trace gagal dari versi baru.
- Periksa span pertama yang berubah menjadi error.
- Amati timeout, jumlah retry, tujuan dependency, dan status error.
- Pastikan sampling tidak menghilangkan seluruh trace error; gunakan kebijakan sampling yang memprioritaskan kegagalan bila platform mendukungnya.
Dalam contoh ini, span panggilan ke penyedia pembayaran berhenti sekitar nilai timeout efektif. Bukti tersebut menghubungkan gejala aplikasi dengan konfigurasi runtime, bukan sekadar dugaan berdasarkan kedekatan waktu deployment.
Triase: bug aplikasi atau drift konfigurasi?
Tujuan triase awal bukan langsung menemukan seluruh akar masalah, melainkan menentukan tindakan pemulihan dengan risiko paling rendah. Bekukan deployment lanjutan, simpan bukti, dan tetapkan satu koordinator insiden sebelum mengubah sistem.
Langkah triase yang dapat diulang
- Konfirmasi ruang lingkup. Identifikasi layanan, endpoint, tenant, region, zona, dan replika yang terdampak.
- Catat pasangan versi. Untuk setiap replika, catat versi aplikasi dan revisi konfigurasi. Jangan mengasumsikan semuanya seragam.
- Bandingkan kondisi sehat dan gagal. Prioritaskan perbedaan pada image, environment variable, file konfigurasi, secret version, flag, argumen startup, dan identitas runtime.
- Periksa konfigurasi efektif. Nilai yang dideklarasikan belum tentu sama dengan nilai yang dibaca proses, terutama jika ada precedence antara file, environment variable, dan parameter command line.
- Periksa perubahan dependency. Pastikan gangguan jaringan, sertifikat kedaluwarsa, rate limit, atau outage pihak ketiga tidak salah diklasifikasikan sebagai drift.
- Reproduksi secara terkendali. Jalankan artefak yang sama dengan konfigurasi lama dan baru di lingkungan aman. Hindari memakai credential produksi.
Indikator pembeda
- Cenderung bug aplikasi: kegagalan mengikuti versi binary atau image meskipun konfigurasi efektif sama; stack trace mengarah ke jalur kode baru; atau versi lama tetap sehat dengan konfigurasi yang identik.
- Cenderung drift konfigurasi: artefak yang sama gagal hanya dengan revisi konfigurasi tertentu; pod dengan config revision berbeda menunjukkan perilaku berbeda; atau nilai runtime tidak sama dengan deklarasi yang disetujui.
- Masalah kompatibilitas gabungan: aplikasi baru membutuhkan key atau format baru, tetapi deployment tidak memastikan konfigurasi produksi diperbarui secara atomik. Ini merupakan kasus yang paling sering membutuhkan rollback terkoordinasi.
Jika konfigurasi dikelola melalui Git, bandingkan commit terakhir yang diketahui sehat dengan kandidat deployment:
git diff <good-config-commit> <candidate-config-commit> -- environments/production/Diff tersebut hanya membandingkan desired state. Untuk menemukan drift manual, bandingkan juga desired state dengan live state melalui mekanisme GitOps atau perintah diff yang didukung platform. Normalisasi field yang dibuat otomatis agar hasil tidak dipenuhi timestamp, status runtime, atau metadata lain yang tidak relevan.
Prosedur rollback aplikasi dan konfigurasi
Sebelum rollback, jawab tiga pertanyaan: artefak apa yang berubah, apakah versi sebelumnya kompatibel dengan state saat ini, dan apakah rollback menimbulkan efek samping lebih besar daripada gangguan yang sedang berlangsung. Catat keputusan dan pihak yang menyetujuinya.
Rollback aplikasi
Pilih rollback aplikasi jika versi sebelumnya diketahui sehat dan masih kompatibel dengan konfigurasi, database, format event, serta API saat ini. Pada Kubernetes, alur dasarnya dapat berupa:
kubectl -n payments rollout history deployment/payment-api
kubectl -n payments rollout undo deployment/payment-api --to-revision=<revision-sehat>
kubectl -n payments rollout status deployment/payment-apiRiwayat revision Kubernetes bukan pengganti sumber kebenaran artefak. Pastikan revision yang dipilih mengarah ke image digest yang sudah diverifikasi. Tag image yang dapat ditimpa menyulitkan audit dan berisiko menjalankan artefak berbeda dengan nama yang sama.
Rollback konfigurasi
Jika aplikasi masih benar tetapi revisi konfigurasi salah, kembalikan konfigurasi melalui jalur yang tercatat. Pada sistem GitOps, lakukan revert terhadap commit konfigurasi lalu biarkan controller merekonsiliasi state. Hindari kubectl edit sebagai solusi normal karena perubahan langsung dapat hilang pada rekonsiliasi berikutnya dan menciptakan drift baru.
Konfigurasi sebaiknya menggunakan objek atau revisi immutable, misalnya nama ConfigMap yang mengandung hash dan direferensikan oleh deployment. Pendekatan ini membuat revisi yang aktif terlihat jelas dan memaksa rollout saat referensi berubah.
Perubahan ConfigMap tidak selalu langsung dibaca aplikasi. Environment variable umumnya dibaca ketika proses dimulai, sedangkan file yang diperbarui tetap membutuhkan dukungan reload dari aplikasi. Pastikan mekanisme aktual sebelum menyatakan rollback selesai.
Rollback aplikasi dan konfigurasi secara terkoordinasi
Jika aplikasi dan konfigurasi mempunyai kontrak yang berubah bersamaan, tentukan urutan kompatibilitasnya:
- Hentikan atau perlambat rollout untuk membatasi dampak.
- Tentukan pasangan versi aplikasi dan konfigurasi terakhir yang diketahui sehat.
- Evaluasi apakah aplikasi lama dapat membaca state data dan event terbaru.
- Rollback konfigurasi atau aplikasi dalam urutan yang tetap menjaga setidaknya satu kombinasi kompatibel.
- Gunakan canary kecil untuk pasangan hasil rollback sebelum memperluasnya.
Pola expand and contract mengurangi risiko ini. Aplikasi terlebih dahulu mendukung key lama dan baru, konfigurasi kemudian dimigrasikan, lalu dukungan key lama dihapus pada rilis terpisah.
Kapan rollback tidak aman?
- Migrasi database bersifat destruktif atau schema baru tidak dapat dibaca aplikasi lama.
- Versi baru telah menulis event atau data dalam format yang tidak dipahami versi lama.
- Rollback akan mengaktifkan kembali credential yang sudah dicabut atau kerentanan keamanan.
- Feature flag memicu proses eksternal yang tidak dapat dibatalkan, seperti pembayaran atau pengiriman pesan.
- Konfigurasi mengubah partisi, routing, leader election, atau kepemilikan data pada sistem stateful.
- Kontrak API publik sudah dipakai klien dan versi lama tidak lagi kompatibel.
Dalam kondisi tersebut, pilih mitigasi lain: nonaktifkan jalur yang bermasalah, turunkan traffic, isolasi tenant, naikkan timeout secara aman, terapkan patch maju, atau jalankan prosedur pemulihan data. Rollback bukan tujuan; tujuan sebenarnya adalah memulihkan layanan tanpa merusak integritas sistem.
Verifikasi pemulihan
Status rollout yang sukses hanya berarti platform menyelesaikan prosesnya. Pemulihan harus dibuktikan dari sudut pandang pengguna dan dependency:
- Rasio error dan latensi kembali ke baseline sebelum insiden.
- Permintaan sintetis atau transaksi canary berhasil dari awal sampai akhir.
- Semua replika menjalankan pasangan versi aplikasi dan konfigurasi yang dimaksud.
- Backlog antrean, retry, dan koneksi yang sempat menumpuk mulai pulih.
- Tidak ada duplikasi efek samping akibat retry selama gangguan.
- Log dan trace baru tidak lagi menunjukkan signature error.
- Observasi dilanjutkan setidaknya selama satu siklus traffic yang relevan.
Setelah stabil, jangan langsung menghapus bukti. Simpan marker, dashboard, log terpilih, trace representatif, diff konfigurasi, serta catatan perintah yang dijalankan untuk postmortem.
Format postmortem ringan
Postmortem singkat tetap harus membedakan pemicu, akar masalah, dan faktor yang memperbesar dampak. Gunakan bahasa faktual dan hindari menyalahkan individu.
Dampak
- Layanan atau pengguna yang terdampak:
- Gejala dan durasi:
- Dampak data atau transaksi:
Timeline
- 10:05 deployment dimulai
- 10:08 alert rasio 5xx aktif
- 10:12 perbedaan timeout ditemukan pada log startup
- 10:18 rollback konfigurasi dimulai
- 10:25 metrik kembali ke baseline
Akar masalah
- Produksi masih memakai key PAYMENT_TIMEOUT_MS.
- Aplikasi baru membaca PAYMENT_API_TIMEOUT_MS.
- Key wajib yang hilang menggunakan default tidak aman.
Faktor pendukung
- Tidak ada validasi schema konfigurasi di CI.
- Revisi konfigurasi tidak dicatat pada trace.
- Canary tidak mencakup panggilan ke dependency pembayaran.
Tindakan korektif
- Pemilik, tenggat, dan kriteria selesai untuk setiap tindakan.Tindakan korektif harus dapat diverifikasi. Pernyataan seperti “lebih teliti saat deployment” tidak cukup. Contoh yang dapat diuji adalah “pipeline menolak konfigurasi tanpa PAYMENT_API_TIMEOUT_MS” atau “aplikasi gagal startup jika timeout berada di luar batas yang disetujui”.
Pencegahan praktis
1. Simpan konfigurasi sebagai artefak terversi
Simpan konfigurasi nonrahasia di version control dengan review dan histori. Secret tetap berada di secret manager, tetapi referensi atau identifier versinya dapat menjadi bagian dari manifest. Kaitkan setiap deployment dengan commit aplikasi dan commit konfigurasi.
2. Validasi schema di CI dan saat startup
Definisikan key wajib, tipe, rentang nilai, enum, dan aturan lintas-field. Jalankan validasi terhadap setiap environment di CI. Ulangi validasi ketika aplikasi mulai agar perubahan di luar pipeline tidak lolos. Untuk konfigurasi kritis, lebih aman gagal startup daripada diam-diam memakai default yang berbahaya.
Default tetap berguna untuk opsi lokal yang aman, tetapi jangan menggunakannya untuk endpoint produksi, credential, mode keamanan, atau batas operasional kritis tanpa pertimbangan eksplisit.
3. Tampilkan diff sebelum deploy
Pipeline harus menampilkan diff yang telah dinormalisasi antara konfigurasi aktif dan kandidat. Pisahkan perubahan aplikasi, konfigurasi, secret reference, dan infrastruktur agar reviewer dapat memahami blast radius. Tambahkan approval untuk perubahan sensitif seperti routing, autentikasi, timeout, dan koneksi database.
4. Gunakan canary dengan kriteria otomatis
Rilis ke sebagian kecil traffic atau replika terlebih dahulu. Bandingkan canary dengan baseline berdasarkan rasio error, latensi, saturasi, dan hasil transaksi sintetis. Canary harus menjalankan konfigurasi yang benar-benar akan dipakai produksi; canary dengan konfigurasi berbeda tidak menguji risiko drift yang sama.
5. Audit semua perubahan runtime
Catat siapa atau sistem apa yang mengubah konfigurasi, kapan perubahan terjadi, nilai versi sebelum dan sesudah, serta tiket atau pull request terkait. Batasi perubahan langsung di produksi dan buat alert ketika live state menyimpang dari desired state. Jangan menyimpan nilai secret mentah dalam audit log.
6. Lakukan drill rollback
Uji rollback aplikasi, konfigurasi, dan kombinasi keduanya secara berkala di lingkungan yang representatif. Drill perlu mengukur apakah artefak lama masih tersedia, prosedur dapat dijalankan, observabilitas menunjukkan revisi yang benar, dan tim memahami kondisi ketika rollback tidak aman.
Drift konfigurasi tidak dapat ditangani hanya dengan checklist deployment. Sistem perlu membuat versi aplikasi dan konfigurasi dapat diidentifikasi, dibandingkan, divalidasi, serta dikembalikan secara terkontrol. Dengan deployment marker, observabilitas yang konsisten, kontrak konfigurasi, dan latihan rollback, tim dapat memperpendek triase sekaligus menghindari pemulihan yang justru memperburuk insiden.
Komentar
0 komentar
Masuk ke akun kamu untuk ikut berkomentar.
Belum ada komentar
Jadilah yang pertama ikut berdiskusi!