Start with the bill, not a guess
Open AWS Cost Explorer or the Cost and Usage Report and group CloudWatch spend by usage type. Separate log ingestion, archived log storage, Logs Insights scans, custom metrics, alarms, dashboards, and optional observability features. A large total does not tell you which control to change. A log-ingestion problem needs a different response from a custom-metric cardinality problem.Control logs before they enter CloudWatch
Ingestion is often the largest log cost. Retention settings only reduce storage after ingestion, so they cannot fix noisy output by themselves. Review high-volume log groups and remove data that does not help you debug, audit, or measure the system.- Stop logging successful health checks on every request.
- Avoid writing the same exception at every layer.
- Reduce verbose framework and SDK logs in production.
- Sample high-volume success events while retaining errors.
- Use structured fields instead of several redundant text lines.
- Remove secrets and personal data before logs leave the process.
Set retention explicitly
A log group can retain data indefinitely unless you configure a retention period. Match retention to the signal:
If older logs must remain available, export or deliver them to a storage tier designed for long-term retention. Include retrieval time and analysis tooling in the decision, not just storage price.
CloudWatch Logs offers different log classes. Infrequent Access can fit logs that are retained but queried rarely, with a reduced feature set. Confirm feature compatibility before moving a group.
Limit query scans
CloudWatch Logs Insights charges based on data scanned. Narrow the time range and select only relevant log groups. Filter early using indexed or structured fields where available. Saved queries are useful, but a dashboard that repeatedly scans a broad time range can create continuous analysis cost. Use metrics for frequently viewed aggregates and logs for detailed investigation.Watch metric cardinality
A custom metric is identified by its namespace, name, and complete dimension set. Adding a high-cardinality value such asrequest_id, user_id, or raw URL can create thousands of distinct metric series.
Prefer bounded dimensions such as service, environment, operation, region, and status class. Keep per-request identifiers in logs or traces.
High-resolution custom metrics, detailed monitoring, and frequent API calls can also increase cost. Use the finest resolution only when the response process can act on it.
Review optional telemetry
Container Insights, Application Signals, detailed service metrics, synthetics, and tracing can provide valuable context. They also increase the number of collected observations. Enable them for a reason. Measure whether the team uses the additional data during incidents or capacity decisions. Remove duplicate collectors that publish the same signal under different names.Build a recurring control loop
1
Attribute the spend
Break CloudWatch cost down by usage type, account, region, and workload.
2
Find the largest producer
Rank log groups by incoming bytes and custom metrics by series count.
3
Change one source
Reduce noisy logs, bound dimensions, or shorten retention for a clearly classified signal.
4
Verify the result
Compare usage after the change and confirm that incident response still has the data it needs.
Frequently asked questions
Why is my CloudWatch bill so high?
Why is my CloudWatch bill so high?
High CloudWatch bills commonly come from log ingestion volume, indefinite retention, Logs Insights data scans, high-cardinality custom metrics, detailed monitoring, Container Insights, alarms, and dashboards. Group billing data by usage type before changing configuration so you address the actual cost driver.
Does shorter log retention reduce ingestion cost?
Does shorter log retention reduce ingestion cost?
Shorter retention reduces archived storage after logs arrive, but it does not reduce ingestion charges. Reduce ingestion at the source by removing duplicate messages, filtering health checks, sampling high-volume successes, lowering verbose production log levels, and keeping structured events concise.
How does metric cardinality affect CloudWatch cost?
How does metric cardinality affect CloudWatch cost?
Every unique custom metric name and complete dimension set creates a separate time series. Unbounded values such as user IDs, request IDs, and raw URLs can create thousands of billable series. Keep dimensions bounded and store per-request detail in logs or traces.