Setahun terakhir pesanan harian TokoKita naik berkali lipat, dan tim infrastruktur harus menaksir kapasitas server setahun ke depan setiap kali membeli perangkat baru. Perkiraan semacam itu hampir selalu meleset: server yang dibeli seukuran puncak flash sale menganggur di hari biasa, sementara server yang dihitung dari hari biasa kehabisan kapasitas saat kampanye berjalan. Cloud computing mengganti tebakan tersebut dengan sewa sumber daya per jam melalui API, sehingga kapasitas dapat menyusul beban. Section ini dimulai dari konsep dasarnya: cara layanan cloud disusun, cara biayanya dihitung, dan siapa yang bertanggung jawab atas apa.

Konsep Dasar: Region dan Availability Zone #

Cloud computing adalah model menyewa sumber daya komputasi — server, storage, jaringan, hingga layanan terkelola — dari penyedia seperti AWS, Google Cloud, dan Microsoft Azure, dengan penagihan mengikuti pemakaian. Kita memprovision sumber daya lewat API atau konsol web dalam hitungan menit, bukan lewat pengadaan perangkat keras berminggu-minggu. Glosarium resmi istilah-istilah ini tersedia di dokumentasi Google Cloud: https://cloud.google.com/docs/overview .

Penyedia menjalankan pusat data di banyak lokasi yang disebut region, misalnya Asia Pacific (Jakarta) dengan kode ap-southeast-3 di AWS. Setiap region memuat satu atau lebih availability zone (AZ): klaster pusat data terpisah dengan listrik dan jaringan mandiri. Menyebarkan pipeline ke beberapa AZ menjaga TokoKita tetap melayani transaksi ketika satu pusat data mengalami gangguan, sementara memilih region terdekat pelanggan memangkas latensi akses.

Model Layanan: IaaS, PaaS, dan SaaS #

Layanan cloud umumnya dikelompokkan menjadi tiga model sesuai jumlah lapisan yang diambil alih penyedia:

ModelYang kita kelola sendiriContoh di stack data TokoKita
IaaSOS, runtime, aplikasi, dataVM untuk menjalankan Airflow worker
PaaSdata dan konfigurasimanaged PostgreSQL, query serverless seperti Amazon Athena
SaaSdata dan hak akses sajaBI berbasis langganan untuk tim analitik

Semakin ke bawah tabel, semakin banyak lapisan yang diambil alih penyedia — dan semakin sedikit kendali kita atas detailnya. Data engineer biasanya bekerja pada kombinasi ketiganya: VM (IaaS) untuk workload khusus, managed database dan query engine (PaaS) untuk layanan inti, serta tool kolaborasi (SaaS) untuk pemangku kepentingan bisnis.

Capex, Opex, dan Elastisitas Biaya #

Membeli server adalah capex: biaya modal di muka untuk aset yang disusutkan bertahun-tahun. Menyewa instance cloud adalah opex: biaya operasional berulang yang berubah mengikuti pemakaian. Perbedaan model biaya ini berubah menjadi keuntungan nyata lewat elastisitas: armada server tidak lagi harus diukur dari jam tersibuk. Simulasi berikut membandingkan dua strategi untuk beban harian TokoKita — armada tetap yang disiapkan seukuran jam puncak, versus armada autoscale yang mengikuti beban per jam:

python
"""Simulasi capex vs opex: armada server tetap vs autoscale untuk TokoKita."""
import math

HARGA_INSTANCE_PER_JAM = 0.05   # USD per instance-jam (VM kecil on-demand)
KAPASITAS_INSTANCE = 50         # ribu permintaan/jam yang mampu diproses 1 instance

# Beban permintaan per jam (ribu), 24 nilai per hari.
BEBAN = {
    "Senin biasa":      [8, 5, 4, 4, 5, 9, 20, 35, 55, 80, 95, 110,
                         120, 115, 105, 100, 110, 130, 160, 180, 170, 120, 60, 25],
    "Jumat gajian":     [10, 6, 5, 5, 6, 10, 24, 42, 66, 96, 114, 132,
                         144, 138, 126, 120, 132, 156, 192, 216, 204, 144, 72, 30],
    "Flash sale 12.12": [12, 7, 5, 5, 7, 12, 28, 50, 78, 114, 136, 158,
                         172, 165, 150, 144, 158, 188, 230, 260, 640, 720, 380, 90],
}

def armada_elastis(jam: int) -> int:
    """Instance yang dibutuhkan untuk beban satu jam, plus 1 cadangan."""
    return max(1, math.ceil(jam / KAPASITAS_INSTANCE) + 1)

def ringkas(nama: str, beban: list) -> dict:
    """Bandingkan armada tetap (ukuran puncak, jalan 24 jam) vs autoscale."""
    puncak = max(beban)
    tetap = math.ceil(puncak / KAPASITAS_INSTANCE) + 1
    elastis = sum(armada_elastis(j) for j in beban)
    return {"nama": nama, "puncak": puncak, "jam": beban.index(puncak),
            "tetap": tetap,
            "biaya_tetap": tetap * 24 * HARGA_INSTANCE_PER_JAM,
            "biaya_elastis": elastis * HARGA_INSTANCE_PER_JAM}

print("Kapasitas 1 instance : {} ribu permintaan/jam".format(KAPASITAS_INSTANCE))
print("Harga instance       : ${:.2f} per instance-jam".format(HARGA_INSTANCE_PER_JAM))
print()
print("Perbandingan per hari (armada tetap berjalan 24 jam penuh):")
print()
header = "{:<18} {:>10} {:>7} {:>10} {:>11} {:>12}"
print(header.format("Hari", "Puncak/jam", "Jam", "Inst tetap", "Biaya tetap", "Biaya elastis"))
for nama, beban in BEBAN.items():
    s = ringkas(nama, beban)
    print(header.format(nama, "{}k".format(s["puncak"]), "{:02d}:00".format(s["jam"]),
                        s["tetap"], "${:.2f}".format(s["biaya_tetap"]),
                        "${:.2f}".format(s["biaya_elastis"])))

# Estimasi 1 bulan: 26 hari biasa + 3 jumat gajian + 1 flash sale.
puncak_bulan = max(max(b) for b in BEBAN.values())
armada_bulan = math.ceil(puncak_bulan / KAPASITAS_INSTANCE) + 1
ij_tetap = armada_bulan * 24 * 30
ij_elastis = (26 * sum(armada_elastis(j) for j in BEBAN["Senin biasa"])
              + 3 * sum(armada_elastis(j) for j in BEBAN["Jumat gajian"])
              + 1 * sum(armada_elastis(j) for j in BEBAN["Flash sale 12.12"]))
biaya_tetap = ij_tetap * HARGA_INSTANCE_PER_JAM
biaya_elastis = ij_elastis * HARGA_INSTANCE_PER_JAM
print()
print("Estimasi 1 bulan (26 biasa + 3 gajian + 1 flash sale):")
print("  Armada tetap : {} instance (ukuran puncak flash sale), {:,} instance-jam"
      .format(armada_bulan, ij_tetap))
print("  Armada elastis: {:,} instance-jam".format(ij_elastis))
print("  Biaya tetap   : ${:,.2f}".format(biaya_tetap))
print("  Biaya elastis : ${:,.2f}".format(biaya_elastis))
print("  Penghematan   : {:.1f}%".format((1 - biaya_elastis / biaya_tetap) * 100))

Output yang Dihasilkan:

text
Kapasitas 1 instance : 50 ribu permintaan/jam
Harga instance       : $0.05 per instance-jam

Perbandingan per hari (armada tetap berjalan 24 jam penuh):

Hari               Puncak/jam     Jam Inst tetap Biaya tetap Biaya elastis
Senin biasa              180k   19:00          5       $6.00        $3.80
Jumat gajian             216k   19:00          6       $7.20        $4.05
Flash sale 12.12         720k   21:00         16      $19.20        $5.75

Estimasi 1 bulan (26 biasa + 3 gajian + 1 flash sale):
  Armada tetap : 16 instance (ukuran puncak flash sale), 11,520 instance-jam
  Armada elastis: 2,334 instance-jam
  Biaya tetap   : $576.00
  Biaya elastis : $116.70
  Penghematan   : 79.7%

Mari kita telaah baris-baris kode di atas:

  1. Baris 4-5 (HARGA_INSTANCE_PER_JAM, KAPASITAS_INSTANCE): parameter model — harga sewa per instance-jam dan kapasitas proses satu instance dalam ribu permintaan per jam.
  2. Baris 8-15 (BEBAN): tiga profil hari: Senin biasa, Jumat gajian, dan flash sale; setiap profil menyimpan 24 nilai beban per jam dalam ribuan.
  3. Baris 17-19 (armada_elastis): jumlah instance untuk satu jam — beban dibagi kapasitas, dibulatkan ke atas, ditambah 1 cadangan.
  4. Baris 21-29 (ringkas): armada tetap dihitung dari jam puncak lalu ditagih 24 jam penuh; armada elastis menjumlahkan kebutuhan instance per jam sepanjang hari.
  5. Baris 45-47 (armada_bulan, ij_tetap): armada tetap bulanan wajib seukuran puncak flash sale (16 instance) dan berjalan 24 jam selama 30 hari penuh.

Armada tetap membayar 11.520 instance-jam padahal lonjakan ekstrem hanya terjadi dua jam per bulan; armada elastis memakai 2.334 instance-jam dan menghemat 79,7% biaya. Angka pastinya bergantung pada profil beban dan harga region, tetapi polanya konsisten: semakin tajam lonjakan beban, semakin besar manfaat elastisitas.

Shared Responsibility Model #

Keamanan di cloud dirangkum oleh dua frasa: penyedia bertanggung jawab atas keamanan cloud-nya (security of the cloud), sedangkan kita bertanggung jawab atas keamanan di dalam cloud (security in the cloud). Penyedia merawat pusat data, jaringan, dan hypervisor; kita yang mengatur data, hak akses, konfigurasi jaringan, hingga patching OS pada mode IaaS. Pergeseran pembagian kerja dari IaaS menuju SaaS terlihat pada diagram berikut:

Pada SaaS hampir seluruh tumpukan berpindah ke penyedia, tetapi satu lapisan tidak pernah berpindah: data beserta hak aksesnya. Bucket yang salah dikonfigurasi menjadi publik atau kredensial yang tertulis di kode tetap menjadi tanggung jawab kita pada model layanan mana pun — pembahasan mendalam ada di section Keamanan dan Tata Kelola Data.

Dengan konsep region, model layanan, elastisitas, dan pembagian tanggung jawab sebagai kerangka bersama, kita siap menyusun infrastruktur data TokoKita layer demi layer. Lapisan pertama yang akan kita sentuh adalah tempat seluruh data mentah disimpan: chapter Object Storage.