Cara Membuat Billing Alarm CloudWatch untuk AWS Free Tier (Alert Email di $5)

Satu kesalahan yang sering terjadi pada akun AWS baru: lupa mematikan resource eksperimen, lalu tagihan bulan pertama datang jauh di atas ekspektasi. AWS Free Tier memang memberikan batas gratis, tapi tidak ada mekanisme otomatis yang menghentikan penggunaan saat batas terlampaui — hanya kamu yang bisa melakukannya, dan billing alarm adalah garis pertahanan pertama yang harus dipasang sebelum melakukan hal lain.

TL;DR: Ringkasan Pengaturan Billing Alarm Free Tier

LangkahAksiCatatan Penting
1Aktifkan Billing Alerts di akun rootWajib dilakukan sekali, tidak bisa di-skip
2Buat SNS Topic dan konfirmasi emailEmail konfirmasi harus diklik sebelum alarm bisa mengirim notifikasi
3Buat CloudWatch Alarm pada metrik EstimatedChargesRegion harus us-east-1 — metrik billing hanya tersedia di sana
4Verifikasi alarm aktifStatus awal 'INSUFFICIENT_DATA' adalah normal

Bagaimana Billing Alarm AWS Bekerja

Sebelum masuk ke langkah konfigurasi, penting untuk memahami arsitektur di baliknya agar tidak bingung saat debugging nanti.

AWS mengumpulkan data estimasi biaya dari seluruh region dan mempublikasikannya sebagai metrik CloudWatch bernama EstimatedCharges di namespace AWS/Billing. Metrik ini hanya tersedia di region us-east-1 (N. Virginia) — bukan karena resource kamu ada di sana, tapi karena AWS memusatkan semua data billing di region tersebut. Jika kamu membuat alarm di region lain, metrik ini tidak akan muncul sama sekali.

Data metrik diperbarui beberapa kali per hari (bukan real-time), sehingga ada jeda antara penggunaan aktual dan nilai yang terbaca di alarm. Ini berarti alarm di $5 bukan jaminan tagihan tidak akan melewati $5 — ini adalah sinyal peringatan dini, bukan circuit breaker.

graph LR A["Penggunaan Resource di Semua Region"] --> B["AWS Billing System (Terpusat)"] B --> C["Metrik EstimatedCharges Namespace: AWS/Billing Region: us-east-1"] C --> D["CloudWatch Alarm Threshold: $5"] D -->|"Nilai >= $5"| E["SNS Topic billing-alert-topic"] E --> F["Email Notifikasi ke Subscriber"] F --> G["Tindakan Manual (Matikan Resource)"] D -->|"Nilai < $5"| H["Status: OK Tidak ada aksi"]
  1. Billing Data Aggregation: AWS mengumpulkan data penggunaan dari semua region dan layanan ke sistem billing terpusat.
  2. Metrik EstimatedCharges: Data dikonversi menjadi metrik CloudWatch di namespace AWS/Billing, hanya tersedia di us-east-1.
  3. CloudWatch Alarm Evaluation: CloudWatch mengevaluasi metrik secara periodik terhadap threshold yang kamu tentukan.
  4. SNS Notification: Saat threshold terlampaui, alarm memicu SNS Topic yang mengirim email ke subscriber.
  5. Tindakan Manual: Kamu menerima email dan mengambil tindakan — mematikan resource, menghapus layanan, atau meninjau penggunaan.

Prasyarat: Aktifkan Billing Alerts (Wajib, Satu Kali)

Ini langkah yang paling sering dilewati dan menyebabkan frustrasi: metrik EstimatedCharges tidak akan muncul di CloudWatch sampai fitur ini diaktifkan secara eksplisit. Pengaturan ini hanya bisa dilakukan dari akun root atau akun dengan izin billing penuh.

Masuk ke AWS Management Console menggunakan akun root, lalu navigasi ke Billing and Cost Management → Billing Preferences. Centang opsi 'Receive Billing Alerts', lalu simpan preferensi. Setelah diaktifkan, tunggu beberapa menit sebelum metrik mulai muncul di CloudWatch.

Mengaktifkan billing alerts seperti memasang meteran listrik di rumah — tanpa itu, kamu hanya bisa melihat tagihan di akhir bulan, bukan konsumsi harian yang sedang berjalan.

Verifikasi via CLI bahwa billing alerts sudah aktif:

aws ce get-preferences \
  --region us-east-1

Jika respons menunjukkan viewBillingAlertsEnabled: true, prasyarat sudah terpenuhi. Jika tidak, kamu harus mengaktifkannya melalui console dengan akun yang memiliki izin aws-portal:ModifyBilling.

Langkah 1: Buat SNS Topic untuk Notifikasi Email

SNS (Simple Notification Service) adalah perantara antara CloudWatch Alarm dan email kamu. Alarm tidak mengirim email langsung — alarm memicu SNS, dan SNS yang mengirim email ke subscriber. Pastikan semua perintah berikut dijalankan di region us-east-1.

aws sns create-topic \
  --name billing-alert-topic \
  --region us-east-1

Perintah ini mengembalikan ARN topic, misalnya arn:aws:sns:us-east-1:123456789012:billing-alert-topic. Simpan ARN ini karena akan digunakan di langkah berikutnya.

Selanjutnya, daftarkan email kamu sebagai subscriber:

aws sns subscribe \
  --topic-arn arn:aws:sns:us-east-1:123456789012:billing-alert-topic \
  --protocol email \
  --notification-endpoint emailkamu@contoh.com \
  --region us-east-1

Setelah perintah ini dijalankan, cek inbox email kamu. AWS akan mengirim email konfirmasi dengan subject 'AWS Notification - Subscription Confirmation'. Klik link konfirmasi di email tersebut — sampai dikonfirmasi, status subscription adalah PendingConfirmation dan alarm tidak akan bisa mengirim email.

Verifikasi status subscription:

aws sns list-subscriptions-by-topic \
  --topic-arn arn:aws:sns:us-east-1:123456789012:billing-alert-topic \
  --region us-east-1

Pastikan field SubscriptionArn sudah berisi ARN lengkap (bukan string PendingConfirmation) sebelum melanjutkan ke langkah berikutnya.

Langkah 2: Buat CloudWatch Billing Alarm di $5

Ini inti dari keseluruhan setup. Metrik yang digunakan adalah EstimatedCharges di namespace AWS/Billing. Threshold $5 dipilih sebagai sinyal peringatan dini — cukup rendah untuk mendeteksi penggunaan tidak terduga sebelum tagihan membengkak.

Karena data billing diperbarui beberapa kali per hari (bukan setiap menit), period yang wajar untuk alarm ini adalah 21600 detik (6 jam) atau 86400 detik (24 jam). Menggunakan period terlalu pendek seperti 60 detik tidak akan memberikan data yang lebih sering — hanya akan menyebabkan alarm sering berada di status INSUFFICIENT_DATA.

aws cloudwatch put-metric-alarm \
  --alarm-name "FreeTierBillingAlert-5USD" \
  --alarm-description "Alert ketika estimasi biaya AWS melebihi 5 USD" \
  --metric-name EstimatedCharges \
  --namespace AWS/Billing \
  --statistic Maximum \
  --dimensions Name=Currency,Value=USD \
  --period 86400 \
  --evaluation-periods 1 \
  --threshold 5 \
  --comparison-operator GreaterThanOrEqualToThreshold \
  --alarm-actions arn:aws:sns:us-east-1:123456789012:billing-alert-topic \
  --treat-missing-data notBreaching \
  --region us-east-1

Beberapa parameter kritis yang perlu dipahami:

  • --statistic Maximum: Gunakan Maximum, bukan Average. EstimatedCharges adalah nilai kumulatif yang terus naik sepanjang bulan — menggunakan Average akan menghasilkan nilai yang lebih rendah dari tagihan aktual.
  • --dimensions Name=Currency,Value=USD: Dimensi ini wajib ada untuk memfilter metrik berdasarkan mata uang. Tanpa dimensi ini, alarm mungkin tidak menemukan metrik yang tepat.
  • --treat-missing-data notBreaching: Karena data billing tidak selalu tersedia setiap periode evaluasi, setting ini mencegah alarm masuk ke status ALARM hanya karena tidak ada data baru.

Langkah 3: Verifikasi Alarm Aktif dan Berfungsi

Status alarm baru biasanya adalah INSUFFICIENT_DATA — ini normal dan bukan error. Alarm akan berpindah ke status OK setelah CloudWatch mendapatkan cukup data untuk dievaluasi.

aws cloudwatch describe-alarms \
  --alarm-names "FreeTierBillingAlert-5USD" \
  --region us-east-1

Perhatikan field StateValue di output. Jika setelah 24 jam alarm masih di INSUFFICIENT_DATA, kemungkinan besar billing alerts belum diaktifkan di langkah prasyarat, atau metrik belum memiliki data historis yang cukup.

Untuk memastikan alarm bisa mengirim notifikasi tanpa menunggu tagihan benar-benar melebihi $5, kamu bisa memicu alarm secara manual untuk testing:

aws cloudwatch set-alarm-state \
  --alarm-name "FreeTierBillingAlert-5USD" \
  --state-value ALARM \
  --state-reason "Test notifikasi manual" \
  --region us-east-1

Jika email masuk setelah perintah ini, seluruh pipeline (CloudWatch → SNS → Email) berfungsi dengan benar. Setelah testing, alarm akan kembali ke state normal pada evaluasi berikutnya.

stateDiagram-v2 [*] --> INSUFFICIENT_DATA : Alarm baru dibuat INSUFFICIENT_DATA --> OK : Data tersedia, nilai < $5 INSUFFICIENT_DATA --> ALARM : Data tersedia, nilai >= $5 OK --> ALARM : EstimatedCharges >= $5 ALARM --> OK : Awal bulan baru
(EstimatedCharges reset) ALARM --> INSUFFICIENT_DATA : Data tidak tersedia OK --> INSUFFICIENT_DATA : Data tidak tersedia
  1. INSUFFICIENT_DATA: State awal saat alarm baru dibuat atau tidak ada data metrik yang tersedia untuk dievaluasi.
  2. OK: Data tersedia dan nilai EstimatedCharges di bawah threshold $5.
  3. ALARM: Nilai EstimatedCharges mencapai atau melebihi $5 — SNS dipicu dan email dikirim.
  4. Kembali ke OK: Ini tidak terjadi otomatis pada billing alarm karena EstimatedCharges bersifat kumulatif dan hanya reset di awal bulan baru.

IAM Policy Minimum untuk Setup via CLI

Jika kamu menjalankan perintah-perintah di atas menggunakan IAM user atau role (bukan akun root), berikut adalah izin minimum yang diperlukan. Menggunakan akun root untuk operasi rutin adalah praktik yang tidak disarankan.

🔽 Klik untuk melihat IAM Policy minimum
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "CloudWatchBillingAlarm",
      "Effect": "Allow",
      "Action": [
        "cloudwatch:PutMetricAlarm",
        "cloudwatch:DescribeAlarms",
        "cloudwatch:SetAlarmState",
        "cloudwatch:DeleteAlarms"
      ],
      "Resource": "arn:aws:cloudwatch:us-east-1:123456789012:alarm:FreeTierBillingAlert-5USD"
    },
    {
      "Sid": "SNSTopicManagement",
      "Effect": "Allow",
      "Action": [
        "sns:CreateTopic",
        "sns:Subscribe",
        "sns:ListSubscriptionsByTopic"
      ],
      "Resource": "arn:aws:sns:us-east-1:123456789012:billing-alert-topic"
    }
  ]
}

Catatan: Izin untuk mengaktifkan billing alerts (aws-portal:ModifyBilling) adalah izin billing khusus yang hanya bisa diberikan oleh akun root atau administrator dengan akses penuh ke Billing and Cost Management. Verifikasi ketersediaan izin ini di dokumentasi AWS Service Authorization Reference untuk layanan AWS Billing.

Pola Kesalahan Umum: Alarm Dibuat tapi Email Tidak Pernah Datang

Ini skenario yang cukup sering terjadi dan biasanya membuat orang mengira alarm tidak berfungsi padahal masalahnya ada di lapisan yang berbeda.

Gejala: Alarm menunjukkan status ALARM di console, tapi tidak ada email masuk.

Diagnosis awal yang salah: Kebanyakan orang langsung memeriksa konfigurasi alarm — threshold, metrik, period. Semuanya terlihat benar.

Penyebab sebenarnya: Subscription SNS masih dalam status PendingConfirmation karena email konfirmasi tidak pernah diklik. CloudWatch berhasil memicu SNS, SNS menerima notifikasi, tapi SNS tidak mengirim email ke endpoint yang belum dikonfirmasi.

Cara memverifikasi:

aws sns list-subscriptions-by-topic \
  --topic-arn arn:aws:sns:us-east-1:123456789012:billing-alert-topic \
  --region us-east-1

Jika SubscriptionArn menampilkan PendingConfirmation, cek folder spam email kamu untuk email konfirmasi dari AWS, atau kirim ulang konfirmasi melalui console SNS. Alarm yang sudah terkonfigurasi dengan benar tidak akan membantu sama sekali jika subscriber belum dikonfirmasi.

Pengaturan Billing Alarm CloudWatch: Langkah Selanjutnya

Billing alarm di $5 adalah fondasi, bukan solusi lengkap. Beberapa hal yang bisa dilakukan setelah ini:

  • Tambah alarm berlapis: Buat alarm tambahan di $1 (deteksi sangat dini) dan $10 (batas keras). Tiga lapisan alarm memberikan visibilitas yang lebih baik terhadap tren penggunaan.
  • Aktifkan AWS Free Tier Usage Alerts: Di Billing and Cost Management → Billing Preferences, aktifkan juga 'Receive Free Tier Usage Alerts' — ini mengirim notifikasi saat penggunaan layanan mendekati batas Free Tier, terlepas dari biaya.
  • Gunakan AWS Budgets: Untuk kontrol yang lebih granular per layanan atau per tag, AWS Budgets menawarkan kemampuan yang lebih lengkap dibanding CloudWatch Billing Alarm. Billing alarm adalah solusi cepat; Budgets adalah solusi jangka panjang.
  • Tinjau Cost Explorer secara berkala: Alarm memberitahu kamu bahwa ada masalah — Cost Explorer membantu mengidentifikasi layanan mana yang menyebabkan biaya tidak terduga.

Dokumentasi resmi yang relevan: Monitoring Estimated AWS Charges with CloudWatch dan AWS Billing and Cost Management Documentation.

Glosarium Istilah Kunci

IstilahPenjelasan
EstimatedChargesMetrik CloudWatch di namespace AWS/Billing yang merepresentasikan estimasi biaya kumulatif akun AWS untuk bulan berjalan, dalam satuan mata uang yang ditentukan.
SNS TopicSaluran komunikasi di Amazon Simple Notification Service. CloudWatch Alarm mengirim notifikasi ke Topic, dan Topic mendistribusikannya ke semua subscriber yang terdaftar dan terkonfirmasi.
Alarm StateStatus evaluasi CloudWatch Alarm: OK (di bawah threshold), ALARM (melebihi threshold), atau INSUFFICIENT_DATA (tidak cukup data untuk evaluasi).
AWS Free TierProgram AWS yang memberikan batas penggunaan gratis untuk layanan tertentu selama periode tertentu (biasanya 12 bulan untuk akun baru, atau tanpa batas waktu untuk layanan tertentu).
treat-missing-dataParameter CloudWatch Alarm yang menentukan bagaimana alarm memperlakukan periode evaluasi tanpa data — penting untuk metrik billing yang tidak diperbarui setiap menit.

Komentar

Postingan populer dari blog ini

EC2 Tidak Bisa Akses Internet di Custom VPC: Cara Pasang Internet Gateway dan Update Route Table