Cost Optimization #

Dalam dunia komputasi cloud, Cost Optimization sering kali disalahpahami sebagai sekadar upaya memotong anggaran TI secara agresif. Banyak organisasi melakukan kesalahan dengan menghentikan server-server penting secara acak demi menekan angka tagihan bulanan, yang pada akhirnya justru merusak performa aplikasi dan ketersediaan layanan pengguna. Filosofi sejati dari cost optimization adalah memaksimalkan efisiensi unit rekayasa perangkat lunak — yaitu mendapatkan nilai bisnis setinggi mungkin dari setiap rupiah yang kita bayarkan ke provider cloud. Sumber daya infrastruktur yang berbiaya mahal namun berhasil memproses jutaan transaksi bisnis dengan lancar adalah investasi yang sangat produktif. Sebaliknya, mesin virtual berukuran kecil yang tidak pernah digunakan oleh siapa pun adalah pemborosan murni. Artikel ini menyajikan tumpukan strategi praktis untuk menemukan pemborosan, menyelaraskan kapasitas dengan konsumsi riil, dan menjaga agar arsitektur cloud kita tetap ramping tanpa mengorbankan keandalan sistem.

Framework: Identify, Prioritize, Optimize, Verify, Iterate #

Efisiensi biaya cloud tidak akan bisa dicapai melalui kepanikan sesaat ketika tagihan melonjak. Kita membutuhkan kerangka kerja (framework) yang terstruktur dan berulang untuk mengelola pengeluaran cloud secara berkala:

              SIKLUS PENANGANAN EFISIENSI BIAYA
              
   1. IDENTIFY   --> Temukan pemborosan (idle VM, orphaned disk) lewat
                     analisis dasbor Cost Explorer & billing logs.
         |
   2. PRIORITIZE --> Urutkan temuan berdasarkan tingkat penghematan 
                     dan effort teknis (fokus pada quick-wins).
         |
   3. OPTIMIZE   --> Eksekusi perbaikan secara aman (rightsizing,
                     migrasi tier, atau penambahan penjadwalan).
         |
   4. VERIFY     --> Pantau billing di siklus berikutnya untuk memastikan
                     terjadinya penghematan tanpa efek samping negatif.
         |
   5. ITERATE    --> Ulangi proses audit secara berkala karena sistem
                     infrastruktur cloud selalu berubah dinamis.

1. Identify (Identifikasi) #

Kita memindai seluruh ekosistem cloud menggunakan perangkat analisis bawaan cloud (seperti AWS Trusted Advisor atau GCP Recommender) untuk mendeteksi sumber daya yang memiliki utilitas rendah atau tidak terpakai sama sekali.

2. Prioritize (Prioritisasi) #

Tidak semua rekomendasi optimasi harus diselesaikan dalam satu waktu. Kita membagi temuan berdasarkan matriks dampak vs usaha:

  • Dampak Tinggi, Usaha Rendah (Quick Wins): Menghapus disk kosong yang tidak terhubung ke server atau mematikan VM sandbox yang terbengkalai. Skenario ini harus diselesaikan dalam waktu 24 jam.
  • Dampak Tinggi, Usaha Tinggi: Mengubah arsitektur database monolitik menjadi database terdistribusi. Skenario ini harus direncanakan secara terstruktur di sprint rekayasa.

3. Optimize (Optimasi) #

Tim insinyur mengeksekusi perubahan secara aman di lingkungan staging terlebih dahulu sebelum merilis konfigurasi rightsizing ke lingkungan produksi.

4. Verify (Verifikasi) #

Kita memastikan bahwa penurunan spesifikasi server benar-benar memotong pengeluaran finansial di invoice berikutnya, tanpa menyebabkan degradasi latensi layanan bagi pengguna.

5. Iterate (Iterasi) #

Lingkungan cloud bersifat dinamis — kode baru terus dirilis, infrastruktur terus di-scale. Oleh karena itu, siklus audit ini wajib kita jalankan secara rutin (misalnya setiap kuartal).


Compute Optimization #

Compute (komputasi) adalah area pemborosan terbesar sekaligus penyumbang potensi penghematan tercepat di cloud. Dua strategi utama di area ini adalah Rightsizing dan Pembersihan Sumber Daya Terbengkalai.

1. Rightsizing — Menyesuaikan Kapasitas dengan Beban Kerja #

Rightsizing adalah tindakan menurunkan spesifikasi tipe atau ukuran virtual machine agar sesuai dengan kebutuhan konsumsi riil aplikasi kita.

  • Deteksi Instans Terlalu Besar (Over-provisioned): Jika sebuah VM berjalan 24/7 selama 2 minggu berturut-turut dengan rata-rata utilitas CPU di bawah 10% dan penggunaan RAM di bawah 20%, server tersebut adalah kandidat kuat untuk diturunkan spesifikasinya.

  • Simulasi Penghematan: Misalkan kita menjalankan server aplikasi pada instans m5.4xlarge (16 vCPU, 64 GB RAM) dengan harga $0.768 per jam. Hasil monitoring membuktikan rata-rata CPU usage hanya 5%. Kita memutuskan melakukan rightsizing ke tipe m5.large (2 vCPU, 8 GB RAM) yang berharga $0.096 per jam.

    $$\text{Persentase Penghematan} = \frac{$0.768 - $0.096}{$0.768} \times 100% = 87.5%$$

    Hanya dengan menurunkan satu server yang terlalu longgar spesifikasinya, kita menghemat biaya compute sebesar 87.5% pada instans tersebut.

  • Strategi Rightsizing yang Aman:

    • Turunkan spesifikasi secara bertahap (satu tingkat ke bawah terlebih dahulu, misalnya dari xlarge ke large).
    • Fokus pada statistik penggunaan tertinggi (peak usage), bukan sekadar rata-rata bulanan, guna menjamin server memiliki ruang penanganan lonjakan trafik (headroom).

2. Memutus Sumber Daya Yatim Piatu (Orphaned Resources) #

Sumber daya yatim piatu adalah komponen infrastruktur cloud yang tidak lagi terhubung ke aplikasi mana pun namun statusnya masih aktif dan terus memicu tagihan finansial.

flowchart TD
    subgraph Audit ["Proses Audit Sumber Daya"]
        Scan["1. Pindai Infrastruktur (Cron Job)"]
        VerifyIdle{"2. Apakah Resource Idle / Untagged?"}
    end

    subgraph Remediasi ["Tindakan Pembersihan Otomatis"]
        Alert["3. Kirim Peringatan ke Slack Owner
(Berikan Tenggat Waktu 48 Jam)"]
        CheckClaim{"4. Apakah Owner Mengklaim / Update Tag?"}
        Keep["5. Pertahankan Resource"]
        Terminate["6. Hancurkan Resource (Auto-Terminate)
- Hapus VM & volume
- Lepas Elastic IP"]
    end

    Scan --> VerifyIdle
    VerifyIdle -- Ya --> Alert
    VerifyIdle -- Tidak --> Keep

    Alert --> CheckClaim
    CheckClaim -- Ya --> Keep
    CheckClaim -- Tidak / Kadaluwarsa --> Terminate

Berdasarkan diagram alur otomatisasi pembersihan di atas, kita harus menyisir komponen-komponen berikut:

  • Unattached Disk Volumes: Ketika kita menghapus sebuah VM, disk penyimpanannya (block storage) sering kali tertinggal dengan status Available. Disk ini tetap ditagih penuh per GB/bulan. Kita harus membuat script otomatis untuk mendeteksi disk kosong dan menghapusnya jika statusnya menganggur lebih dari 7 hari.
  • Unassigned Elastic IPs: Alamat IP publik statis yang dipesan namun tidak dihubungkan ke VM aktif dikenakan biaya denda per jam oleh provider cloud untuk mencegah pemborosan alokasi IP global.
  • Empty Load Balancers: Load balancer yang tidak memiliki target instans sehat di belakangnya tetap membebankan biaya berjalan per jam.

Storage Optimization #

Penyimpanan data cloud dapat dioptimalkan tanpa mengorbankan retensi data melalui penerapan kebijakan daur hidup objek (lifecycle policies) secara cerdas.

  • Daur Hidup Penyimpanan Objek (Object Storage Lifecycle): Kita harus mengonfigurasi transisi penyimpanan otomatis berdasarkan usia data. Data log aplikasi yang baru ditulis diletakkan di Hot Storage (Standard Tier) untuk analisis cepat. Setelah 30 hari, data log tersebut dipindahkan secara otomatis ke Warm Storage (Infrequent Access Tier) yang menghemat biaya hingga 50%. Setelah 90 hari, data dipindahkan ke Cold Storage (Glacier/Archive) untuk penghematan 80%, dan otomatis dihancurkan setelah melewati 7 tahun untuk kepatuhan regulasi hukum.
  • Hapus Incomplete Multipart Uploads: Ketika aplikasi kita mengunggah file berukuran besar ke object storage dan koneksi terputus di tengah jalan, potongan file yang gagal tersebut tetap tersimpan di bucket dan ditagih biayanya. Konfigurasikan kebijakan daur hidup bucket untuk otomatis menghapus sisa file unggahan multipart yang tidak lengkap setelah 7 hari.

Network & Data Transfer Optimization #

Biaya transfer data keluar (egress) ke internet dapat dikurangi dengan merancang topologi jaringan cloud yang sadar biaya.

1. Gunakan Content Delivery Network (CDN) #

Membaca file statis (seperti aset gambar, berkas CSS, JavaScript, atau dokumen PDF) langsung dari server aplikasi kita akan memicu biaya egress reguler yang mahal ($0.09/GB). Dengan menempatkan CDN (seperti Cloudflare atau CloudFront) di depan aplikasi web kita, data tersebut akan di-caching pada jaringan terdekat dengan pengguna. Selain mempercepat waktu muat halaman, tarif egress CDN umumnya jauh lebih murah (dapat menghemat hingga 60%) dibandingkan tarif egress langsung dari server asal cloud.

2. Terapkan VPC Endpoints untuk Lalu Lintas Internal #

Secara default, jika instans VM kita di subnet privat ingin mengunggah file ke bucket Object Storage (S3), lalu lintas data harus melintasi NAT Gateway menuju jaringan publik internet terlebih dahulu sebelum masuk kembali ke bucket S3. Proses ini memicu biaya pengolahan data NAT Gateway sebesar $0.045 per GB yang diproses.

Solusi Arsitektur: Kita harus memasang VPC Gateway Endpoint untuk S3 di dalam subnet kita. VPC Endpoint berfungsi sebagai terowongan pribadi langsung dari VM ke S3 melalui jaringan internal cloud provider. Dengan mengalihkan lalu lintas data ke VPC Endpoint, kita memotong biaya NAT Gateway secara total (biaya processing = $0.00).


Database Optimization #

Database sering kali menjadi komponen termahal kedua setelah compute. Kita dapat mengoptimalkannya melalui rightsizing dan peningkatan efisiensi kode query:

  • Aurora Serverless untuk Beban Kerja Fluktuatif: Untuk lingkungan database non-produksi (seperti dev/staging) yang jarang diakses secara intensif, kita sebaiknya menggunakan database bertipe serverless. Aurora Serverless akan menurunkan kapasitas CPU (scale-down) saat sepi dan menaikkannya secara instan saat ada kueri masuk. Hal ini mengeliminasi pemborosan biaya sewa VM database statis yang menganggur di malam hari.
  • Gunakan Read Replica untuk Menghindari Scale-Up: Saat performa database utama melambat akibat beban kueri pembacaan data (read query) yang tinggi, arsitektur yang buruk akan langsung melakukan scale-up instans utama ke ukuran raksasa. Solusi yang Benar: Tambahkan beberapa instans Read Replica yang berharga murah, lalu arahkan seluruh trafik query analitik dan pembacaan data ke replica tersebut. Simpan instans database utama eksklusif untuk operasi penulisan data (write query).
  • Implementasikan Caching Layer (Redis/Memcached): Membaca data berulang-ulang langsung dari database utama (seperti data katalog produk) adalah pemborosan sumber daya komputasi database. Dengan memasang caching layer menggunakan Redis atau Memcached, kita memangkas beban query IOPS pada database. Hal ini memungkinkan kita menurunkan spesifikasi instans database utama ke tipe yang jauh lebih kecil dan murah.
  • Strategi Pengarsipan Data (Data Purging & Archiving): Menyimpan data transaksi historis berusia di atas 1 tahun di dalam database relasional operasional utama (seperti MySQL/PostgreSQL) akan memperlambat waktu query dan meningkatkan biaya penyimpanan SSD premium. Kita sebaiknya mengarsipkan data historis tersebut ke dalam Object Storage (seperti AWS S3) dalam format Apache Parquet yang terkompresi, lalu mengaksesnya menggunakan kueri on-demand serverless (seperti AWS Athena) jika sewaktu-waktu dibutuhkan.

Penjadwalan Kerja (Resource Scheduling) #

Bagi instans yang berada di lingkungan pengujian (development dan test environments), server tidak perlu berjalan selama 24 jam sehari, 7 hari seminggu. Anggota tim insinyur kita umumnya hanya bekerja selama jam kantor reguler.

Mari kita hitung potensi penghematan dari kebijakan penjadwalan matikan server otomatis (scheduling policies):

  • Skenario Mesin Berjalan 24/7:

    $$\text{Jam Operasional Bulanan} = 24 \text{ jam} \times 30 \text{ hari} = 720 \text{ jam/bulan}$$

  • Skenario Mesin Berjalan Terjadwal (Aktif Senin - Jumat, 08:00 - 18:00): Aktif 10 jam per hari, selama 20 hari kerja dalam sebulan.

    $$\text{Jam Operasional Terjadwal} = 10 \text{ jam} \times 20 \text{ hari} = 200 \text{ jam/bulan}$$

  • Kalkulasi Persentase Penghematan Finansial:

    $$\text{Persentase Penghematan} = \frac{720 \text{ jam} - 200 \text{ jam}}{720 \text{ jam}} \times 100% \approx 72.2%$$

Dengan menerapkan kebijakan otomatisasi mati-nyalakan server di luar jam kantor, kita langsung memotong pengeluaran finansial lingkungan sandbox/dev sebesar 72.2% tanpa mengganggu kenyamanan kerja tim di siang hari. Kita dapat mengimplementasikan otomasi ini menggunakan alat bawaan seperti AWS Instance Scheduler atau menggunakan trigger cron job AWS Lambda sederhana.


Mitos dan Anti-Pattern dalam Cost Optimization #

Untuk menghindari kesalahan umum yang dapat merusak kualitas sistem, kita harus meluruskan beberapa mitos dan menjauhi anti-pattern berikut:

1. Mitos: Rightsizing Berarti Memotong Headroom Server #

  • Bantah: Rightsizing bukan berarti membuat server bekerja di batas limit 99% CPU yang dapat memicu crash saat trafik naik mendadak. Target rightsizing yang sehat adalah menjaga agar rata-rata utilitas berada di kisaran 40% - 60% CPU, menyisakan ruang spike yang aman dikombinasikan dengan autoscaling yang responsif.

2. Anti-Pattern: Menghapus Cadangan (Backup) Secara Agresif #

  • JANGAN: Menghapus repositori snapshot cadangan atau mematikan fitur Multi-AZ database produksi demi menghemat biaya penyimpanan. Mengorbankan ketahanan data (durability) dan ketersediaan (availability) demi beberapa puluh dolar adalah kecerobohan besar. Biaya pemulihan data akibat bencana (disaster recovery) jauh lebih mahal daripada biaya penyimpanan snapshot cadangan tersebut.

3. Mitos: Cost Optimization Hanya Tugas Tim DevOps/SRE #

  • Bantah: DevOps/SRE hanya menyediakan infrastruktur dan alarm. Penyebab pemborosan terbesar sering kali berada di tingkat kode aplikasi yang ditulis oleh developer — seperti query database N+1 yang tidak efisien, loop asinkron yang salah ketik sehingga memicu spike CPU, atau tidak melakukan penutupan koneksi TCP.

4. Anti-Pattern: Mengabaikan Biaya Lisensi Perangkat Lunak #

  • ✗ JANGAN: Menggunakan mesin virtual dengan OS berbayar (seperti Windows Server) atau database komersial (seperti MS SQL Server/Oracle) tanpa menghitung alternatif open-source (seperti Linux dan PostgreSQL). Biaya lisensi CPU komersial di cloud sering kali jauh lebih mahal daripada biaya sewa perangkat keras fisiknya sendiri.

Ringkasan #

  • Terapkan framework optimasi secara sistematis — Yaitu Identify (temukan), Prioritize (pilah), Optimize (eksekusi), Verify (konfirmasi), dan Iterate (ulangi berkala).
  • Rightsizing adalah langkah efisiensi tercepat — Monitor utilitas CPU dan RAM, lalu turunkan spesifikasi instans yang over-provisioned secara bertahap.
  • Bersihkan komponen yatim piatu secara otomatis — Buat skrip terjadwal untuk menghapus disk kosong, load balancer tanpa target, dan IP elastis yang menganggur.
  • Gunakan kebijakan daur hidup objek (lifecycle policies) — Untuk mengotomatisasi penurunan kelas penyimpanan data lama ke kelas cold storage yang lebih ekonomis.
  • Pasang VPC Endpoint di subnet privat — Guna menghindari tagihan biaya pemrosesan data NAT Gateway yang mahal saat mengakses object storage secara internal.
  • Jadwalkan shutdown otomatis untuk server non-produksi — Mematikan instans dev/test di luar jam kantor dan akhir pekan mampu menghemat biaya hingga 72%.

← Sebelumnya: FinOps
About | Author | Content Scope | Editorial Policy | Privacy Policy | Disclaimer | Contact