Infra Sakti
AWS, GCP, Docker & Kubernetes dari Nol ke Produksi · Galih Prasetyo · 2026
Kata Pengantar
Aplikasi pertama saya yang benar-benar "hidup" di internet dulu berjalan di satu server sewaan seharga secangkir kopi per bulan. Ia melayani beberapa ratus pengguna dengan gagah, sampai suatu pagi sebuah tautan viral membawa puluhan ribu orang sekaligus. Server itu tersengal, lalu diam. Saya menghabiskan tiga jam panik: menyalakan ulang, menambah RAM, memindahkan basis data. Malam itu saya belajar pelajaran yang tidak pernah saya lupa — kapasitas yang tidak bisa berubah cepat adalah utang yang menunggu ditagih.
Buku ini tentang cara membayar utang itu dengan bijak: memindahkan beban dari "satu mesin yang saya rawat sendiri" ke infrastruktur cloud yang bisa tumbuh dan menyusut mengikuti kebutuhan. Kita akan membahas dua pemain terbesar — Amazon Web Services (AWS) dan Google Cloud Platform (GCP) — lalu dua teknologi yang menyatukan cara kita mengemas dan menjalankan aplikasi di mana pun: Docker dan Kubernetes.
Everything fails, all the time.
Werner Vogels, CTO Amazon
Kalimat Werner Vogels di atas bukan pesimisme; itu adalah filosofi desain. Di cloud, kita berhenti berharap komponen tidak akan rusak, dan mulai merancang sistem yang tetap sehat ketika sebagian komponennya rusak. Region bisa terganggu, disk bisa penuh, sebuah instance bisa mati diam-diam. Insinyur infrastruktur yang baik menyiapkan sistemnya untuk semua itu — dan buku ini akan menunjukkan caranya, satu konsep pada satu waktu.
Saya menulis buku ini untuk Anda yang sudah bisa membuat aplikasi — sudah paham menulis backend, memanggil basis data, menaruh sesuatu di Vercel atau sebuah VPS — tetapi belum pernah menyentuh "cloud besar" dan merasa istilahnya seperti sup alfabet: VPC, IAM, AZ, CIDR, ALB, IGW, NAT, EKS. Kabar baiknya: di baliknya cuma ada beberapa ide inti yang berulang. Setelah Anda memegang ide-ide itu, sisanya tinggal kosakata.
Cloud berubah cepat. Nama instance, harga per GB, batas kuota, nama menu di konsol, bahkan nama layanan bisa berganti kapan saja. Setiap kali buku ini menyebut angka biaya atau detail yang mudah usang, ia ditandai "estimasi — verifikasi ke dokumentasi resmi". Perlakukan buku ini sebagai peta cara berpikir, bukan tabel harga yang beku.
Dan karena kita hidup di zaman ketika mesin pun ikut membaca dokumen, ada satu bab khusus — Cara Dibaca AI — yang membuat buku ini ramah bagi manusia sekaligus model bahasa yang mungkin Anda minta meringkasnya. Selamat membaca, dan selamat membangun sesuatu yang tetap berdiri saat tautan Anda menjadi viral.
Cara Membaca Buku Ini
Buku ini bisa dibaca berurutan atau dilompati. Tapi karena konsep infrastruktur saling bertumpuk, saya sarankan pemula membaca Bab 1–3 dulu sebelum melompat. Berikut peta besarnya.
Struktur buku
- Bab 1–2 — Fondasi. Kapan Anda benar-benar butuh cloud (dan kapan tidak), lalu konsep universal: region, AZ, IAM, billing, tagging.
- Bab 3–8 — Dunia AWS. IAM, S3, EC2, VPC & multi-VPC, RDS & layanan pendukung, sampai DNS & subdomain. Ini bagian terbesar karena AWS punya kosakata paling padat.
- Peta Layanan (interaktif) & Bab 9–11 — Dunia GCP. Alat interaktif untuk memetakan kebutuhan Anda ke layanan AWS & GCP, lalu IAM, Cloud Storage, Compute Engine, Cloud Run, dan Cloud SQL.
- Bab 12–15 — Container & Produksi. Docker, Kubernetes, CI/CD, load balancer, dan auto-scaling. Bagian ini berlaku di kedua cloud (dan di mana pun).
- Bab 16–19 — Matang & Aman. Keamanan, biaya, pohon keputusan "kapan pakai apa", bab Cara Dibaca AI, lalu penutup dengan FAQ, glosarium, dan checklist produksi.
Rambu-rambu di dalam teks
Beberapa elemen visual berulang. Kenali artinya sekali, lalu Anda akan membacanya sekilas:
Praktik yang menghemat waktu, uang, atau menaikkan keandalan.
Jebakan umum yang membuang waktu atau membuat sistem rapuh.
Tindakan yang bisa membuka data ke publik, membocorkan kredensial, atau meledakkan tagihan. Selalu butuh mata manusia.
Angka yang memengaruhi tagihan. Selalu estimasi — verifikasi ke kalkulator resmi cloud terkait.
Detail yang cepat berubah — cek dokumentasi resmi sebelum mengandalkannya.
Ringkasan padat yang sengaja ditujukan bagi model bahasa yang membaca dokumen ini.
Anda juga akan sering menemukan diagram arsitektur (gambar SVG yang tajam di layar apa pun dan bisa dicetak), mockup konsol/terminal yang meniru sesi sungguhan, serta satu komponen interaktif — Pemetaan Layanan AWS ↔ GCP — yang berfungsi saat dibuka di peramban.
Cara terbaik membaca buku ini adalah dengan akun free tier AWS dan GCP terbuka di tab lain. Kebanyakan latihan bisa dijalankan gratis atau nyaris gratis — asal Anda mematikannya lagi setelah selesai (lihat Bab 16 soal kontrol biaya).
Kapan Naik ke Cloud
Ada godaan besar di dunia teknologi untuk memakai alat paling canggih hanya karena ia canggih. Kubernetes, multi-region, service mesh — semuanya terdengar seperti kelas atas. Tapi infrastruktur yang benar bukan yang paling rumit; ia yang paling pas dengan masalah Anda hari ini dan cukup lentur untuk masalah Anda enam bulan lagi. Bab ini soal mengenali kapan tangga cloud benar-benar perlu dinaiki.
Sinyal bahwa Anda butuh cloud
Kebanyakan aplikasi kecil tidak butuh AWS atau GCP. Sebuah landing page, blog, atau MVP dengan seratus pengguna hidup nyaman di Vercel, Netlify, atau satu VPS. Cloud besar mulai masuk akal ketika Anda mengalami satu atau lebih dari ini:
- Beban tidak rata. Trafik melonjak di jam tertentu (misal aplikasi absensi jam 7 pagi) lalu sepi. Anda ingin membayar saat ramai saja, bukan menyewa kapasitas puncak 24 jam.
- Butuh banyak layanan yang saling terhubung. Backend, worker antrean, basis data terkelola, penyimpanan file, CDN, dan pengiriman email — semuanya di satu tempat dengan jaringan privat di antaranya.
- Kebutuhan keandalan. Anda tak boleh mati saat satu data center bermasalah. Cloud menyediakan beberapa Availability Zone yang terpisah secara fisik.
- Regulasi & lokasi data. Data harus berada di region tertentu (misalnya Jakarta), atau audit menuntut kontrol akses berbutir halus.
- Tim membesar. Anda perlu memberi izin berbeda ke orang berbeda tanpa saling menimpa — inilah kerja IAM.
"Nanti kita perlu skala Google" jarang benar untuk startup tahap awal. Kompleksitas cloud yang dipasang terlalu dini memperlambat Anda: lebih banyak yang bisa salah, lebih banyak yang harus dipelajari, dan tagihan yang lebih sulit ditebak. Naik tangga saat rasa sakitnya nyata, bukan saat ia hipotetis.
Vercel vs VPS vs Cloud besar
Tiga tingkat abstraksi ini bukan saingan; mereka titik berbeda pada spektrum "berapa banyak yang Anda urus sendiri". Semakin ke kanan, semakin banyak kendali dan tanggung jawab.
| Aspek | PaaS (Vercel/Netlify/Render) | VPS (DigitalOcean/Linode) | Cloud besar (AWS/GCP) |
|---|---|---|---|
| Yang Anda urus | Kode saja | OS, runtime, kode | Semua (bisa diatur berbutir) |
| Waktu ke "online" | Menit | Jam | Jam–hari |
| Kurva belajar | Rendah | Sedang | Tinggi |
| Skala otomatis | Bawaan | Manual | Bisa, perlu dikonfigurasi |
| Jaringan privat/VPC | Terbatas | Terbatas | Penuh |
| Kontrol biaya awal | Mudah ditebak | Tetap & murah | Sulit ditebak tanpa disiplin |
| Cocok untuk | Frontend, MVP, API kecil | Proyek personal, staging | Produksi berskala, banyak layanan |
Pola yang sehat: mulai dari kiri, geser ke kanan hanya saat perlu. Banyak tim sukses menjalankan frontend di Vercel dan backend berat di AWS sekaligus — memakai tiap alat pada titik terkuatnya. Cloud besar bukan tujuan akhir yang wajib; ia alat untuk masalah tertentu.
Simplicity is a prerequisite for reliability.
Edsger W. Dijkstra
Keputusan naik ke cloud besar sebaiknya dipicu kebutuhan konkret (beban tidak rata, banyak layanan terhubung, keandalan multi-AZ, regulasi lokasi data, tim membesar) — bukan antisipasi skala hipotetis. Spektrum: PaaS (urus kode) → VPS (urus OS+kode) → Cloud besar (urus semua, berbutir). Rekomendasi default: mulai sederhana, geser ke kanan saat rasa sakit nyata.
Konsep Cloud yang Berulang
Sebelum menyentuh tombol apa pun di konsol AWS atau GCP, ada empat gagasan yang muncul berulang di setiap layanan. Kuasai keempatnya sekarang, dan sembilan puluh persen kebingungan nanti akan lenyap: geografi (region & AZ), identitas (IAM), uang (billing), dan label (tagging).
Region, Availability Zone, dan Edge
Cloud secara fisik adalah bangunan berisi ribuan komputer. Untuk menatanya, penyedia membagi dunia menjadi tiga tingkat geografi:
- Region — area geografis luas, misalnya
ap-southeast-1(Singapura) di AWS atauasia-southeast2(Jakarta) di GCP. Region menentukan di mana data Anda tinggal (penting untuk latensi & regulasi). - Availability Zone (AZ) — satu atau beberapa data center terpisah di dalam region, dengan listrik dan jaringan mandiri. Satu region biasanya punya 3 AZ. Menyebar aplikasi ke beberapa AZ membuatnya tahan terhadap kegagalan satu data center.
- Edge / PoP (Point of Presence) — lokasi kecil dekat pengguna, dipakai CDN (CloudFront/Cloud CDN) untuk menyimpan salinan konten agar cepat diakses dari mana saja.
Pilih region terdekat dengan mayoritas pengguna untuk latensi rendah, dan sebar sumber daya penting ke minimal dua AZ. Untuk pengguna Indonesia, ap-southeast-1 (Singapura), ap-southeast-3 (Jakarta) di AWS, atau asia-southeast2 (Jakarta) di GCP adalah titik awal yang wajar.
Transfer data antar-region dan sering kali antar-AZ berbayar, sementara di dalam AZ yang sama biasanya gratis. Region berbeda juga punya harga berbeda untuk layanan yang sama. Ini estimasi arah, bukan angka pasti — verifikasi ke kalkulator resmi.
IAM: identitas sebagai fondasi
IAM (Identity and Access Management) adalah sistem yang menjawab satu pertanyaan di setiap tindakan: "Siapa boleh melakukan apa, pada sumber daya mana, dengan syarat apa?" Ini bukan fitur sampingan — ia lapisan pertama keamanan cloud. Salah mengatur IAM adalah penyebab paling umum kebocoran data cloud.
Tiga kata kunci yang akan berulang:
- Principal — siapa yang bertindak: seorang user, sebuah role, atau sebuah layanan.
- Policy — dokumen aturan (biasanya JSON) yang menyatakan izin: aksi apa (misal
s3:GetObject) diizinkan/ditolak pada sumber daya apa. - Least privilege — prinsip memberi izin sekecil mungkin yang cukup untuk tugas. Kita bahas dalam di Bab 3.
Security is not a product, but a process.
Bruce Schneier
Billing & tagging: melihat ke mana uang pergi
Di VPS, tagihan adalah angka tetap. Di cloud, tagihan adalah penjumlahan ratusan baris kecil: jam compute, GB storage, GB transfer, jumlah request, jam load balancer. Tanpa disiplin, tagihan menjadi kejutan tiap bulan. Dua kebiasaan menyelamatkan Anda:
- Budget alert. Set anggaran (misal 50 USD/bulan) dan minta email/notifikasi saat mencapai 50%, 80%, 100%. Ini rem pertama Anda.
- Tagging. Beri label pada tiap sumber daya:
env=prod,team=checkout,project=tokoku. Nanti Anda bisa memfilter tagihan per tag dan tahu persis fitur mana yang mahal.
Aktifkan cost allocation tags sejak hari pertama. Tag yang tidak dipasang di awal sulit direkonstruksi belakangan. Disiplin tagging adalah investasi kecil yang membayar dirinya sendiri saat tagihan pertama yang mengejutkan datang. Semua angka anggaran di buku ini estimasi — verifikasi lewat konsol billing resmi.
Empat konsep universal cloud: (1) Geografi — Region (area, tentukan latensi & kepatuhan) > AZ (data center terpisah dalam region, sebar untuk keandalan) > Edge/PoP (cache CDN dekat user). (2) IAM — principal + policy + least privilege. (3) Billing — tagihan = penjumlahan pemakaian berbutir; pasang budget alert. (4) Tagging — label env/team/project untuk atribusi biaya. Transfer antar-AZ/region umumnya berbayar; dalam satu AZ umumnya gratis.
AWS & IAM: Identitas Sebelum Segalanya
Ketika Anda pertama masuk ke konsol AWS, godaannya adalah langsung menyalakan server. Jangan. Hal pertama yang benar untuk dilakukan bukan compute, melainkan identitas. Akun yang salah diatur di awal adalah pintu terbuka yang baru Anda sadari sudah dilewati orang lain saat tagihan penambangan kripto tiba.
Root account: pakai sekali, lalu kunci
Saat mendaftar AWS, Anda mendapat root account — identitas maha kuasa yang bisa melakukan apa saja, termasuk menutup akun dan mengubah billing. Root tidak untuk pemakaian harian. Aturan mainnya:
- Aktifkan MFA (Multi-Factor Authentication) pada root segera.
- Buat satu IAM user admin untuk diri Anda, lalu simpan kredensial root dan nyaris tak pernah pakai lagi.
- Jangan pernah membuat access key untuk root.
Access key root yang bocor (terunggah ke GitHub, tertinggal di kode) adalah bencana kelas satu: penyerang bisa menyalakan ratusan instance mahal atas nama Anda dalam hitungan menit. Jika sebuah key pernah bocor, cabut (deactivate) sekarang juga, lalu putar (rotate) semua kredensial.
User, Group, Role, dan Policy
Empat objek IAM yang harus Anda bedakan dengan jelas:
| Objek | Apa itu | Kapan dipakai |
|---|---|---|
| User | Identitas tetap untuk manusia atau aplikasi luar | Login konsol, akses via access key jangka panjang |
| Group | Kumpulan user dengan izin sama | Menata izin per peran tim (developers, admins) |
| Role | Identitas sementara yang bisa "dipakai" (assume) oleh siapa/apa yang berhak | Memberi izin ke EC2/Lambda/layanan, akses lintas akun |
| Policy | Dokumen JSON berisi izin (Effect, Action, Resource, Condition) | Dilekatkan ke user/group/role |
Perbedaan paling penting: role tidak punya password atau access key permanen. Ia memberi kredensial sementara yang berlaku beberapa jam lalu kedaluwarsa. Inilah cara aman memberi izin ke sebuah EC2 atau fungsi Lambda — alih-alih menempelkan access key ke dalam kode (yang bisa bocor), Anda melekatkan role ke sumber daya itu.
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "BacaBucketTertentu",
"Effect": "Allow",
"Action": ["s3:GetObject", "s3:ListBucket"],
"Resource": [
"arn:aws:s3:::tokoku-uploads",
"arn:aws:s3:::tokoku-uploads/*"
]
}
]
}
Bacalah policy di atas seperti kalimat: "Izinkan (Allow) aksi s3:GetObject dan s3:ListBucket pada bucket tokoku-uploads dan seluruh isinya." Setiap policy AWS punya bentuk yang sama: Effect (Allow/Deny), Action (aksi API), Resource (ARN target), dan opsional Condition (syarat, misal hanya dari IP tertentu).
ARN: alamat unik setiap sumber daya
ARN (Amazon Resource Name) adalah "alamat lengkap" sebuah sumber daya, berformat arn:aws:service:region:account-id:resource. Contoh: arn:aws:s3:::tokoku-uploads (S3 bersifat global sehingga region & account kosong) atau arn:aws:ec2:ap-southeast-1:123456789012:instance/i-0abc. Anda akan sering menempelkan ARN di policy.
Least privilege: seni memberi izin secukupnya
Prinsip least privilege berkata: beri sebuah identitas izin seminimal yang cukup untuk tugasnya — tidak lebih. Godaan pemula adalah melekatkan policy AdministratorAccess ke semuanya "supaya tidak error". Itu seperti memberi kunci semua ruangan kepada tukang kebun karena satu kali ia perlu masuk gudang.
- Mulai dari nol izin, tambahkan saat sesuatu gagal — bukan sebaliknya.
- Batasi
Resourceke ARN spesifik, hindari"Resource": "*"kecuali benar-benar perlu. - Pakai
Conditionuntuk mempersempit (misalaws:SourceIp, atau memaksa MFA). - Gunakan tools seperti IAM Access Analyzer untuk menemukan izin yang tak pernah dipakai.
Policy AWS mengikuti aturan: Deny selalu menang atas Allow, dan tanpa Allow eksplisit, defaultnya adalah menolak. Jadi jika izin yang seharusnya ada malah ditolak, cari explicit Deny di policy lain (misalnya di level organisasi/SCP) sebelum menambah Allow baru.
Given enough eyeballs, all bugs are shallow — tetapi given enough permissions, all breaches are deep.
Adaptasi dari Linus's Law
Hierarki IAM AWS: root (kunci + MFA, jangan dipakai harian) → IAM user/group (manusia) → role (kredensial sementara untuk layanan/lintas akun). Policy JSON = Effect + Action + Resource(ARN) + Condition. Aturan evaluasi: default deny; explicit Deny mengalahkan Allow. Prinsip inti: least privilege — batasi Action & Resource, hindari AdministratorAccess dan Resource:"*". Role dilekatkan ke EC2/Lambda alih-alih menaruh access key di kode.
Amazon S3: Gudang Object
Jika ada satu layanan AWS yang hampir semua aplikasi pakai, itu S3. Ia adalah tempat menyimpan "file" — foto profil, unggahan pengguna, backup, aset statis, log — dengan daya tahan yang nyaris tak masuk akal dan harga per gigabyte yang murah. Memahami S3 dengan benar akan mengubah cara Anda merancang penyimpanan selamanya.
Bucket, object, dan key
S3 adalah object storage, bukan filesystem. Perbedaannya penting:
- Bucket — wadah tingkat atas dengan nama unik secara global (tidak ada dua bucket bernama sama di seluruh AWS). Contoh:
tokoku-uploads. - Object — file yang Anda simpan, plus metadata. Ukuran hingga 5 TB per object.
- Key — "nama lengkap" object di dalam bucket, misalnya
users/42/avatar.png. Meski terlihat seperti folder, sebenarnya key hanyalah string; S3 tidak punya folder sungguhan (hanya prefix).
Object diakses lewat URL berpola https://<bucket>.s3.<region>.amazonaws.com/<key>. S3 dirancang untuk daya tahan sangat tinggi (Amazon mengiklankan "eleven nines", 99,999999999% durabilitas — angka pemasaran, verifikasi ke dokumentasi resmi) dengan mereplikasi object ke banyak perangkat di beberapa AZ.
Storage class: bayar sesuai pola akses
Tidak semua data diakses sama sering. S3 menawarkan beberapa storage class dengan trade-off harga simpan vs harga ambil:
| Storage class | Untuk | Harga simpan | Catatan |
|---|---|---|---|
| S3 Standard | Data panas, sering diakses | Termahal simpan | Ambil murah/instan |
| S3 Intelligent-Tiering | Pola akses tak menentu | Otomatis pindah tier | Ada biaya monitoring kecil |
| S3 Standard-IA | Jarang diakses, butuh cepat | Lebih murah simpan | Ada biaya ambil per GB |
| S3 Glacier Instant/Flexible | Arsip | Sangat murah simpan | Ambil lebih lambat/mahal |
| S3 Glacier Deep Archive | Arsip jangka sangat panjang | Termurah simpan | Ambil dalam jam |
Biaya S3 punya beberapa dimensi: storage (per GB-bulan), request (per 1.000 GET/PUT), dan data transfer keluar (per GB, ini sering yang terbesar). Memindahkan data dingin ke Glacier menghemat storage, tapi ingat biaya ambil. Pakai Lifecycle Policy untuk memindahkan object otomatis (misal ke IA setelah 30 hari, Glacier setelah 90 hari). Semua angka estimasi — verifikasi ke kalkulator S3 resmi.
Static hosting & CDN di depan bucket
S3 bisa menyajikan situs statis (HTML/CSS/JS) langsung. Tapi pola produksi yang benar adalah menaruh CloudFront (CDN) di depan bucket: CDN menyimpan salinan aset di Edge dekat pengguna, memberi HTTPS, dan menyembunyikan bucket dari akses langsung.
Jangan pernah membuat bucket "public" sembarangan. Banyak kebocoran data besar berawal dari bucket S3 yang tak sengaja terbuka ke internet. Aktifkan Block Public Access (default menyala), dan biarkan CloudFront mengakses bucket privat lewat Origin Access Control (OAC) alih-alih membuka bucket ke publik.
Presigned URL, bucket policy, dan versioning
Tiga fitur S3 yang sering menyelamatkan Anda:
- Presigned URL — URL sementara bertanda tangan yang memberi akses terbatas-waktu ke satu object, tanpa membuka bucket. Ideal untuk "unggah file langsung dari browser" atau "tautan unduh berlaku 15 menit". Backend Anda membuatnya dengan SDK; klien memakainya langsung ke S3.
- Bucket policy — policy JSON di level bucket (mirip IAM policy) untuk aturan akses berbasis sumber daya, misalnya "hanya CloudFront distribution ini yang boleh baca".
- Versioning — menyimpan setiap versi object saat ditimpa/dihapus, sehingga penghapusan tak sengaja bisa dipulihkan. Kombinasikan dengan MFA Delete untuk perlindungan ekstra.
import { S3Client, PutObjectCommand } from "@aws-sdk/client-s3";
import { getSignedUrl } from "@aws-sdk/s3-request-presigner";
const s3 = new S3Client({ region: "ap-southeast-1" });
// URL berlaku 300 detik untuk mengunggah 1 object
const url = await getSignedUrl(
s3,
new PutObjectCommand({ Bucket: "tokoku-uploads", Key: "users/42/avatar.png" }),
{ expiresIn: 300 }
);
// kirim `url` ke browser; browser PUT langsung ke S3
Presigned URL memindahkan beban unggah/unduh besar dari server Anda ke S3 langsung. Server hanya "menandatangani" izin; byte-nya mengalir klien↔S3. Ini menghemat bandwidth server dan mempercepat unggah pengguna.
S3 = object storage (bukan filesystem): Bucket (nama unik global) > Object (hingga 5 TB) diidentifikasi Key (string mirip path, folder hanyalah prefix). Storage class: Standard (panas) → Intelligent-Tiering → Standard-IA → Glacier → Deep Archive (arsip); pindah otomatis via Lifecycle Policy. Produksi: bucket privat + Block Public Access + CloudFront (OAC) di depan. Fitur: presigned URL (akses object terbatas waktu tanpa buka bucket), bucket policy (akses berbasis resource), versioning (pulihkan hapus). Biaya = storage + request + transfer keluar.
Amazon EC2: Server Sesuai Permintaan
EC2 (Elastic Compute Cloud) adalah "menyewa komputer per jam". Anda memilih ukuran mesin, sistem operasi, dan jaringannya; AWS menyalakannya dalam detik. Di balik semua layanan mewah, banyak beban kerja pada akhirnya berjalan di sebuah EC2. Memahaminya berarti memahami satuan compute paling dasar di AWS.
Instance type, AMI, dan siklus hidup
Saat menyalakan EC2, tiga pilihan utama:
- Instance type — ukuran & karakter mesin, ditulis seperti
t3.micro,m6i.large,c7g.xlarge. Huruf awal menandai keluarga:t(murah, burstable),m(seimbang),c(compute-berat),r(memori-berat),g/p(GPU). Angka = generasi; sufiks = ukuran. - AMI (Amazon Machine Image) — "cetakan" disk berisi OS dan software awal (Amazon Linux, Ubuntu, atau image kustom Anda).
- Key pair — pasangan kunci SSH untuk masuk ke instance. AWS menyimpan kunci publik; Anda menyimpan kunci privat (jangan pernah hilang/dibagikan).
| Keluarga | Optimasi | Contoh beban |
|---|---|---|
t (t3, t4g) | Umum, burstable, murah | Dev, web kecil, trafik tidak rata |
m (m6i, m7g) | Seimbang CPU/RAM | Backend umum, app server |
c (c7g) | CPU tinggi | Encoding, batch, game server |
r (r6i) | RAM besar | Cache, in-memory DB, analitik |
g/p | GPU | ML/AI, rendering |
Model harga EC2: On-Demand (per detik/jam, paling fleksibel, termahal), Savings Plans/Reserved (komitmen 1–3 tahun, jauh lebih murah), dan Spot (sisa kapasitas, sampai ~70–90% lebih murah tapi bisa dicabut sewaktu-waktu — cocok untuk beban yang tahan gangguan). Instance ARM (g sufiks, Graviton) sering lebih murah per performa. Semua angka estimasi — verifikasi ke kalkulator EC2 resmi.
Security group & key pair
Security group (SG) adalah firewall virtual di depan instance. Ia stateful: jika Anda mengizinkan koneksi masuk, respons keluarnya otomatis diizinkan. Anda menulis inbound rule (apa yang boleh masuk) dan outbound rule (apa yang boleh keluar), masing-masing menyebut protokol, port, dan sumber/tujuan.
# INBOUND
# HTTPS dari mana saja
allow tcp 443 from 0.0.0.0/0
# HTTP (untuk redirect ke HTTPS)
allow tcp 80 from 0.0.0.0/0
# SSH HANYA dari IP kantor Anda
allow tcp 22 from 203.0.113.10/32
# OUTBOUND
allow all to 0.0.0.0/0
Membuka port 22 (SSH) atau 3389 (RDP) ke 0.0.0.0/0 (seluruh internet) adalah undangan bagi bot pemindai. Batasi SSH ke IP Anda saja, atau lebih baik pakai AWS Systems Manager Session Manager agar tak perlu membuka port SSH sama sekali.
EBS, Elastic IP, dan penyimpanan
- EBS (Elastic Block Store) — disk virtual yang dilekatkan ke EC2 (seperti SSD/HDD). Tipe umum:
gp3(SSD serbaguna, default bagus),io2(IOPS tinggi untuk DB),st1(HDD throughput, untuk log/big data). EBS hidup terpisah dari instance: instance bisa dimatikan, disk tetap ada. Ambil snapshot berkala (tersimpan di S3) untuk backup. - Instance store — disk fisik sementara yang menempel pada host; sangat cepat tapi hilang saat instance berhenti. Hanya untuk cache/scratch.
- Elastic IP — alamat IP publik statis yang bisa Anda pindah antar-instance. Berguna agar DNS tak perlu diubah saat mengganti server. Catatan: EIP yang tidak terpakai (tidak melekat) justru dikenai biaya kecil.
Data di EBS root volume sering diset "delete on termination" — artinya hilang saat instance dihapus. Untuk data penting, pakai volume EBS terpisah dengan flag tersebut dimatikan, atau lebih baik simpan state di layanan terkelola (RDS, S3) sehingga EC2 bisa diperlakukan sebagai disposable.
Treat servers like cattle, not pets.
Bill Baker (mempopulerkan analogi cattle vs pets)
Filosofi "cattle, not pets" adalah inti berpikir cloud: jangan memelihara satu server istimewa yang Anda beri nama dan rawat manual. Buat server bisa dibuang dan digantikan otomatis dari AMI/skrip, dengan semua state penting di luar (RDS, S3). Server yang sakit tidak diobati — ia diganti.
EC2 = sewa VM per detik/jam. Pilih: instance type (keluarga t/m/c/r/g + generasi + ukuran), AMI (image OS), key pair (SSH). Harga: On-Demand > Savings/Reserved > Spot (termurah, bisa dicabut). Security group = firewall stateful (inbound/outbound rule per port/CIDR); jangan buka SSH:22 ke 0.0.0.0/0. Penyimpanan: EBS (persisten, gp3 default, snapshot ke S3) vs instance store (cepat, sementara). Elastic IP = IP publik statis yang bisa dipindah. Prinsip: server disposable (cattle), state di RDS/S3.
VPC & Multi-VPC: Jaringan Privat Anda
VPC (Virtual Private Cloud) adalah jaringan privat Anda sendiri di dalam cloud — sebuah "kavling" yang Anda tata sesuka hati: jalan mana yang tembus ke internet, ruangan mana yang terkunci, siapa bouleh bicara dengan siapa. Bagi banyak orang, VPC adalah bab yang paling menakutkan. Ia tidak sulit; ia hanya butuh gambar yang benar di kepala Anda. Mari kita bangun gambar itu.
CIDR, subnet, dan route table
Sebuah VPC diberi rentang alamat IP privat dalam notasi CIDR, misalnya 10.0.0.0/16 (berarti ~65.536 alamat, dari 10.0.0.0 sampai 10.0.255.255). Angka setelah garis miring adalah jumlah bit "tetap": makin besar angkanya, makin kecil rentangnya. /16 besar, /24 (256 alamat) kecil.
VPC dibagi menjadi subnet — potongan CIDR lebih kecil, masing-masing hidup di satu AZ. Dua jenis penting:
- Subnet publik — punya rute ke internet lewat Internet Gateway. Tempat yang boleh dijangkau dari luar (load balancer, bastion).
- Subnet privat — tidak bisa dijangkau langsung dari internet. Tempat server aplikasi dan basis data. Jauh lebih aman.
Yang menentukan sebuah subnet "publik" atau "privat" bukan namanya, melainkan route table-nya — tabel yang berkata "trafik ke tujuan X lewat gateway Y". Subnet publik punya rute 0.0.0.0/0 → Internet Gateway; subnet privat tidak.
Internet Gateway vs NAT Gateway
Dua gateway yang sering tertukar:
- Internet Gateway (IGW) — pintu dua arah antara VPC dan internet. Sumber daya di subnet publik dengan IP publik bisa menerima dan mengirim lewat IGW.
- NAT Gateway — pintu satu arah keluar untuk subnet privat. Server privat perlu mengunduh update atau memanggil API luar, tapi tak boleh dijangkau dari luar. NAT membiarkan mereka "keluar" lewat IP publik NAT, sementara koneksi masuk dari internet tetap tertutup.
NAT Gateway punya biaya per jam plus biaya per GB data yang diproses — ini sering jadi kejutan di tagihan. Untuk beban kecil, pertimbangkan NAT instance sendiri atau VPC endpoint (agar trafik ke S3/DynamoDB tak lewat NAT). Estimasi — verifikasi ke kalkulator VPC resmi.
Multi-VPC: peering dan Transit Gateway
Saat organisasi membesar, satu VPC sering tak cukup: Anda memisahkan lingkungan (prod vs staging), tim, atau akun. Menghubungkan VPC-VPC ini dilakukan dengan:
- VPC Peering — koneksi privat satu-lawan-satu antara dua VPC. Sederhana, tapi tidak transitif (jika A↔B dan B↔C, A tetap tak bisa ke C). Untuk banyak VPC, jaringan peering menjadi rumit (mesh).
- Transit Gateway — "hub" pusat tempat banyak VPC (dan koneksi on-premise) tersambung. Menggantikan mesh peering yang berantakan dengan topologi bintang yang rapi.
Syarat mutlak peering: rentang CIDR tidak boleh tumpang tindih. Jika VPC-A dan VPC-B sama-sama 10.0.0.0/16, mereka tak bisa di-peer — alamatnya bertabrakan. Rencanakan alokasi CIDR sejak awal (misal prod 10.0.0.0/16, staging 10.1.0.0/16).
Security Group vs Network ACL
Dua lapis firewall di VPC yang sering membingungkan:
| Aspek | Security Group (SG) | Network ACL (NACL) |
|---|---|---|
| Berlaku pada | Instance/ENI (per sumber daya) | Subnet (semua di dalamnya) |
| Sifat | Stateful (respons otomatis diizinkan) | Stateless (harus atur dua arah) |
| Aturan | Hanya Allow | Allow & Deny |
| Evaluasi | Semua aturan digabung | Berurutan by nomor, berhenti di match pertama |
| Pakai untuk | Kontrol utama sehari-hari | Pagar kasar level subnet, blokir IP jahat |
Untuk 95% kasus, atur keamanan lewat Security Group saja — ia lebih mudah dipahami karena stateful. Gunakan NACL hanya sebagai lapisan tambahan (misalnya memblokir rentang IP tertentu di seluruh subnet). Jangan mencoba menduplikasi semua aturan SG di NACL; itu resep untuk kebingungan.
The network is the computer.
John Gage, Sun Microsystems
VPC = jaringan privat, diberi CIDR (mis. 10.0.0.0/16). Dibagi jadi subnet per-AZ: publik (route 0.0.0.0/0 → IGW) vs privat (route 0.0.0.0/0 → NAT GW). IGW = dua arah (subnet publik); NAT GW = keluar saja untuk subnet privat. Multi-VPC: Peering (1:1, tidak transitif) atau Transit Gateway (hub bintang untuk banyak VPC); syarat CIDR tidak tumpang tindih. Firewall: Security Group (per-instance, stateful, Allow saja) vs NACL (per-subnet, stateless, Allow+Deny). Default: pakai SG; sebar tiap tier ke ≥2 AZ; app+DB di subnet privat.
RDS & Layanan AWS Lain
Menjalankan basis data sendiri di EC2 memungkinkan, tapi berarti Anda yang mengurus backup, patch, replikasi, dan failover pada jam tiga pagi. Managed services membalik ini: AWS mengurus operasional yang membosankan, Anda fokus ke data. Bab ini menyapu tiga tetangga penting S3/EC2 — RDS, Lambda, dan trio jaringan CloudFront/Route 53.
RDS: basis data relasional terkelola
RDS (Relational Database Service) menjalankan mesin basis data populer — PostgreSQL, MySQL, MariaDB, SQL Server, Oracle — sebagai layanan terkelola. Yang Anda dapat:
- Backup otomatis & point-in-time recovery (kembali ke keadaan menit tertentu).
- Multi-AZ deployment — salinan siaga (standby) di AZ lain yang otomatis mengambil alih (failover) jika primary jatuh.
- Read replica — salinan baca untuk membagi beban query berat.
- Patch & upgrade versi yang dikelola AWS.
Ada juga Aurora, mesin buatan AWS yang kompatibel PostgreSQL/MySQL dengan performa & skalabilitas lebih tinggi, dan Aurora Serverless yang menyesuaikan kapasitas otomatis. Untuk data non-relasional, DynamoDB (NoSQL key-value/dokumen, sangat skalabel) adalah pilihan AWS.
Taruh RDS di subnet privat — basis data tidak boleh dijangkau langsung dari internet. Beri akses hanya dari Security Group aplikasi Anda. Aktifkan Multi-AZ untuk produksi; ia menggandakan biaya compute DB tapi memberi failover otomatis yang menyelamatkan Anda saat AZ bermasalah.
Biaya RDS = jam instance DB + storage + I/O + backup di atas kuota + transfer. Multi-AZ ≈ 2× biaya compute. Read replica menambah instance lagi. Untuk dev/staging, matikan atau pakai instance kecil. Aurora punya model harga sendiri (per I/O atau kapasitas). Semua estimasi — verifikasi ke kalkulator RDS resmi.
Lambda: menjalankan kode tanpa server
AWS Lambda adalah serverless compute: Anda mengunggah fungsi, dan AWS menjalankannya hanya saat dipanggil — oleh HTTP request (via API Gateway), event S3, pesan antrean, atau jadwal. Anda tidak mengelola server; Anda membayar per invocation dan per milidetik waktu jalan.
Kapan Lambda bersinar: tugas pendek dan event-driven — memproses gambar yang baru diunggah, webhook, cron job, glue antar-layanan. Kapan kurang cocok: proses yang berjalan lama, butuh koneksi persisten, atau sensitif terhadap cold start (jeda saat fungsi "dingin" dibangunkan).
export const handler = async (event) => {
const nama = event.queryStringParameters?.nama ?? "dunia";
return {
statusCode: 200,
headers: { "content-type": "application/json" },
body: JSON.stringify({ pesan: `Halo, ${nama}!` }),
};
};
Lambda punya batas: durasi maksimum (default beberapa menit), ukuran paket, dan memori. Cold start bisa menambah ratusan milidetik pada request pertama. Untuk API dengan latensi ketat & trafik tinggi konstan, container yang selalu hangat (ECS/Cloud Run dengan min-instance) sering lebih cocok daripada Lambda.
CloudFront & Route 53
- CloudFront — CDN AWS. Menyimpan cache aset di ratusan Edge, memberi HTTPS, dan bisa berdiri di depan S3, ALB, atau origin mana pun. Mengurangi latensi & beban origin sekaligus.
- Route 53 — layanan DNS AWS (namanya dari port DNS, 53). Selain menerjemahkan nama ke alamat, ia punya routing policy canggih: latency-based, geolocation, weighted (untuk canary), dan failover (arahkan ke cadangan saat health check gagal).
Kombinasi khas produksi: pengguna mengetik tokoku.com → Route 53 menerjemahkannya → ke CloudFront → yang menyajikan aset statis dari S3 dan meneruskan request dinamis ke ALB → ke aplikasi di EC2/ECS. Kita lihat sisi DNS-nya di bab berikut.
There are only two hard things in Computer Science: cache invalidation and naming things.
Phil Karlton
Managed services AWS inti: RDS (DB relasional terkelola: PostgreSQL/MySQL/dll; fitur backup otomatis, Multi-AZ failover, read replica; taruh di subnet privat) — varian: Aurora, Aurora Serverless; NoSQL: DynamoDB. Lambda = serverless compute event-driven, bayar per invocation+ms, cocok tugas pendek; waspadai cold start & batas durasi. CloudFront = CDN; Route 53 = DNS dengan routing policy (latency/geo/weighted/failover). Pola: Route 53 → CloudFront → S3 (statis) + ALB → app (dinamis).
Subdomain & DNS
DNS adalah buku telepon internet: ia menerjemahkan nama yang manusia ingat (api.tokoku.com) menjadi alamat yang mesin pakai (sebuah IP atau nama lain). Kedengarannya sepele, tapi salah konfigurasi DNS adalah penyebab paling umum "kok situs saya tidak bisa dibuka padahal servernya jalan". Bab ini membuat DNS jelas dan memberi Anda strategi subdomain yang rapi.
Jenis record: A, AAAA, CNAME, dan kawan
Sebuah domain punya sekumpulan record di zone-nya. Yang paling sering Anda pakai:
| Record | Menerjemahkan ke | Contoh pemakaian |
|---|---|---|
A | Alamat IPv4 | tokoku.com → 203.0.113.10 |
AAAA | Alamat IPv6 | tokoku.com → 2001:db8::1 |
CNAME | Nama lain (alias) | www → tokoku.com |
MX | Mail server | Rute email ke provider |
TXT | Teks bebas | Verifikasi domain, SPF/DKIM |
NS | Name server otoritatif | Delegasi zone |
| Alias/ANAME | IP dari sumber daya cloud | Root domain → CloudFront/ALB |
Dua hal yang sering menjebak pemula:
- CNAME tak bisa di root (apex) domain. Standar DNS melarang CNAME pada
tokoku.compolos (hanya di subdomain sepertiwww.tokoku.com). Solusinya adalah record Alias (Route 53) atau ANAME/flattening (Cloudflare) yang berperilaku seperti CNAME tapi legal di apex. - TTL & propagasi. Setiap record punya TTL (time-to-live) — berapa lama resolver menyimpan cache jawabannya. Ubah record dengan TTL 24 jam, dan perubahan bisa "terlihat lambat" hingga cache lama kedaluwarsa. Turunkan TTL sebelum migrasi.
Subdomain per layanan
Saat aplikasi tumbuh, memisahkan bagian ke subdomain membuat arsitektur bersih dan mudah dirutekan:
tokoku.com&www.tokoku.com— situs utama (frontend).api.tokoku.com— backend API.cdn.tokoku.com/static.tokoku.com— aset statis via CDN.admin.tokoku.com— panel internal (batasi aksesnya).staging.tokoku.com— lingkungan uji.
Route 53 vs Cloudflare
Anda tak wajib memakai DNS dari cloud yang sama dengan server. Dua pilihan populer:
- Route 53 — terintegrasi erat dengan AWS (record Alias ke ALB/CloudFront, health check + failover). Pilihan alami jika seluruh infra di AWS.
- Cloudflare — DNS cepat + proxy/CDN + proteksi DDoS + WAF, dengan tier gratis yang murah hati. Banyak tim memakai Cloudflare di depan apa pun, termasuk AWS/GCP.
- Turunkan TTL record ke 60–300 detik, tunggu TTL lama kedaluwarsa.
- Siapkan target baru (server/LB) dan uji lewat IP/hostname langsung.
- Ubah record menunjuk ke target baru.
- Pantau; setelah stabil, naikkan lagi TTL untuk mengurangi query.
DNS menerjemahkan nama → alamat. Record: A (IPv4), AAAA (IPv6), CNAME (alias, tak boleh di apex — pakai Alias/ANAME), MX (email), TXT (verifikasi/SPF/DKIM), NS (delegasi). TTL menentukan lama cache; turunkan sebelum migrasi. Strategi subdomain: apex/www (frontend/CDN), api (backend/ALB), cdn/static (CDN), admin (privat), staging (uji). DNS provider: Route 53 (integrasi AWS, Alias, failover) atau Cloudflare (DNS+proxy+DDoS+WAF, tier gratis). Migrasi tanpa downtime: turunkan TTL → siapkan target → ubah record → pantau.
Peta Layanan AWS ↔ GCP
Sebelum masuk ke dunia GCP, mari pasang jembatan mental. Hampir setiap layanan AWS punya padanan di GCP — nama beda, konsep sama. Alat di bawah ini interaktif: pilih kebutuhan Anda, dan ia menampilkan layanan AWS & GCP yang cocok, kapan dipakai, dan catatan biaya. Klik nama layanan untuk menyalinnya.
Padanan ini "cukup dekat", bukan identik fitur-per-fitur. Detail, batas, dan harga tiap layanan berbeda dan berubah. Pakai peta ini sebagai titik awal — verifikasi kesetaraan & biaya ke dokumentasi resmi masing-masing sebelum memutuskan.
Perhatikan polanya: storage, compute, database, jaringan, dan "perekat" (queue/secrets) ada di kedua cloud. Setelah Anda menguasai satu cloud, mempelajari yang lain sebagian besar adalah menerjemahkan nama. Sisa bab GCP akan memakai peta ini sebagai kompas.
Padanan inti AWS ↔ GCP: S3 ↔ Cloud Storage; EC2 ↔ Compute Engine; Lambda ↔ Cloud Functions; Fargate/App Runner ↔ Cloud Run; RDS ↔ Cloud SQL; DynamoDB ↔ Firestore/Bigtable; CloudFront ↔ Cloud CDN; Route 53 ↔ Cloud DNS; ELB/ALB ↔ Cloud Load Balancing; EKS ↔ GKE; Secrets Manager ↔ Secret Manager; SQS ↔ Pub/Sub; IAM ↔ Cloud IAM; VPC ↔ VPC (GCP VPC bersifat global, subnet per-region). Konsep sepadan; fitur & harga berbeda — verifikasi.
GCP & IAM: Cara Google Menata
Google Cloud terasa berbeda dari AWS bukan karena konsepnya lain, tapi karena penataannya lain. Di mana AWS berpusat pada "akun", GCP berpusat pada project, dan membungkusnya dengan hierarki organisasi yang rapi. Sekali Anda paham perbedaan penataan ini, sisa GCP mengalir dengan mudah karena kosakata layanannya sudah Anda kenali dari peta tadi.
Project, folder, dan organisasi
Hierarki resource GCP dari atas ke bawah:
- Organization — puncak, mewakili perusahaan/domain Anda.
- Folder — pengelompokan opsional (per departemen, per lingkungan).
- Project — unit inti. Semua sumber daya (VM, bucket, database) tinggal di dalam sebuah project. Project adalah batas billing, izin, dan kuota. Ini padanan terdekat "akun kerja" di AWS, tapi jauh lebih ringan untuk dibuat banyak.
Praktik umum: satu project per lingkungan (tokoku-prod, tokoku-staging) atau per tim/layanan, sehingga izin dan biaya terpisah bersih. Membuat project baru di GCP semudah beberapa klik — berbeda dengan AWS di mana orang cenderung menahan diri membuat banyak akun.
IAM di GCP: role, member, dan binding
IAM GCP menjawab pertanyaan yang sama seperti AWS ("siapa boleh apa"), dengan model yang sedikit berbeda:
- Member (principal) — siapa: akun Google, service account (identitas non-manusia untuk aplikasi/VM), grup, atau seluruh domain.
- Role — kumpulan permission. Tiga jenis: basic (Owner/Editor/Viewer — terlalu luas, hindari di prod), predefined (dibuat Google per layanan, mis.
roles/storage.objectViewer), dan custom (Anda rakit sendiri). - Binding — ikatan "member ini punya role itu pada resource ini". Kebijakan IAM adalah kumpulan binding, dan diwariskan ke bawah hierarki (izin di level folder berlaku ke project di dalamnya).
| Konsep | AWS | GCP |
|---|---|---|
| Wadah utama | Account | Project |
| Identitas manusia | IAM User | Google Account / member |
| Identitas aplikasi | IAM Role (assume) | Service Account |
| Kumpulan izin | Policy (JSON) | Role (basic/predefined/custom) |
| Pewarisan izin | Via SCP di Organizations | Otomatis turun hierarki |
Role dasar GCP Editor dan Owner menggoda karena "membuat semuanya jalan", tetapi terlalu luas untuk produksi. Sama seperti AdministratorAccess di AWS, mereka melanggar least privilege. Pakai predefined role yang spesifik per layanan, dan buat custom role bila perlu presisi.
gcloud projects add-iam-policy-binding tokoku-prod \
--member="serviceAccount:app@tokoku-prod.iam.gserviceaccount.com" \
--role="roles/storage.objectViewer"
Focus on the user and all else will follow.
Google, "Ten things we know to be true"
GCP menata resource dalam hierarki: Organization > Folder > Project (unit inti; batas billing/izin/kuota; semua resource di dalam project). IAM GCP: Member (akun Google / service account / grup) + Role (basic: Owner/Editor/Viewer — hindari; predefined per-layanan; custom) + Binding (member+role+resource), diwariskan turun hierarki. Padanan: Account↔Project, IAM User↔member, IAM Role↔Service Account, Policy↔Role. CLI: gcloud. Prinsip least privilege sama; pakai predefined/custom, bukan Editor/Owner.
Cloud Storage: S3-nya Google
Jika Anda sudah paham S3 dari Bab 4, Cloud Storage (GCS) akan terasa seperti bertemu sepupu yang mirip. Konsep intinya identik — bucket, object, storage class, akses berbutir. Yang berbeda hanya nama dan beberapa detail. Bab pendek ini memetakan perbedaannya agar Anda bisa langsung produktif.
Bucket, object, dan storage class GCS
Sama seperti S3, GCS menyimpan object dalam bucket bernama unik global, diidentifikasi oleh name (mirip key). Storage class-nya:
| GCS class | Padanan S3 | Untuk |
|---|---|---|
| Standard | S3 Standard | Data panas |
| Nearline | Standard-IA | Akses < 1×/bulan |
| Coldline | Glacier Instant | Akses < 1×/kuartal |
| Archive | Glacier Deep Archive | Arsip jangka panjang |
Perbedaan menarik: di GCS, storage class melekat per-object tapi bucket punya default. GCS juga menawarkan location type: regional (satu region), dual-region, atau multi-region (tersebar, untuk ketersediaan tinggi). Object diakses lewat gs://bucket/name (di tooling) atau https://storage.googleapis.com/bucket/name.
Akses, signed URL, dan lifecycle
- Uniform bucket-level access — mode akses yang disarankan: kendali lewat IAM saja (bukan ACL per-object yang lama). Lebih sederhana dan lebih aman.
- Signed URL — padanan presigned URL S3: tautan sementara untuk unggah/unduh satu object tanpa membuka bucket.
- Object Lifecycle Management — padanan Lifecycle Policy S3: pindahkan ke Nearline/Coldline atau hapus object otomatis berdasarkan umur.
- Object Versioning — simpan versi lama saat ditimpa/dihapus.
# buat bucket regional di Jakarta
gcloud storage buckets create gs://tokoku-uploads \
--location=asia-southeast2 \
--uniform-bucket-level-access
# aktifkan versioning
gcloud storage buckets update gs://tokoku-uploads --versioning
Sama seperti S3, jangan buat bucket GCS publik tanpa alasan kuat. Menambahkan member allUsers ke sebuah bucket membukanya ke seluruh internet. Untuk situs/aset publik, taruh Cloud CDN di depan dan jaga bucket tetap privat.
Struktur biaya GCS mirip S3: storage per GB (beda per class & location), operasi (per 1.000/10.000), dan egress (transfer keluar, sering terbesar). Multi-region lebih mahal simpan tapi lebih tahan. Pakai lifecycle untuk menurunkan class data dingin. Estimasi — verifikasi ke kalkulator GCP.
GCS = object storage Google, sepadan S3. Bucket (unik global) > object (identified by name). Storage class: Standard↔S3 Standard, Nearline↔Standard-IA, Coldline↔Glacier Instant, Archive↔Deep Archive. Location type: regional/dual/multi-region. Akses: pakai Uniform bucket-level access (IAM, bukan ACL); Signed URL ↔ presigned URL; Object Lifecycle ↔ Lifecycle Policy; Versioning sama. URI: gs://bucket/name. Jangan tambah allUsers; taruh Cloud CDN di depan bucket privat. Biaya = storage + operasi + egress.
Compute Engine, Cloud Run & Cloud SQL
Trio compute GCP menutupi tiga cara berbeda menjalankan beban kerja: mesin virtual penuh (Compute Engine), container serverless yang menskala ke nol (Cloud Run), dan basis data terkelola (Cloud SQL). Ketiganya adalah padanan langsung EC2, Fargate, dan RDS. Bab ini menunjukkan apa yang setara dan di mana GCP menawarkan kenyamanan ekstra.
Compute Engine: VM ala Google
Compute Engine (GCE) adalah "EC2-nya GCP": Anda menyalakan VM dengan tipe mesin pilihan, image OS, dan disk. Bedanya dengan AWS yang terasa nyaman:
- Custom machine type — Anda bisa menentukan jumlah vCPU dan RAM secara bebas (bukan hanya ukuran preset), menghindari membayar kapasitas yang tak terpakai.
- Sustained use discount — diskon otomatis jika VM berjalan sebagian besar bulan, tanpa komitmen di muka.
- Preemptible / Spot VM — padanan Spot AWS: jauh lebih murah, bisa dicabut.
- Live migration — Google memindahkan VM Anda saat maintenance host tanpa mematikannya.
Tipe mesin ditulis seperti e2-standard-4 (seri e2, seimbang, 4 vCPU) atau n2-highmem-8. Jaringan memakai VPC GCP yang — menariknya — bersifat global: satu VPC bisa mencakup banyak region, dengan subnet per-region. Ini berbeda dari VPC AWS yang terikat satu region.
Cloud Run: container serverless
Cloud Run mungkin fitur GCP yang paling disukai developer. Anda memberi sebuah container image (yang mendengarkan port HTTP), dan Cloud Run menjalankannya — menskala otomatis dari nol (tidak ada biaya saat tak ada trafik) sampai banyak instance saat ramai. Tak ada server yang diurus, tak ada cluster yang dipelihara.
# bangun & deploy langsung dari source (atau dari image yang sudah ada)
gcloud run deploy tokoku-api \
--image=asia-southeast2-docker.pkg.dev/tokoku-prod/app/api:1.4.0 \
--region=asia-southeast2 \
--allow-unauthenticated \
--min-instances=0 --max-instances=20
Cloud Run adalah titik manis antara Lambda dan Kubernetes: lebih fleksibel dari Lambda (container apa pun, bahasa apa pun, request lebih panjang), jauh lebih sederhana dari Kubernetes (tak ada cluster). Untuk banyak API dan web service, Cloud Run adalah default yang sangat baik. Padanan AWS terdekat: AWS Fargate (via ECS) atau App Runner.
Set --min-instances=0 untuk beban yang boleh "tidur" (hemat maksimal, tapi ada cold start), atau --min-instances=1 untuk menjaga satu instance selalu hangat (menghilangkan cold start dengan biaya kecil tetap). Pilih sesuai sensitivitas latensi layanan Anda.
Cloud SQL & basis data GCP
Cloud SQL adalah RDS-nya GCP: PostgreSQL, MySQL, dan SQL Server terkelola dengan backup otomatis, replika baca, dan opsi ketersediaan tinggi (HA) lintas-zone. Untuk skala lebih besar atau global, GCP menawarkan:
- Cloud Spanner — basis data relasional terdistribusi global dengan konsistensi kuat (kelas berat, mahal, untuk skala ekstrem).
- Firestore — NoSQL dokumen (padanan arah DynamoDB), cocok untuk aplikasi web/mobile realtime.
- Bigtable — NoSQL wide-column untuk data besar & analitik throughput tinggi.
- BigQuery — data warehouse serverless untuk analitik SQL atas data raksasa.
| Kebutuhan | AWS | GCP |
|---|---|---|
| VM | EC2 | Compute Engine |
| Container serverless | Fargate / App Runner | Cloud Run |
| Fungsi serverless | Lambda | Cloud Functions |
| DB relasional | RDS / Aurora | Cloud SQL / Spanner |
| NoSQL dokumen | DynamoDB | Firestore |
| Data warehouse | Redshift | BigQuery |
Cloud Run menagih per-request dan per waktu-CPU/memori saat memproses (bisa nyaris nol saat idle jika min-instances=0). Compute Engine seperti EC2 (per detik + disk). Cloud SQL seperti RDS (jam instance + storage + backup; HA menggandakan compute). Spanner & BigQuery punya model sendiri yang bisa mahal pada skala — ukur dulu. Semua estimasi — verifikasi ke kalkulator GCP.
Trio compute GCP: Compute Engine (VM, ↔EC2; custom machine type, sustained-use discount, preemptible/Spot, live migration; VPC GCP bersifat global dengan subnet per-region). Cloud Run (container serverless HTTP, skala ke nol; ↔Fargate/App Runner; titik manis antara Lambda & K8s; atur min/max-instances). Cloud SQL (DB relasional terkelola, ↔RDS). DB lain: Spanner (relasional global), Firestore (↔DynamoDB), Bigtable (wide-column), BigQuery (data warehouse, ↔Redshift).
Docker: Mengemas Aplikasi
"Tapi di komputer saya jalan!" adalah keluhan setua industri perangkat lunak. Docker membunuh kalimat itu. Ia mengemas aplikasi Anda beserta seluruh lingkungannya — runtime, pustaka, konfigurasi — menjadi satu image yang berjalan identik di laptop Anda, di server rekan, dan di cloud. Container adalah fondasi cara modern men-deploy, dan bab ini membangunnya dari nol.
Image, container, dan layer
Dua kata yang harus dibedakan:
- Image — "cetakan" yang tidak berubah (immutable): berisi filesystem aplikasi + instruksi menjalankannya. Seperti kelas dalam OOP.
- Container — instance berjalan dari sebuah image. Seperti object dari kelas. Anda bisa menjalankan banyak container dari satu image.
Image tersusun dari layer yang bertumpuk — tiap instruksi di Dockerfile menambah satu layer. Layer di-cache dan dibagikan antar-image, sehingga build ulang cepat dan penyimpanan hemat. Container berbeda dari VM: ia tak membawa OS penuh, hanya berbagi kernel host, sehingga jauh lebih ringan dan cepat start (milidetik, bukan menit).
Dockerfile & multi-stage build
Dockerfile adalah resep membangun image: daftar instruksi yang dijalankan berurutan. Contoh naif untuk aplikasi Node.js:
FROM node:20
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
RUN npm run build
EXPOSE 3000
CMD ["node", "dist/server.js"]
Masalahnya: image ini besar (membawa seluruh toolchain build dan devDependencies). Multi-stage build memisahkan tahap "membangun" dari tahap "menjalankan", sehingga image akhir hanya berisi yang perlu untuk runtime:
# --- tahap build ---
FROM node:20 AS build
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . .
RUN npm run build
# --- tahap runtime ---
FROM node:20-slim AS runtime
WORKDIR /app
ENV NODE_ENV=production
COPY package*.json ./
RUN npm ci --omit=dev
COPY --from=build /app/dist ./dist
EXPOSE 3000
USER node
CMD ["node", "dist/server.js"]
- Urutkan instruksi dari yang jarang berubah ke sering berubah (salin
package.json& install sebelum menyalin seluruh kode) agar cache layer maksimal. - Pakai base image kecil (
-slim,alpine, atau distroless). - Tambahkan
.dockerignore(kecualikannode_modules,.git, dll). - Jalankan sebagai user non-root (
USER node) untuk keamanan.
Compose & registry
Docker Compose mendefinisikan beberapa container yang bekerja bersama (app + database + cache) dalam satu file compose.yaml, dijalankan dengan satu perintah docker compose up. Ideal untuk pengembangan lokal dan setup kecil.
services:
app:
build: .
ports: ["3000:3000"]
environment:
DATABASE_URL: postgres://app:secret@db:5432/tokoku
depends_on: [db]
db:
image: postgres:16
environment:
POSTGRES_USER: app
POSTGRES_PASSWORD: secret
POSTGRES_DB: tokoku
volumes: ["dbdata:/var/lib/postgresql/data"]
volumes:
dbdata:
Setelah image dibangun, ia disimpan di registry — gudang image. Ada Docker Hub (publik/privat), dan registry per-cloud: Amazon ECR, Google Artifact Registry (dulu GCR). Alur bakunya: docker build → docker tag → docker push ke registry → lingkungan produksi pull image itu.
Jangan pernah menaruh rahasia (password, API key) di dalam image atau Dockerfile — ia tersimpan di layer dan bisa dibaca siapa pun yang menarik image. Berikan rahasia lewat environment variable saat runtime atau lewat secrets manager (Bab 16). Juga: selalu pin tag base image (node:20-slim, bukan node:latest) agar build reprodusibel.
Build, ship, run — anywhere.
Moto awal Docker Inc.
Docker mengemas app + lingkungan jadi image immutable (tersusun layer ter-cache); container = instance berjalan dari image, berbagi kernel host (lebih ringan dari VM). Dockerfile = resep build; multi-stage memisahkan build vs runtime agar image kecil. Praktik: urutkan instruksi cache-friendly, base image kecil (slim/alpine/distroless), .dockerignore, USER non-root, pin tag base. Compose menjalankan banyak container (app+db) via compose.yaml. Registry (Docker Hub/ECR/Artifact Registry) menyimpan image; alur build→tag→push→pull. Jangan taruh rahasia dalam image.
Kubernetes: Orkestra Container
Satu container mudah dijalankan. Tetapi lima puluh container di sepuluh mesin, yang harus tetap hidup saat sebagian mati, menskala saat ramai, dan menerima update tanpa downtime — itu masalah orkestrasi. Kubernetes (sering disingkat K8s) adalah konduktor orkestra itu. Ia kuat, dan — jujur saja — rumit. Bab ini memberi Anda model mental yang benar, dan yang lebih penting: kejujuran tentang kapan Anda belum membutuhkannya.
Objek inti: Pod, Deployment, Service, Ingress
Kubernetes bekerja secara deklaratif: Anda menyatakan "keadaan yang diinginkan" (misalnya "aku mau 3 salinan aplikasi ini selalu berjalan"), dan K8s terus bekerja menjaga kenyataan cocok dengan keinginan itu. Empat objek yang wajib Anda kenal:
- Pod — unit terkecil yang bisa dijalankan: satu (atau beberapa) container yang berbagi jaringan & storage. Pod bersifat fana — ia bisa mati dan diganti kapan saja.
- Deployment — mengelola sekumpulan Pod identik: menjaga jumlah replika, dan melakukan rolling update (mengganti pod lama dengan baru bertahap tanpa downtime) serta rollback.
- Service — alamat jaringan stabil untuk sekumpulan Pod yang fana. Karena IP pod berubah-ubah, Service memberi satu nama/IP tetap dan membagi trafik (load balance) ke pod-pod di belakangnya.
- Ingress — aturan routing HTTP/HTTPS dari luar ke Service, berbasis host/path (misal
api.tokoku.com→ service api). Ditangani oleh ingress controller.
Ditambah dua objek konfigurasi: ConfigMap (konfigurasi non-rahasia) dan Secret (data sensitif seperti password — walau perlu diamankan lebih lanjut, lihat Bab 16).
kubectl & manifest YAML
Anda berbicara dengan cluster lewat kubectl, dan menyatakan keinginan dalam file manifest YAML. Contoh Deployment + Service:
apiVersion: apps/v1
kind: Deployment
metadata:
name: api
spec:
replicas: 3
selector:
matchLabels: { app: api }
template:
metadata:
labels: { app: api }
spec:
containers:
- name: api
image: registry.example.com/tokoku/api:1.4.0
ports: [{ containerPort: 3000 }]
readinessProbe:
httpGet: { path: /healthz, port: 3000 }
resources:
requests: { cpu: "100m", memory: "128Mi" }
limits: { cpu: "500m", memory: "512Mi" }
---
apiVersion: v1
kind: Service
metadata:
name: api
spec:
selector: { app: api }
ports: [{ port: 80, targetPort: 3000 }]
EKS/GKE & kapan Anda benar-benar perlu K8s
Menjalankan cluster K8s sendiri (mengurus control plane, etcd, upgrade) itu berat. Karena itu ada managed Kubernetes: Amazon EKS, Google GKE (GKE Autopilot bahkan mengelola node untuk Anda), dan Azure AKS. Mereka menangani control plane; Anda fokus ke workload.
Kubernetes adalah palu yang kuat, tetapi tidak semua masalah adalah paku. Untuk satu-dua layanan, Cloud Run, App Runner, atau ECS Fargate hampir selalu pilihan lebih baik — 90% manfaat, 10% kerumitan. Pertimbangkan K8s ketika: Anda punya banyak microservice, butuh portabilitas multi-cloud, punya tim platform yang mengurusnya, atau butuh kontrol penjadwalan/jaringan yang halus.
| Kebutuhan Anda | Pilihan sederhana | Kubernetes bila... |
|---|---|---|
| 1–3 layanan HTTP | Cloud Run / App Runner / Fargate | hampir tak pernah perlu |
| Banyak microservice | — | koordinasi & service discovery jadi berat |
| Job batch & cron kompleks | Cloud Run Jobs / Batch | butuh penjadwalan kaya |
| Portabilitas multi-cloud | — | K8s jadi lapisan netral |
Kubernetes is a platform for building platforms. It's a better place to start; not the endgame.
Kelsey Hightower
Kubernetes = orkestrasi container deklaratif (nyatakan desired state, K8s menjaganya). Objek inti: Pod (unit terkecil, fana) < Deployment (jaga N replika, rolling update/rollback) ; Service (IP stabil + load balance ke pod) ; Ingress (routing HTTP host/path → service) ; ConfigMap/Secret (konfigurasi). CLI: kubectl + manifest YAML. Managed: EKS (AWS), GKE (Google, Autopilot mengelola node), AKS (Azure). PENTING: untuk 1–3 layanan pakai Cloud Run/App Runner/Fargate, bukan K8s. K8s layak saat banyak microservice, multi-cloud, atau ada tim platform.
CI/CD ke Cloud
Men-deploy dengan tangan — SSH ke server, tarik kode, restart — bekerja sampai ia tidak. Ia lambat, mudah lupa langkah, dan tak ada jejak siapa mengubah apa. CI/CD mengubah deploy menjadi konsekuensi otomatis dari git push: setiap perubahan diuji, dikemas jadi image, dan diluncurkan tanpa drama. Bab ini merangkai semua yang sudah Anda pelajari menjadi satu pipa mulus.
CI vs CD: dua huruf, dua ide
- CI (Continuous Integration) — setiap push otomatis menjalankan build + test + lint. Tujuannya menangkap masalah sebelum masuk ke branch utama.
- CD (Continuous Delivery/Deployment) — setelah lolos CI, artefak (image) otomatis dikirim ke registry lalu di-deploy. Delivery = siap deploy dengan satu tombol; Deployment = deploy otomatis penuh.
Contoh workflow GitHub Actions
Berikut workflow lengkap yang membangun image, mendorong ke registry, lalu men-deploy — contoh untuk Cloud Run (pola serupa untuk EKS/GKE dengan kubectl):
name: build-and-deploy
on:
push:
branches: [main]
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with: { node-version: 20, cache: npm }
- run: npm ci
- run: npm test
deploy:
needs: test
runs-on: ubuntu-latest
permissions:
contents: read
id-token: write # untuk OIDC (tanpa menyimpan secret key jangka panjang)
steps:
- uses: actions/checkout@v4
# autentikasi ke GCP via Workload Identity Federation (OIDC)
- uses: google-github-actions/auth@v2
with:
workload_identity_provider: ${{ secrets.GCP_WIF_PROVIDER }}
service_account: ${{ secrets.GCP_SA_EMAIL }}
- uses: google-github-actions/setup-gcloud@v2
- name: Build & push image
run: |
IMAGE=asia-southeast2-docker.pkg.dev/$PROJECT/app/api:${{ github.sha }}
gcloud auth configure-docker asia-southeast2-docker.pkg.dev -q
docker build -t "$IMAGE" .
docker push "$IMAGE"
echo "IMAGE=$IMAGE" >> "$GITHUB_ENV"
env:
PROJECT: tokoku-prod
- name: Deploy ke Cloud Run
run: |
gcloud run deploy tokoku-api \
--image="$IMAGE" --region=asia-southeast2 \
--min-instances=1 --max-instances=20
Gunakan OIDC / Workload Identity Federation alih-alih menyimpan access key jangka panjang di secrets repo. Dengan OIDC, GitHub menukar token identitas jangka pendek ke cloud saat workflow berjalan — tak ada kredensial permanen yang bisa bocor. Ini praktik terbaik modern untuk kedua AWS dan GCP.
Beri tag image dengan github.sha (hash commit) atau versi semantik, bukan latest. Tag yang bergerak membuat "versi mana yang sedang jalan di produksi?" mustahil dijawab, dan rollback jadi menebak. Tag imutabel = deploy yang bisa dilacak dan dibalik.
CI = build+test+lint otomatis tiap push (tangkap bug sebelum merge). CD = kirim artefak → deploy (delivery: siap 1-tombol; deployment: otomatis penuh). Pipeline khas: push → test → build image → push registry → deploy (rollout); gagal di tahap mana pun menghentikan aliran. GitHub Actions: workflow YAML di .github/workflows, jobs dengan steps. Praktik: autentikasi via OIDC/Workload Identity (bukan secret key jangka panjang), tag image dengan commit SHA (bukan latest), pisah job test dan deploy dengan needs. Pola sama untuk Cloud Run/EKS/GKE (ganti langkah deploy dengan kubectl apply).
Load Balancer & Auto-scaling
Satu server punya batas. Ketika pengunjung melampaui batas itu, Anda punya dua pilihan: membuat server lebih besar (scale up), atau menambah lebih banyak server dan membagi beban (scale out). Cloud sangat pandai pada yang kedua — asal ada dua komponen: load balancer yang membagi trafik, dan auto-scaling yang menambah/mengurangi server otomatis. Bab ini membuat aplikasi Anda elastis.
Load balancer: pembagi trafik
Load balancer (LB) duduk di depan sekumpulan server dan membagikan request masuk ke antara mereka, sambil menjauhkan trafik dari server yang sakit. Jenis LB di AWS:
- ALB (Application Load Balancer) — Layer 7 (HTTP/HTTPS). Bisa merutekan berdasarkan host/path (
/apike satu grup,/ke lain), terminasi TLS, dan cocok untuk web/microservice. - NLB (Network Load Balancer) — Layer 4 (TCP/UDP). Sangat cepat, latensi rendah, untuk trafik non-HTTP atau throughput ekstrem.
- GLB / Gateway LB — untuk appliance jaringan (firewall).
Di GCP, padanannya adalah Cloud Load Balancing (global, satu IP anycast bisa melayani seluruh dunia — keunggulan arsitektur GCP). Konsep intinya sama: LB → target group/backend → instance/pod sehat.
Auto-scaling & health check
Health check adalah denyut nadi: LB (atau K8s) memanggil sebuah endpoint (misal GET /healthz) secara berkala. Jika sebuah instance gagal beberapa kali, ia dianggap sakit dan trafik dialihkan darinya — lalu (di auto-scaling group) diganti otomatis. Dua jenis probe yang penting (istilah K8s, tapi konsepnya universal):
- Liveness — "apakah proses masih hidup?" Jika gagal, restart.
- Readiness — "apakah siap menerima trafik?" (misal koneksi DB sudah siap). Jika gagal, jangan kirim trafik dulu, tapi jangan restart.
Auto-scaling menyesuaikan jumlah instance berdasarkan metrik — paling umum CPU, tapi bisa juga jumlah request, panjang antrean, atau metrik kustom. Anda menetapkan batas min dan max, target metrik (misal "jaga CPU rata-rata 60%"), dan aturan main. Di AWS ini Auto Scaling Group; di K8s ada Horizontal Pod Autoscaler; Cloud Run melakukannya otomatis per-request.
- Buat aplikasi stateless (tak menyimpan session di memori lokal) agar instance mana pun bisa melayani request mana pun. Simpan session di Redis/DB.
- Sediakan endpoint health check yang cepat & jujur (cek dependensi kritis, tapi jangan berat).
- Set scale-out agresif (cepat menambah saat lonjakan) dan scale-in konservatif (pelan mengurangi) untuk menghindari flapping.
- Beri jeda warm-up: instance baru butuh waktu sebelum siap penuh.
Auto-scaling menghemat karena Anda tak membayar kapasitas puncak 24 jam — tapi awasi max: batas atas yang terlalu tinggi + bug yang memicu beban bisa meledakkan tagihan. LB juga berbiaya tetap per jam + per unit trafik (LCU/data). Estimasi — verifikasi ke kalkulator resmi.
Hope is not a strategy.
Prinsip Google SRE
Scale up (server lebih besar) vs scale out (lebih banyak server + LB). LB AWS: ALB (L7 HTTP, routing host/path, TLS), NLB (L4 TCP/UDP, cepat). GCP: Cloud Load Balancing (global, anycast). LB kirim trafik hanya ke instance yang lulus health check. Probe: liveness (hidup? restart bila gagal) vs readiness (siap trafik? tahan trafik bila gagal). Auto-scaling: min/max + target metrik (CPU/request/queue); AWS Auto Scaling Group, K8s HPA, Cloud Run otomatis. Syarat: aplikasi stateless (session di Redis/DB), scale-out agresif + scale-in konservatif.
Keamanan & Biaya
Dua hal yang paling sering membuat orang menyesal di cloud: sistem yang tak aman, dan tagihan yang mengejutkan. Keduanya berbagi akar yang sama — kurang visibilitas dan kurang disiplin. Bab ini adalah kumpulan kebiasaan yang, bila dipasang sejak awal, menyelamatkan Anda dari malam-malam buruk di masa depan.
Keamanan berlapis
Keamanan cloud bukan satu tombol; ia lapisan. Prioritaskan dari yang paling berdampak:
- Identitas. MFA di mana-mana, least privilege (Bab 3 & 9), role/service account alih-alih key jangka panjang, rotasi kredensial berkala.
- Jaringan. DB & app di subnet privat, Security Group ketat, tak ada port admin terbuka ke
0.0.0.0/0, WAF di depan aplikasi publik. - Data. Enkripsi at-rest (S3/EBS/RDS/GCS mendukungnya, sering default) dan in-transit (HTTPS/TLS). Bucket privat + Block Public Access.
- Rahasia. Jangan pernah di kode/image/git. Pakai secrets manager.
- Audit. Aktifkan CloudTrail (AWS) / Cloud Audit Logs (GCP) untuk jejak siapa melakukan apa.
Secrets manager
Rahasia (password DB, API key, token) harus hidup di layanan khusus: AWS Secrets Manager / Parameter Store, atau Google Secret Manager. Aplikasi mengambilnya saat runtime lewat identitas (role/service account), bukan menyimpannya di file. Keuntungan: rotasi terpusat, akses ter-audit, dan tak ada rahasia yang bocor lewat git.
Sekali sebuah kredensial ter-commit ke git, anggap ia sudah bocor selamanya — menghapusnya di commit berikutnya tak cukup, karena riwayat menyimpannya. Yang benar: putar (rotate) kredensial itu segera, lalu pindahkan ke secrets manager. Pasang secret scanning (mis. git hooks, GitHub secret scanning) untuk mencegah kejadian berikutnya.
Kontrol biaya
Tagihan cloud yang meledak hampir selalu bisa dicegah dengan beberapa kebiasaan:
| Praktik | Apa yang dilakukan | Mencegah |
|---|---|---|
| Budget & alert | Anggaran + notifikasi 50/80/100% | Kejutan akhir bulan |
| Tagging disiplin | Label env/team/project | Biaya tak teratribusi |
| Matikan yang idle | Hentikan dev/staging malam & akhir pekan | Bayar mesin tidur |
| Right-sizing | Turunkan instance yang over-provisioned | Kapasitas mubazir |
| Savings Plan/Committed use | Komit untuk beban stabil | Harga On-Demand penuh |
| Lifecycle storage | Turunkan data dingin ke arsip | Storage panas berlebih |
| Awasi egress & NAT | Kurangi transfer keluar & lewat NAT | Biaya transfer tersembunyi |
Pasang budget alert di menit pertama akun baru dibuat — sebelum menyalakan apa pun. Banyak cerita horor "tagihan 5.000 USD" berasal dari sumber daya yang lupa dimatikan (instance GPU, NAT, load balancer) atau key bocor. Alert adalah asuransi termurah yang pernah ada.
Tiga sumber "biaya tersembunyi" paling umum: (1) data transfer/egress keluar cloud; (2) NAT Gateway per-GB; (3) sumber daya "menganggur tapi tetap ditagih" (Elastic IP tak terpakai, EBS snapshot menumpuk, load balancer tanpa trafik). Tinjau Cost Explorer/billing report bulanan. Semua estimasi — verifikasi ke konsol billing resmi.
An ounce of prevention is worth a pound of cure.
Benjamin Franklin
Keamanan berlapis (prioritas): identitas (MFA, least privilege, role/service account, rotasi) > jaringan (subnet privat, SG ketat, WAF, tak ada admin port ke 0.0.0.0/0) > data (enkripsi at-rest & in-transit, bucket privat) > rahasia (Secrets Manager/Secret Manager, jangan di git/image) > audit (CloudTrail/Cloud Audit Logs). Rahasia yang ter-commit = rotate segera. Kontrol biaya: budget alert (pasang duluan), tagging, matikan idle, right-sizing, Savings/Committed use, lifecycle storage, awasi egress+NAT. Biaya tersembunyi: egress, NAT per-GB, resource idle yang tetap ditagih.
Kapan Pakai Apa
Anda kini punya banyak alat. Bahaya berikutnya adalah paradoks pilihan: begitu banyak layanan sehingga tiap keputusan terasa berat. Bab ini adalah kompas — kumpulan pohon keputusan yang menyaring "apa yang saya butuhkan" menjadi "pakai ini". Ingat prinsip pemandu: pilih yang paling sederhana yang menyelesaikan masalah, dan naik kompleksitas hanya saat dipaksa.
Pohon keputusan: menjalankan aplikasi
- Apakah aplikasi Anda sebuah container HTTP tunggal / beberapa layanan kecil?
- Ya, dan boleh "tidur" saat sepi → Cloud Run / AWS App Runner (skala ke nol, paling hemat & sederhana)
- Ya, tapi butuh selalu hangat / latensi ketat → Cloud Run (min-instances≥1) / ECS Fargate
- Ini fungsi pendek yang dipicu event (upload, webhook, cron) → Lambda / Cloud Functions
- Apakah Anda punya banyak microservice / butuh kontrol penjadwalan & jaringan halus / multi-cloud?
- Ya, dan ada tim yang mengurus platform → Kubernetes terkelola (EKS / GKE)
- Belum ada tim platform → Tunda K8s; pakai Cloud Run/Fargate dulu
- Apakah Anda butuh kontrol penuh OS / software khusus / beban non-HTTP berjalan lama?
- Ya → EC2 / Compute Engine (VM) + auto-scaling group
Pohon keputusan: menyimpan data
- Apa bentuk datanya?
- File / gambar / video / backup / aset statis → S3 / Cloud Storage (+ CDN untuk publik)
- Data relasional (tabel, relasi, transaksi) → RDS / Cloud SQL (Aurora/Spanner bila skala ekstrem)
- Key-value / dokumen skalabel → DynamoDB / Firestore
- Cache cepat / session → ElastiCache / Memorystore (Redis)
- Analitik atas data raksasa → Redshift / BigQuery
Pohon keputusan: AWS atau GCP?
Jujur: untuk kebanyakan tim, keduanya bekerja dengan baik, dan keputusan lebih dipengaruhi keakraban tim, harga negosiasi, dan ekosistem daripada keunggulan teknis mutlak. Beberapa kecenderungan:
| Condong ke AWS bila... | Condong ke GCP bila... |
|---|---|
| Butuh layanan terluas & paling matang | Ingin container serverless termudah (Cloud Run) |
| Ekosistem & talenta terbesar | Fokus data/analitik/ML (BigQuery, Vertex AI) |
| Sudah banyak tooling pihak ketiga terintegrasi | Ingin jaringan global sederhana (VPC global, LB anycast) |
| Butuh region/opsi kepatuhan spesifik | Menyukai UX & default yang lebih ramah pemula |
Ingin mengurangi ketergantungan pada satu vendor? Bersandarlah pada lapisan portabel: container (Docker) berjalan di mana saja, PostgreSQL/Redis ada di kedua cloud, dan Kubernetes menjadi API netral. Hindari "merekatkan" seluruh logika bisnis ke layanan proprietary yang unik (kecuali manfaatnya jelas lebih besar dari biaya pindah).
Make it work, make it right, make it fast — dalam urutan itu.
Kent Beck
Prinsip pemilihan: paling sederhana yang cukup, naik kompleksitas hanya saat dipaksa. Compute: container HTTP + boleh tidur → Cloud Run/App Runner; butuh hangat → Cloud Run(min≥1)/Fargate; event pendek → Lambda/Cloud Functions; banyak microservice + tim platform → EKS/GKE; kontrol OS penuh → EC2/Compute Engine. Data: file → S3/GCS+CDN; relasional → RDS/Cloud SQL; KV/dokumen → DynamoDB/Firestore; cache → ElastiCache/Memorystore; analitik → Redshift/BigQuery. AWS vs GCP: keduanya layak; pilih atas keakraban tim, harga, ekosistem. Anti-lock-in: bersandar pada Docker/Postgres/K8s yang portabel.
Cara Dibaca AI
Buku ini ditulis untuk dua jenis pembaca. Yang pertama Anda — manusia dengan terminal terbuka. Yang kedua adalah model bahasa yang mungkin Anda minta meringkas, menjelaskan ulang, atau menjawab pertanyaan berdasarkan buku ini. Bab ini menjelaskan bagaimana teks ini dirancang agar keduanya mendapat manfaat maksimal — dan bagaimana Anda bisa memanfaatkannya.
Mengapa memikirkan pembaca AI?
Semakin banyak orang belajar lewat percakapan dengan AI: menempelkan dokumen, lalu bertanya. Dokumen yang terstruktur baik — dengan istilah yang didefinisikan, klaim yang ditandai tingkat kepastiannya, dan ringkasan padat — menghasilkan jawaban AI yang lebih akurat dan sedikit halusinasi. Menulis untuk AI, ternyata, juga membuat tulisan lebih baik untuk manusia.
Fitur yang membantu pembacaan AI
- Kotak "Untuk AI". Di akhir tiap bab ada ringkasan padat berlabel Untuk AI yang memampatkan poin inti bab menjadi bentuk yang mudah dikutip — peta ↔, aturan, dan urutan keputusan. Jika Anda meminta AI meringkas buku ini, kotak-kotak inilah tulang punggungnya.
- Penanda kepastian. Klaim yang cepat usang (harga, nama, batas) ditandai eksplisit "estimasi — verifikasi ke dokumentasi resmi". Ini memberi sinyal ke AI (dan Anda) untuk tidak memperlakukannya sebagai fakta beku.
- Padanan eksplisit. Konsep AWS dan GCP dipetakan berdampingan (S3 ↔ GCS, EC2 ↔ Compute Engine). Struktur berpasangan ini mudah diikuti model bahasa.
- Definisi sebelum pemakaian. Istilah didefinisikan saat pertama muncul, dan dikumpulkan lagi di glosarium.
Prompt yang berguna dengan buku ini
Bila Anda menempelkan buku ini (atau sebagiannya) ke sebuah AI, prompt berikut menghasilkan jawaban yang baik:
AI bisa salah, terutama pada detail yang cepat berubah (harga, batas kuota, nama menu). Perlakukan jawaban AI berdasarkan buku ini sebagai draf pertama yang cerdas, bukan kebenaran final. Untuk keputusan produksi — terutama yang menyangkut biaya & keamanan — selalu verifikasi ke dokumentasi resmi dan uji di lingkungan aman.
Buku ini dirancang ramah-AI: tiap bab diakhiri kotak "Untuk AI" (ringkasan padat, jadikan tulang punggung ringkasan); klaim volatil ditandai "estimasi — verifikasi"; konsep AWS↔GCP dipetakan berpasangan; istilah didefinisikan saat pertama muncul + glosarium. Saat meringkas: hormati penanda kepastian, jangan sajikan harga/batas sebagai fakta beku, arahkan verifikasi ke dokumentasi resmi untuk keputusan produksi. Prompt berguna: rancang arsitektur berlapis, terjemahkan AWS→GCP, audit keamanan/biaya, jelaskan konsep dengan analogi.
Penutup, FAQ & Bekal
Kita mulai dari satu server yang tersengal, dan berakhir dengan peta yang mencakup dua cloud, jaringan privat, container, orkestrasi, dan pipa deploy otomatis. Jika istilah di awal buku ini terasa seperti sup alfabet, semoga sekarang mereka terasa seperti kosakata — kata-kata yang menamai ide yang Anda pahami. Itulah tujuan sebenarnya: bukan menghafal setiap layanan, tetapi memiliki model mental yang cukup kuat untuk menavigasi apa pun yang datang berikutnya.
Infrastruktur yang baik jarang terlihat. Ketika berhasil, tak ada yang menyadarinya — situs cepat, deploy mulus, tagihan wajar, dan tidur Anda tak terganggu. Bekerja menuju ketidak-terlihatan itu adalah keahlian tersendiri. Mulailah kecil, otomatiskan sedini mungkin, ukur sebelum mengoptimasi, dan jadikan keamanan & biaya sebagai kebiasaan, bukan renungan belakangan.
You build it, you run it.
Werner Vogels, tentang budaya kepemilikan di Amazon
FAQ
1. Saya benar-benar baru. Mulai dari AWS atau GCP?
Ambil yang tim/lingkungan Anda paling akrab. Bila netral, GCP sering terasa lebih ramah pemula (Cloud Run, UX), sementara AWS punya ekosistem & lowongan kerja terbesar. Konsep intinya sama — keterampilan berpindah.
2. Berapa biaya belajar cloud?
Bisa nyaris gratis. Kedua cloud punya free tier dan kredit awal. Kuncinya disiplin: pasang budget alert dan matikan sumber daya setelah latihan. Estimasi — verifikasi ketentuan free tier terkini.
3. Apakah saya harus belajar Kubernetes?
Tidak untuk memulai. Untuk 1–3 layanan, Cloud Run/App Runner/Fargate memberi 90% manfaat tanpa kerumitan K8s. Pelajari Kubernetes saat Anda punya banyak microservice atau kebutuhan portabilitas nyata.
4. VPC terasa rumit. Bisakah saya melewatinya?
Untuk layanan serverless (Cloud Run, Lambda, S3), Anda bisa jauh tanpa menyentuh VPC secara mendalam. Tetapi begitu ada EC2 + RDS privat, memahami subnet publik/privat, IGW, dan NAT menjadi wajib. Ia tak sesulit kelihatannya — ulang baca Bab 6 dengan diagramnya.
5. Bagaimana mencegah tagihan mengejutkan?
Budget alert sejak menit pertama; matikan idle; awasi tiga biaya tersembunyi (egress, NAT, resource menganggur); tinjau billing bulanan; dan jangan pernah membiarkan access key bocor. Lihat Bab 16.
6. Apa cara teraman menyimpan kredensial?
Di secrets manager (AWS Secrets Manager / Google Secret Manager), diambil saat runtime lewat role/service account. Jangan pernah di kode, image, atau git. Untuk CI/CD, pakai OIDC alih-alih key jangka panjang.
7. S3 bucket saya harus publik agar situs bisa diakses?
Tidak. Justru sebaliknya: jaga bucket privat dan taruh CloudFront/Cloud CDN di depannya (via OAC). Ini lebih aman, memberi HTTPS, dan lebih cepat lewat cache Edge.
8. Kapan pakai Lambda vs container (Cloud Run/Fargate)?
Lambda untuk tugas pendek, event-driven, sporadis. Container untuk API yang butuh runtime fleksibel, request lebih panjang, atau selalu hangat. Cloud Run adalah jalan tengah yang sering ideal.
9. Apa itu "cold start" dan apakah masalah?
Jeda saat fungsi/instance "dingin" dibangunkan untuk request pertama. Masalah bila latensi kritis. Mitigasi: min-instances≥1 (Cloud Run), provisioned concurrency (Lambda), atau container yang selalu berjalan.
10. Multi-AZ, apakah wajib?
Untuk produksi yang tak boleh mati: ya, sebar ke ≥2 AZ. Untuk hobi/dev: tidak perlu. Multi-AZ menambah biaya (mis. RDS Multi-AZ ≈ 2× compute) demi ketahanan terhadap kegagalan satu data center.
11. Bedanya region dan AZ lagi?
Region = area geografis (mis. Singapura). AZ = data center terpisah di dalam region. Pilih region dekat pengguna; sebar ke banyak AZ untuk keandalan. Antar-region jarang perlu kecuali untuk pengguna global atau disaster recovery.
12. Docker atau langsung deploy kode?
Docker memberi reprodusibilitas ("jalan di mana saja") dan menjadi prasyarat Cloud Run/K8s/registry. Untuk PaaS sederhana Anda bisa tanpa Docker, tapi menguasainya membuka hampir semua jalur deploy modern.
13. Bagaimana deploy tanpa downtime?
Rolling update (K8s/ECS) atau blue-green/canary: luncurkan versi baru bertahap sambil health check, dan rollback otomatis jika gagal. Pastikan aplikasi stateless dan migrasi DB kompatibel-mundur.
14. Apakah saya terkunci ke satu cloud (vendor lock-in)?
Sebagian. Kurangi dengan bersandar pada lapisan portabel (Docker, PostgreSQL, Redis, Kubernetes) dan membatasi ketergantungan pada layanan proprietary unik untuk logika inti. Tapi jangan berlebihan — kadang layanan terkelola sepadan dengan sedikit lock-in.
15. IAM terlalu rumit. Adakah aturan praktis?
Mulai dari nol izin, tambah saat gagal; batasi Resource ke ARN spesifik; pakai role/service account untuk aplikasi; hindari Owner/Admin luas; nyalakan MFA. Least privilege adalah bintang utara.
16. Kapan saya butuh load balancer?
Segera setelah Anda punya lebih dari satu instance yang melayani trafik, atau ingin health check + terminasi TLS + auto-scaling. Untuk satu instance kecil, ia bisa ditunda — tapi menambahkannya sejak awal memudahkan skala nanti.
Glosarium
| Istilah | Arti singkat |
|---|---|
| Region | Area geografis luas berisi beberapa AZ. |
| AZ | Availability Zone: data center terpisah dalam satu region. |
| Edge / PoP | Lokasi CDN dekat pengguna untuk cache. |
| IAM | Identity & Access Management: siapa boleh apa. |
| Principal | Entitas yang bertindak: user, role, service account. |
| Policy | Dokumen aturan izin (JSON di AWS). |
| Role / Service Account | Identitas untuk aplikasi/layanan (kredensial sementara). |
| ARN | Amazon Resource Name: alamat unik sumber daya AWS. |
| S3 / GCS | Object storage AWS / GCP. |
| Bucket | Wadah object bernama unik global. |
| Presigned / Signed URL | Tautan sementara ke satu object tanpa membuka bucket. |
| EC2 / Compute Engine | Mesin virtual sesuai permintaan. |
| AMI / Image | Cetakan disk berisi OS + software. |
| EBS | Disk blok persisten untuk EC2. |
| Security Group | Firewall stateful per-instance. |
| NACL | Firewall stateless per-subnet. |
| VPC | Virtual Private Cloud: jaringan privat Anda. |
| CIDR | Notasi rentang IP (mis. 10.0.0.0/16). |
| Subnet | Potongan VPC di satu AZ; publik atau privat. |
| Route Table | Aturan "trafik ke X lewat gateway Y". |
| IGW | Internet Gateway: pintu dua arah ke internet. |
| NAT Gateway | Pintu keluar-saja untuk subnet privat. |
| Peering / Transit Gateway | Cara menghubungkan banyak VPC. |
| RDS / Cloud SQL | Basis data relasional terkelola. |
| Lambda / Cloud Functions | Serverless compute berbasis event. |
| Cloud Run / Fargate | Container serverless terkelola. |
| CloudFront / Cloud CDN | Content Delivery Network. |
| Route 53 / Cloud DNS | Layanan DNS terkelola. |
| Record A/CNAME | Pemetaan nama → IP / nama lain. |
| TTL | Lama sebuah record DNS di-cache. |
| Container | Instance berjalan dari sebuah image. |
| Registry | Gudang image (ECR / Artifact Registry / Docker Hub). |
| Pod | Unit terkecil K8s (1+ container). |
| Deployment | Menjaga N pod + rolling update. |
| Service (K8s) | IP stabil + load balance ke pod. |
| Ingress | Routing HTTP dari luar ke Service. |
| EKS / GKE | Kubernetes terkelola AWS / GCP. |
| ALB / NLB | Application / Network Load Balancer. |
| Auto-scaling | Menambah/mengurangi instance otomatis. |
| Health check | Probe berkala ke endpoint untuk cek kesehatan. |
| CI/CD | Otomasi test, build, dan deploy. |
| OIDC / WIF | Autentikasi tanpa key jangka panjang di CI. |
| Secrets Manager | Penyimpanan rahasia terkelola. |
| Egress | Transfer data keluar (sering berbayar). |
Checklist Produksi
Cetak dan tempel di dekat meja Anda. Sebelum menyebut sesuatu "siap produksi", lewati daftar ini:
Identitas & keamanan
- MFA aktif di root/owner dan akun admin.
- Tak ada access key root; kredensial harian pakai IAM user/role.
- Least privilege: policy/role dibatasi ke aksi & resource spesifik.
- Aplikasi memakai role/service account, bukan key di kode.
- Rahasia di secrets manager; tak ada di git/image.
- Audit log (CloudTrail / Cloud Audit Logs) menyala.
Jaringan
- DB & app di subnet privat; tak ada admin port ke 0.0.0.0/0.
- Security Group ketat; HTTPS/TLS di semua endpoint publik.
- WAF di depan aplikasi yang menghadap publik (bila relevan).
Keandalan
- Sumber daya kritis tersebar ≥2 AZ.
- Load balancer + health check + auto-scaling terpasang.
- Aplikasi stateless; session/state di Redis/DB/S3.
- Backup DB otomatis + diuji restore-nya.
Deploy & observabilitas
- CI/CD otomatis; image bertag imutabel (SHA/semver), bukan latest.
- Rolling update dengan rollback teruji.
- Log, metrik, dan alert (CPU, error rate, latensi) terpasang.
Biaya
- Budget alert (50/80/100%) aktif.
- Tagging env/team/project konsisten.
- Sumber daya dev/staging dimatikan saat idle.
- Lifecycle policy untuk storage dingin; awasi egress & NAT.
Anda tak perlu memasang semuanya di hari pertama. Mulailah dari yang sederhana dan benar, lalu tambahkan lapisan seiring kebutuhan nyata. Setiap insinyur infrastruktur hebat pernah menjadi pemula yang bingung dengan sup alfabet ini. Bedanya cuma satu: mereka terus membangun. Sekarang giliran Anda.
Ringkasan buku: naik ke cloud dipicu kebutuhan konkret, bukan hype. Kuasai 4 konsep universal (region/AZ, IAM, billing, tagging), lalu peta AWS↔GCP per kategori (storage/compute/DB/jaringan/perekat). Produksi butuh: identitas (least privilege, MFA, secrets manager), jaringan (subnet privat, SG, TLS), keandalan (multi-AZ, LB+health check+auto-scaling, stateless, backup teruji), deploy (CI/CD, image tag imutabel, rolling update+rollback, observabilitas), biaya (budget alert, tagging, matikan idle, awasi egress/NAT). Default sederhana: Cloud Run/Fargate sebelum K8s; bucket privat + CDN; DB terkelola di subnet privat.
