Monitoring Penggunaan Memory EC2: Mengapa CloudWatch Agent Wajib Dipasang
Saat pertama kali membuka CloudWatch console dan mencari metrik RAM untuk EC2 instance, yang muncul hanya CPU, network, dan disk I/O — tidak ada memory usage sama sekali. Ini bukan bug, dan bukan keterbatasan akun. Ini adalah konsekuensi langsung dari bagaimana CloudWatch mengumpulkan data, dan memahami alasannya akan mengubah cara kamu mendekati monitoring OS-level secara keseluruhan.
TL;DR: Monitoring Memory EC2 dengan CloudWatch
| Aspek | Detail |
|---|---|
| Metrik default CloudWatch | CPU utilization, network in/out, disk read/write — semua dari hypervisor |
| Mengapa RAM tidak tersedia default | AWS tidak memiliki visibilitas ke dalam OS guest tanpa agen |
| Solusi | Pasang CloudWatch Agent di dalam instance, konfigurasikan pengumpulan metrik OS |
| Metrik yang didapat | mem_used_percent, mem_available, disk_used_percent, swap_used, dan lainnya |
| Namespace CloudWatch | CWAgent (custom namespace, bukan AWS/EC2) |
| Prasyarat IAM | Instance profile dengan izin CloudWatchAgentServerPolicy |
Bagaimana CloudWatch Mengumpulkan Metrik EC2 — dan Batasannya
CloudWatch default metrics untuk EC2 dikumpulkan oleh infrastruktur AWS itu sendiri — bukan oleh sesuatu yang berjalan di dalam instance kamu. AWS mengamati instance dari luar, dari lapisan hypervisor. Dari posisi itu, AWS bisa melihat berapa banyak CPU yang dikonsumsi VM, berapa byte yang lewat network interface, dan berapa banyak operasi I/O yang dikirim ke EBS volume. Semua ini adalah sinyal yang bisa diobservasi tanpa masuk ke dalam OS.
RAM berbeda. Alokasi dan penggunaan memori adalah urusan internal OS guest. Hypervisor tahu berapa banyak memori yang dialokasikan ke instance, tetapi tidak tahu berapa banyak yang sedang dipakai oleh proses di dalam OS — apakah itu digunakan oleh aplikasi Java yang sedang berjalan, di-cache oleh kernel Linux, atau memang benar-benar idle. Untuk mengetahui itu, seseorang harus bertanya langsung ke OS, dan AWS tidak melakukan itu secara default karena model tanggung jawab bersama: infrastruktur di bawah OS adalah tanggung jawab AWS, OS ke atas adalah tanggung jawab kamu.
Analoginya seperti pemilik gedung yang bisa mengukur konsumsi listrik seluruh unit dari panel utama, tetapi tidak tahu apakah kamu menyalakan AC atau komputer di dalam apartemenmu — untuk itu, kamu butuh alat ukur di dalam unit.
CloudWatch Agent adalah alat ukur itu. Ia berjalan di dalam OS, membaca metrik dari sistem operasi secara langsung, lalu mengirimkannya ke CloudWatch menggunakan API PutMetricData. Metrik ini masuk ke namespace CWAgent, bukan AWS/EC2.
(AWS Infrastructure)"] OS["OS Guest Layer
(di dalam instance)"] CWA["CloudWatch Agent
(berjalan di dalam OS)"] CW_EC2["Namespace: AWS/EC2
CPU, Network, EBS I/O"] CW_AGENT["Namespace: CWAgent
mem_used_percent, disk_used_percent, swap"] ALARM["CloudWatch Alarms
& Dashboards"] HV -->|"dikumpulkan otomatis
tanpa agen"| CW_EC2 OS -->|"RAM, swap, disk usage
tidak terlihat dari hypervisor"| CWA CWA -->|"PutMetricData API
setiap 60 detik"| CW_AGENT CW_EC2 --> ALARM CW_AGENT --> ALARM style HV fill:#2d6a9f,color:#fff style OS fill:#c0392b,color:#fff style CWA fill:#27ae60,color:#fff style CW_EC2 fill:#8e44ad,color:#fff style CW_AGENT fill:#8e44ad,color:#fff style ALARM fill:#e67e22,color:#fff
- Hypervisor Layer: AWS mengumpulkan metrik default (CPU, network, EBS I/O) dari lapisan ini tanpa agen.
- OS Guest Layer: Memory, swap, dan disk usage hanya bisa dibaca dari dalam OS — hypervisor tidak memiliki visibilitas ini.
- CloudWatch Agent: Berjalan di dalam instance, membaca metrik OS, dan mengirimkannya ke CloudWatch via API.
- Namespace Terpisah: Metrik dari agen masuk ke
CWAgent, bukanAWS/EC2— penting saat membuat alarm atau dashboard.
Prasyarat: IAM Instance Profile
Sebelum memasang agen, instance harus memiliki IAM role yang di-attach sebagai instance profile. Role ini membutuhkan izin untuk menulis metrik ke CloudWatch dan, jika kamu ingin menyimpan konfigurasi agen di SSM Parameter Store, izin untuk membaca dari sana.
AWS menyediakan managed policy CloudWatchAgentServerPolicy yang mencakup izin minimum yang dibutuhkan. Jika instance juga perlu membuat konfigurasi agen menggunakan wizard SSM, tambahkan CloudWatchAgentAdminPolicy — tetapi hanya untuk instance yang digunakan untuk setup, bukan untuk instance produksi.
# Buat IAM role untuk EC2 dengan trust policy ke ec2.amazonaws.com
aws iam create-role \
--role-name EC2CloudWatchAgentRole \
--assume-role-policy-document '{
"Version": "2012-10-17",
"Statement": [{
"Effect": "Allow",
"Principal": {"Service": "ec2.amazonaws.com"},
"Action": "sts:AssumeRole"
}]
}'
# Attach managed policy untuk CloudWatch Agent
aws iam attach-role-policy \
--role-name EC2CloudWatchAgentRole \
--policy-arn arn:aws:iam::aws:policy/CloudWatchAgentServerPolicy
# Buat instance profile dan tambahkan role
aws iam create-instance-profile \
--instance-profile-name EC2CloudWatchAgentProfile
aws iam add-role-to-instance-profile \
--instance-profile-name EC2CloudWatchAgentProfile \
--role-name EC2CloudWatchAgentRole
# Attach instance profile ke EC2 instance yang sudah berjalan
aws ec2 associate-iam-instance-profile \
--instance-id i-0123456789abcdef0 \
--iam-instance-profile Name=EC2CloudWatchAgentProfile
Instalasi CloudWatch Agent di EC2
CloudWatch Agent tersedia sebagai package untuk Amazon Linux 2, Amazon Linux 2023, Ubuntu, RHEL, dan Windows. Cara termudah di Amazon Linux adalah melalui package manager langsung.
# Amazon Linux 2 / Amazon Linux 2023
sudo yum install -y amazon-cloudwatch-agent
# Ubuntu / Debian
wget https://s3.amazonaws.com/amazoncloudwatch-agent/ubuntu/amd64/latest/amazon-cloudwatch-agent.deb
sudo dpkg -i amazon-cloudwatch-agent.deb
Setelah instalasi, agen belum berjalan — ia butuh file konfigurasi yang mendefinisikan metrik apa yang harus dikumpulkan.
Konfigurasi Agen: Mendefinisikan Metrik Memory dan Disk
File konfigurasi CloudWatch Agent adalah JSON. Kamu bisa membuatnya manual atau menggunakan wizard interaktif bawaan agen. Untuk monitoring memory dan disk yang umum dibutuhkan di production, berikut konfigurasi minimal yang bisa langsung digunakan:
🔽 Klik untuk melihat konfigurasi CloudWatch Agent (amazon-cloudwatch-agent.json)
{
"agent": {
"metrics_collection_interval": 60,
"run_as_user": "cwagent"
},
"metrics": {
"namespace": "CWAgent",
"metrics_collected": {
"mem": {
"measurement": [
"mem_used_percent",
"mem_available",
"mem_used",
"mem_total"
],
"metrics_collection_interval": 60
},
"swap": {
"measurement": [
"swap_used_percent",
"swap_used",
"swap_free"
],
"metrics_collection_interval": 60
},
"disk": {
"measurement": [
"disk_used_percent",
"disk_used",
"disk_free"
],
"metrics_collection_interval": 60,
"resources": [
"/",
"/data"
]
}
},
"append_dimensions": {
"InstanceId": "${aws:InstanceId}",
"InstanceType": "${aws:InstanceType}",
"AutoScalingGroupName": "${aws:AutoScalingGroupName}"
}
}
}
Simpan file ini di instance, misalnya di /opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.json, lalu jalankan agen menggunakan file tersebut:
# Jalankan agen dengan file konfigurasi yang sudah dibuat
sudo /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-ctl \
-a fetch-config \
-m ec2 \
-s \
-c file:/opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.json
# Verifikasi status agen
sudo /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-ctl \
-a status
Output status yang sehat akan menampilkan "status": "running". Jika agen berhenti atau gagal start, cek log di /opt/aws/amazon-cloudwatch-agent/logs/amazon-cloudwatch-agent.log.
Verifikasi: Memastikan Metrik Memory Masuk ke CloudWatch
Setelah agen berjalan, tunggu satu interval pengumpulan (default 60 detik), lalu verifikasi bahwa metrik sudah muncul di CloudWatch. Metrik tidak akan muncul di namespace AWS/EC2 — cari di CWAgent.
# Cek apakah metrik mem_used_percent sudah muncul
aws cloudwatch list-metrics \
--namespace CWAgent \
--metric-name mem_used_percent \
--region us-east-1
# Ambil data metrik untuk instance tertentu
aws cloudwatch get-metric-statistics \
--namespace CWAgent \
--metric-name mem_used_percent \
--dimensions Name=InstanceId,Value=i-0123456789abcdef0 \
--start-time 2024-01-15T10:00:00Z \
--end-time 2024-01-15T11:00:00Z \
--period 300 \
--statistics Average \
--region us-east-1
Jika list-metrics mengembalikan hasil kosong setelah beberapa menit, ada tiga kemungkinan: agen tidak berjalan, instance profile tidak memiliki izin yang benar, atau ada masalah konektivitas ke endpoint CloudWatch (periksa VPC endpoint atau security group untuk outbound HTTPS).
Membuat Alarm untuk Memory Usage Tinggi
Dengan metrik sudah masuk ke CloudWatch, kamu bisa membuat alarm. Perhatikan bahwa dimensi yang digunakan harus persis sama dengan yang dikirim agen — termasuk InstanceId yang di-append oleh konfigurasi append_dimensions.
aws cloudwatch put-metric-alarm \
--alarm-name "EC2-HighMemoryUsage-i-0123456789abcdef0" \
--alarm-description "Memory usage melebihi 85 persen" \
--namespace CWAgent \
--metric-name mem_used_percent \
--dimensions Name=InstanceId,Value=i-0123456789abcdef0 \
--statistic Average \
--period 300 \
--evaluation-periods 2 \
--threshold 85 \
--comparison-operator GreaterThanOrEqualToThreshold \
--alarm-actions arn:aws:sns:us-east-1:123456789012:ops-alerts \
--region us-east-1
Kasus Nyata: Alarm CPU Normal, Aplikasi Lambat — Ternyata OOM
Ini pola yang cukup sering terjadi: CPU di bawah 20%, tidak ada error di application log, tetapi response time naik drastis dan sesekali ada request timeout. Tim pertama kali curiga ke database connection pool, lalu ke konfigurasi thread pool aplikasi.
Setelah CloudWatch Agent dipasang dan metrik memory mulai masuk, gambarnya langsung jelas — mem_used_percent konsisten di 94-97%, dan swap_used naik terus. OS sedang aktif melakukan swapping, yang menjelaskan latency tinggi tanpa CPU spike. Aplikasi Java dengan heap size yang tidak di-cap dengan benar perlahan mengkonsumsi semua RAM yang tersedia.
Tanpa metrik memory, diagnosis ini butuh waktu berhari-hari. Dengan agen terpasang, pola ini terlihat dalam hitungan menit setelah melihat dashboard.
Swap usage yang terus naik tanpa pernah turun adalah sinyal lebih kuat dari memory usage tinggi — itu artinya OS sudah kehabisan RAM dan mulai meminjam disk.
Menyimpan Konfigurasi Agen di SSM Parameter Store
Untuk deployment di banyak instance atau Auto Scaling Group, menyimpan konfigurasi agen di SSM Parameter Store jauh lebih praktis daripada mendistribusikan file JSON ke setiap instance. Agen bisa langsung mengambil konfigurasi dari SSM saat startup.
# Simpan konfigurasi ke SSM Parameter Store
aws ssm put-parameter \
--name "/cloudwatch-agent/config/production" \
--type String \
--value file:///opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.json \
--region us-east-1
# Jalankan agen dengan konfigurasi dari SSM
sudo /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-ctl \
-a fetch-config \
-m ec2 \
-s \
-c ssm:/cloudwatch-agent/config/production
Dengan pendekatan ini, perubahan konfigurasi monitoring bisa dilakukan terpusat tanpa harus SSH ke setiap instance. Instance baru yang launch dari Auto Scaling Group bisa langsung mengambil konfigurasi yang sama via user data.
/cloudwatch-agent/config"] UD["EC2 User Data
script saat launch"] INST1["Instance A
CloudWatch Agent"] INST2["Instance B
CloudWatch Agent"] INST3["Instance C (ASG)
CloudWatch Agent"] CW["CloudWatch
Namespace: CWAgent"] SSM -->|"fetch-config"| INST1 SSM -->|"fetch-config"| INST2 UD -->|"launch baru"| INST3 SSM -->|"fetch-config"| INST3 INST1 -->|"metrik memory & disk"| CW INST2 -->|"metrik memory & disk"| CW INST3 -->|"metrik memory & disk"| CW style SSM fill:#2d6a9f,color:#fff style UD fill:#7f8c8d,color:#fff style INST1 fill:#27ae60,color:#fff style INST2 fill:#27ae60,color:#fff style INST3 fill:#27ae60,color:#fff style CW fill:#e67e22,color:#fff
- SSM Parameter Store: Menyimpan konfigurasi agen secara terpusat — satu perubahan berlaku untuk semua instance.
- EC2 User Data: Saat instance baru launch, user data script menjalankan agen dan mengarahkannya ke SSM untuk mengambil konfigurasi.
- CloudWatch Agent: Berjalan di setiap instance, mengumpulkan metrik OS, dan mengirimkannya ke CloudWatch.
- CloudWatch Namespace CWAgent: Semua metrik dari semua instance masuk ke namespace yang sama, bisa di-filter berdasarkan dimensi
InstanceIdatauAutoScalingGroupName.
Wrap-Up: Monitoring Memory EC2 yang Benar
CloudWatch default metrics tidak akan pernah menampilkan RAM usage karena AWS secara arsitektural tidak memiliki visibilitas ke dalam OS guest — ini bukan keterbatasan yang akan diperbaiki, melainkan konsekuensi dari model shared responsibility. CloudWatch Agent adalah satu-satunya cara resmi untuk mendapatkan metrik OS-level seperti memory, swap, dan disk usage ke CloudWatch.
Langkah berikutnya yang direkomendasikan:
- Baca dokumentasi resmi: Installing the CloudWatch Agent
- Eksplorasi konfigurasi lanjutan seperti pengumpulan log aplikasi bersamaan dengan metrik menggunakan satu agen yang sama
- Pertimbangkan menggunakan AWS Systems Manager Distributor untuk deployment agen secara otomatis di fleet instance yang besar
- Buat CloudWatch Dashboard yang menggabungkan metrik default EC2 (
AWS/EC2) dengan metrik agen (CWAgent) dalam satu tampilan
Glosarium
| Istilah | Penjelasan |
|---|---|
| CloudWatch Agent | Software yang diinstal di dalam EC2 instance untuk mengumpulkan metrik OS-level dan log, lalu mengirimkannya ke CloudWatch. |
| Namespace CWAgent | Namespace CloudWatch khusus tempat metrik yang dikirim oleh CloudWatch Agent disimpan, terpisah dari namespace AWS/EC2. |
| Instance Profile | Kontainer IAM role yang di-attach ke EC2 instance, memungkinkan instance memanggil AWS API menggunakan kredensial sementara. |
| Hypervisor Metrics | Metrik yang dikumpulkan dari lapisan hypervisor tanpa agen — mencakup CPU, network, dan EBS I/O, tetapi tidak mencakup metrik internal OS. |
| mem_used_percent | Metrik CloudWatch Agent yang merepresentasikan persentase memori fisik yang sedang digunakan oleh OS, tersedia setelah agen dikonfigurasi. |
Komentar
Posting Komentar