What CloudWatch Logs Actually Cost: Ingestion, Storage, and Insights Queries
CloudWatch Logs has three separate charges — ingestion, storage, and Logs Insights query scanning — and they're priced two orders of magnitude apart from each other. Most teams worry about the query charge because it's the one they trigger manually, by hand, while debugging. It's usually the smallest of the three. Here's the actual per-GB pricing for each stage, verified directly against AWS's own pricing page, and a worked example showing where a typical bill actually comes from.
- How is CloudWatch Logs priced?
- What does CloudWatch Logs ingestion cost?
- What does CloudWatch Logs storage cost?
- What does a CloudWatch Logs Insights query cost?
- A worked example: where the money actually goes
- How to actually cut the bill
- Does Nuberio Audit check log costs?
How is CloudWatch Logs priced?
CloudWatch Logs bills three things independently: $0.50 per GB to ingest log data (Standard class), $0.03 per GB per month to store it (compressed, Standard class), and $0.005 per GB of data scanned by a Logs Insights query. A 5 GB/month free tier covers ingestion, storage, and query-scanning combined — not 5 GB each. Figures below are US East (Ohio/N. Virginia) rates, verified against aws.amazon.com/cloudwatch/pricing/ on 2026-08-11; other regions vary.
What does CloudWatch Logs ingestion cost?
Ingestion is billed per GB of raw log data sent to CloudWatch, at the moment it's written — $0.50/GB on the Standard log class, or $0.25/GB if the log group is set to the Infrequent Access class. This is the charge that scales directly with how much your application logs, and for almost any real workload it's the largest of the three line items by a wide margin.
| Log class | Ingestion | Storage (compressed) | Best for |
|---|---|---|---|
| Standard | $0.50 per GB | $0.03 per GB/month | Logs you'll actively query — errors, request traces, anything pulled up during an incident |
| Infrequent Access | $0.25 per GB | $0.018 per GB/month | Compliance/audit logs you almost never query, only need to retain |
What does CloudWatch Logs storage cost?
Storage is billed monthly per GB of data actually held in a log group, after compression — $0.03/GB/month Standard, $0.018/GB/month Infrequent Access, or $0.006/GB/month if archived to Archive Instant Access. AWS's own pricing page lists a 0.15 compression ratio for stored log data, meaning 1 GB of raw ingested text typically lands around 150 MB stored — so the storage line item is usually small relative to ingestion, even before retention limits are applied.
The part that actually drives storage cost up over time isn't the per-GB rate — it's retention. A CloudWatch log group's default retention setting is Never Expire. Every log group created without an explicit retention period keeps accumulating storage charges indefinitely, month after month, for data nobody is ever going to query again.
What does a CloudWatch Logs Insights query cost?
A Logs Insights query costs $0.005 per GB of data scanned across the time range and log groups selected — not per query, and not based on how much data the query returns. A query with a narrow time range scans less data and costs less; the same query run over 30 days instead of 1 day scans roughly 30x the data, whether or not the result set is any bigger.
This charge applies identically whether the query runs from the CloudWatch console, the AWS CLI, an SDK call, or an automated dashboard — there's no free-in-console exception the way there is for Metrics Insights queries run interactively. Container Insights' automated dashboards run Logs Insights queries behind the scenes on the same metered basis.
A worked example: where the money actually goes
Take a mid-size app logging 50 GB/month of raw text across ECS and Lambda, with an on-call engineer running roughly 20 Logs Insights queries a day, each scanning about 2 GB (a day's worth of logs across a few log groups):
| Line item | Volume | Rate | Monthly cost |
|---|---|---|---|
| Ingestion | 50 GB (5 GB free tier applied) | $0.50/GB | ~$22.50 |
| Storage | ~7.5 GB compressed (50 GB × 0.15 ratio) | $0.03/GB | ~$0.23 |
| Logs Insights queries | 600 queries × 2 GB = 1,200 GB scanned | $0.005/GB | $6.00 |
Total: roughly $28.73/month, and ingestion alone is 78% of it — even in a scenario with unusually heavy, daily manual querying. Storage barely registers because of compression. This is the opposite of how most engineers budget for CloudWatch Logs: the charge that happens automatically, every time a line gets logged, dwarfs the charge that happens when someone deliberately goes looking for something.
How to actually cut the bill
Since ingestion is almost always the dominant cost, the highest-leverage fix is reducing what gets logged in the first place — not optimizing query patterns.
- Cut DEBUG/verbose logging in production — it's usually the single largest contributor to ingested volume and rarely gets read outside an active incident.
- Set an explicit retention period on every log group — the Never Expire default means storage cost compounds forever on data nobody will query again; 30-90 days covers most operational debugging needs.
- Move logs you keep only for compliance to the Infrequent Access class — half the ingestion cost, in exchange for giving up Logs Insights querying you weren't going to do anyway.
- Scope Logs Insights queries to the narrowest time range and log group that answers the question — a query over the exact incident window costs a fraction of the same query run over the full retention period out of habit.
Related reading
Does Nuberio Audit check log costs?
No — worth being direct about this. Nuberio Audit checks alarm coverage across your AWS resources; it doesn't currently inspect CloudWatch Logs group retention settings, log class (Standard vs Infrequent Access), or ingestion volume. If a log group has been accumulating storage on Never Expire retention for two years, the Audit won't flag it. That's a real gap, not a feature the product has and this post just didn't mention — checking log group retention settings by hand (or via a script against the DescribeLogGroups API) is still necessary today.
Frequently asked questions
How much does a CloudWatch Logs Insights query cost?
$0.005 per GB of data scanned across the time range and log groups the query covers — not per query, and not based on result size. This applies whether the query runs from the console, CLI, an SDK, or an automated dashboard like Container Insights.
What's included in CloudWatch Logs' free tier?
5 GB per month, shared across ingestion, archival storage, and data scanned by Logs Insights queries combined — not 5 GB for each category separately. Most production workloads exceed this within the first few days of the month.
Why is my CloudWatch Logs bill mostly ingestion, not queries?
Ingestion ($0.50/GB Standard) is charged on every byte logged, continuously, regardless of whether anyone ever reads it. Logs Insights queries ($0.005/GB scanned) are charged only when someone deliberately runs one. For most workloads, the volume of logs written vastly exceeds the volume of logs anyone queries, so ingestion dominates the bill.
Does compression reduce what I'm billed for CloudWatch Logs storage?
Yes. AWS applies a 0.15 compression ratio to stored log data — roughly 1 GB of raw ingested text becomes about 150 MB of billed storage. Storage is billed on the compressed size, at $0.03/GB/month on the Standard log class.
What's the difference between CloudWatch Logs Standard and Infrequent Access classes?
Infrequent Access costs half as much to ingest ($0.25/GB vs $0.50/GB) and less to store ($0.018/GB vs $0.03/GB/month), but log groups on that class can't be queried with Logs Insights or filtered with metric filters. It's meant for compliance/audit logs you need to retain but won't actively query — not for anything you'd debug against.
Related reading
Not sure your alarm coverage is actually solid?
Run a free Nuberio Audit — hygiene score, missing alarms, and security findings in about 5 minutes.