CloudWatch is the monitoring backbone of AWS — metrics, logs, alarms, dashboards, and traces. Most teams don't think of it as a cost center, but CloudWatch can easily reach $500-2,000/month for a moderately sized production environment. The culprits: custom metrics at $0.30 each, log ingestion at $0.50/GB, and Container Insights that charges per node-hour.
The irony: the tool you use to control costs can itself become a significant cost if not optimized.
TL;DR: CloudWatch's biggest cost drivers: custom metrics ($0.30/metric/month), log ingestion ($0.50/GB), log storage ($0.03/GB/month), and detailed monitoring ($3.00/instance/month for 1-minute metrics). Quick wins: set log retention policies (most groups default to "never expire"), reduce custom metric dimensions, disable Container Insights on dev clusters, and use metric filters instead of Contributor Insights. These changes typically save 40-60%.
CloudWatch Pricing Breakdown
Metrics
| Component | Free Tier | Price |
|---|---|---|
| Basic metrics (5-min resolution) | All standard metrics | Free |
| Detailed monitoring (1-min resolution) | 10 metrics | $3.00/instance/month |
| Custom metrics | 10 metrics | $0.30/metric/month |
| API requests (GetMetricData) | 1M requests | $0.01/1,000 metrics requested |
| Metric Streams | — | $0.003/metric update |
The custom metrics trap: Each unique combination of metric name + dimensions = one metric. A metric with 3 dimension values across 50 instances = 150 custom metrics = $45/month for a single metric name.
Logs
| Component | Free Tier | Price |
|---|---|---|
| Log ingestion (collect) | 5 GB/month | $0.50/GB |
| Log storage (archive) | 5 GB/month | $0.03/GB/month |
| Logs Insights queries | — | $0.005/GB scanned |
| Vended logs (VPC Flow, etc.) | — | $0.50/GB (first 10TB) |
| Live Tail | — | $0.01/minute session + $0.01/GB |
Log costs compound: 100GB/month of log ingestion = $50/month in collection. If retention is "Never Expire," that 100GB stays in storage at $0.03/GB/month — forever growing. After a year: 1.2TB stored = $36/month in storage alone, plus the ongoing $50/month collection.
Alarms
| Type | Free Tier | Price |
|---|---|---|
| Standard alarms (5-min) | 10 alarms | $0.10/alarm/month |
| High-resolution alarms (10-sec) | — | $0.30/alarm/month |
| Composite alarms | — | $0.50/alarm/month |
| Anomaly detection alarms | — | $0.30/alarm/month |
Dashboards and Other
| Component | Price |
|---|---|
| Dashboards | $3.00/dashboard/month |
| Contributor Insights | $0.02/rule-match per log event |
| Container Insights | $0.30/hour per container instance/node |
| Lambda Insights | $0.30/hour per Lambda function |
| Synthetics (Canaries) | $0.0012/run |
Where CloudWatch Costs Add Up
Common Cost Surprise: Container Insights
Container Insights provides detailed ECS/EKS monitoring but charges $0.30/hour per container instance (EC2 node). See the CloudWatch monitoring documentation for configuration details:
| Cluster Size | Monthly Container Insights Cost |
|---|---|
| 5 nodes | $1,095 |
| 10 nodes | $2,190 |
| 20 nodes | $4,380 |
For a 10-node EKS cluster, Container Insights alone costs $2,190/month — potentially more than the nodes themselves. Enable it selectively for production clusters only.
Common Cost Surprise: Log Ingestion
Application logs grow silently. A typical production API generates 1-5GB of logs per day:
| Daily Log Volume | Monthly Ingestion Cost | Annual Storage Cost (no retention) |
|---|---|---|
| 1 GB/day | $15/month | $11/month (growing) |
| 5 GB/day | $75/month | $55/month (growing) |
| 20 GB/day | $300/month | $219/month (growing) |
Common Cost Surprise: Custom Metrics Explosion
Each SDK or agent that publishes custom metrics can create hundreds of unique metrics through dimension combinations:
| Source | Typical Custom Metrics | Monthly Cost |
|---|---|---|
| Application (10 metrics x 5 services) | 50 | $15 |
| StatsD/Prometheus agent | 200-500 | $60-$150 |
| Container Insights custom metrics | 100-300 | $30-$90 |
| Lambda custom metrics (per function) | 10-20 per function | Scales with function count |
Optimization Strategies
1. Set Log Retention Policies (Biggest Impact)
The default log retention is "Never Expire." Change it:
| Log Type | Recommended Retention |
|---|---|
| Application debug logs | 7-14 days |
| Application info/warn logs | 30 days |
| Error logs | 90 days |
| Compliance/audit logs | 365 days or archive to S3 |
| VPC Flow Logs | 30 days (or export to S3 for long-term) |
Impact: Setting 30-day retention on log groups with "Never Expire" stops storage costs from growing indefinitely. For existing accumulated storage, old logs are deleted automatically after the retention period.
2. Reduce Log Volume
Before logs reach CloudWatch:
- Filter at the source — Only log ERROR/WARN in production, not DEBUG/INFO
- Sample verbose logs — Log 10% of successful requests, 100% of errors
- Use structured logging — JSON logs are more compact than formatted text
- Exclude health checks — Load balancer health checks generate massive log volume with no diagnostic value
3. Optimize Custom Metrics
- Reduce dimensions — Every dimension combination creates a new metric. Use fewer dimensions.
- Use Embedded Metric Format (EMF) — Log metrics as part of log entries, extracted by CloudWatch at no extra per-metric charge
- Aggregate before publishing — Publish aggregated statistics instead of per-request data points
- Review unused metrics — CloudWatch continues to charge for metrics that nothing reads
4. Disable Container Insights on Non-Production
Container Insights at $0.30/hour/node adds up fast. Enable it only on production clusters. For dev/staging, use basic CloudWatch metrics (free) or Prometheus with Grafana (self-hosted, one-time setup cost).
5. Export Logs to S3 for Long-Term Storage
For logs needed beyond 90 days (compliance, audit), export to S3 instead of keeping them in CloudWatch:
| Storage | Monthly Cost per TB |
|---|---|
| CloudWatch Logs | $30.72 |
| S3 Standard | $23.55 |
| S3 Infrequent Access | $12.80 |
| S3 Glacier | $4.00 |
Export via CloudWatch Logs Subscription Filters to Kinesis Firehose to S3 for automated, real-time archival.
Related Guides
- CloudWatch Cost Optimization: Cut Monitoring Costs
- AWS EC2 Pricing: Every Model and Discount
- AWS Lambda Pricing Guide
- AWS ECS Pricing: Fargate vs EC2 Launch Types
Frequently Asked Questions
How much does CloudWatch cost per month?
A small production environment (5 instances, basic logs) costs $30-80/month. A medium environment (20 instances, moderate logging, custom metrics) costs $200-600/month. Large environments with Container Insights, heavy logging, and many custom metrics can exceed $2,000-5,000/month.
Why is my CloudWatch bill so high?
The three most common causes: (1) Log groups set to "Never Expire" accumulating storage indefinitely. (2) Container Insights enabled across all clusters ($0.30/hour/node). (3) Custom metrics exploding through dimension combinations. Check Cost Explorer filtered to CloudWatch and review each sub-component.
Is CloudWatch cheaper than Datadog?
For basic monitoring (metrics + alarms), CloudWatch is significantly cheaper. For comprehensive observability (APM, distributed tracing, log analytics, custom dashboards), the comparison is closer. Datadog typically costs $15-30/host/month. CloudWatch with Container Insights costs ~$219/node/month — potentially more expensive at scale. Many organizations use CloudWatch for infrastructure and a third-party tool for application-level observability.
How do I reduce CloudWatch log costs?
Four steps: (1) Set retention policies on all log groups (30 days for most, 90 for important). (2) Reduce log volume by filtering at the source (no DEBUG in production). (3) Export long-term logs to S3 ($4-24/TB/month vs $30/TB in CloudWatch). (4) Exclude health check and verbose access logs.
Control Your Monitoring Costs
CloudWatch is essential but shouldn't be one of your top cost centers. Optimize with:
- Set log retention — Stop the endless accumulation of stored logs
- Reduce log volume — Filter at source, sample verbose logs
- Audit custom metrics — Fewer dimensions, use EMF format
- Selective Container Insights — Production only, not dev/staging
- Export to S3 — Long-term logs at 7-10x lower cost
Lower Your CloudWatch Costs with Wring
Wring helps you access AWS credits and volume discounts to lower your CloudWatch costs. Through group buying power, Wring negotiates better rates so you pay less per metric and log GB ingested.
