Skip to main content

AI & assistant-friendly summary

This section provides structured content for AI assistants and search engines. You can cite or summarize it when referencing this page.

Summary

import PricingHeroStats from '~/components/blog/PricingHeroStats. astro'; import PricingDimensionTable from '~/components/blog/PricingDimensionTable. astro'; import BillSurpriseCallout from '~/components/blog/BillSurpriseCallout

Key Facts

  • CloudWatch bills across ten distinct dimensions — Logs ingestion at $0
  • astro'; CloudWatch is the AWS observability primitive with the most pricing dimensions of any single service
  • PricingHeroStats stats={[ { value: '$0
  • 50', label: 'Logs ingestion / GB', note: 'The single biggest CW line on most accounts' }, { value: '$0
  • Verify against the AWS CloudWatch pricing page for your region

Entity Definitions

Lambda
Lambda is an AWS service discussed in this article.
S3
S3 is an AWS service discussed in this article.
CloudWatch
CloudWatch is an AWS service discussed in this article.
Amazon CloudWatch
Amazon CloudWatch is an AWS service discussed in this article.
EKS
EKS is an AWS service discussed in this article.
ECS
ECS is an AWS service discussed in this article.
SNS
SNS is an AWS service discussed in this article.
microservices
microservices is a cloud computing concept discussed in this article.

Amazon CloudWatch Pricing: The 10 Billing Dimensions Behind Your Observability Bill

Quick summary: CloudWatch bills across ten distinct dimensions — Logs ingestion at $0.50/GB, Logs storage, custom metrics with cardinality multipliers, alarms tiered by resolution and type, dashboards at $3 each, Synthetics canary runs, RUM events, X-Ray traces, Container Insights, and cross-region replication. Logs ingestion is the largest line on most accounts.

Key Takeaways

  • CloudWatch bills across ten distinct dimensions — Logs ingestion at $0
  • astro'; CloudWatch is the AWS observability primitive with the most pricing dimensions of any single service
  • PricingHeroStats stats={[ { value: '$0
  • 50', label: 'Logs ingestion / GB', note: 'The single biggest CW line on most accounts' }, { value: '$0
  • Verify against the AWS CloudWatch pricing page for your region
Amazon CloudWatch Pricing: The 10 Billing Dimensions Behind Your Observability Bill
Table of Contents

CloudWatch is the AWS observability primitive with the most pricing dimensions of any single service. Ten distinct lines — Logs ingestion, Logs storage, Logs Insights queries, custom metrics, alarms (in three tiers), dashboards, Synthetics canaries, RUM events, X-Ray traces, and Container Insights — each with its own per-unit rate, free tier, and cardinality multiplier. The bill on a mature account is rarely under five figures, and Logs ingestion is almost always the largest line.

This post is the bill story. For the operational angle — alarm hygiene, log structure, dashboard design — see our CloudWatch observability best practices guide. For the specific case of logs cost control, the CloudWatch logging costs post covers sampling and structured-logging patterns in depth.

The 10 CloudWatch Billing Dimensions

CloudWatch pricing breakdown — us-east-1, June 2026

Prices in us-east-1

The Logs ingestion line dominates most bills. Cardinality on custom metrics and alarm count are the next two leaders.

Logs ingestion

$250.00

Largest line on most accounts

Unit price
$0.50 / GB
Example workload
500 GB / month

Logs storage

~$450

Cheaper to export to S3 for long-term

Unit price
$0.03 / GB-month
Example workload
5 TB retained 90 days

Logs Insights queries

$50.00

Each query scans the entire matching window

Unit price
$0.005 / GB scanned
Example workload
10 TB scanned / month

Custom metrics — first 10K

$3,000

Cardinality is the trap; tiered down above 10K

Unit price
$0.30 / metric / month
Example workload
10K unique metrics

Custom metrics — over 10K

~$12K

High-cardinality dimensions explode the count

Unit price
Tiered: $0.10 → $0.05 → $0.02
Example workload
100K unique metrics

Standard alarms

$100

1-minute evaluation period

Unit price
$0.10 / alarm / month
Example workload
1000 alarms

High-resolution alarms

$30

10-second evaluation; use sparingly

Unit price
$0.30 / alarm / month
Example workload
100 alarms

Composite alarms

$25

For multi-metric incident logic

Unit price
$0.50 / alarm / month
Example workload
50 composite alarms

Anomaly detection

$30 + alarm cost

Worth it on key SLI metrics

Unit price
$0.30 / metric / month
Example workload
100 metrics with anomaly bands

Dashboards (after 3 free)

$141 (50 - 3 × $3)

Audit dashboard view counts

Unit price
$3 / dashboard / month
Example workload
50 dashboards

Synthetics canaries

~$520

Frequency × canary count × $0.0012

Unit price
$0.0012 / canary run
Example workload
Canary every 1 min × 10 canaries

RUM events

$100

Real User Monitoring; bills per event

Unit price
$1 / 100K events
Example workload
10M page-view events

X-Ray traces

$250 + scan cost

100K recorded + 1M scanned free

Unit price
$5 / M recorded + $0.50/M scanned
Example workload
50M traces / month

Container Insights (EKS)

$500–$2,000 / cluster

Disable on non-prod clusters

Unit price
Per metric per cluster + Logs ingest
Example workload
50-node cluster

The 14 dimensions here cover the most common CloudWatch line items. Less-common features (Live Tail, Metric Streams, Contributor Insights) have additional pricing.

The Logs Line: Always the Biggest

Logs ingestion at $0.50/GB is almost always the largest CloudWatch line on a mature account. The math is direct: a single noisy application logging at INFO level can produce 50 GB/day. Across a 50-service microservices fleet, that is 2.5 TB/day, $1,250/day, $37,500/month — for logs that mostly sit in CloudWatch and never get queried.

The four mitigations, ranked by impact:

  1. Sample DEBUG and verbose access logs. Drop 90%+ of low-value logs at the application before they reach CloudWatch. A 50% reduction in ingestion is a 50% reduction in this line.
  2. Route low-value logs to S3 via Firehose. Operational logs that exist for retention but not for active querying can go to S3 Standard-IA at $0.0125/GB-month instead of CloudWatch Logs at $0.50/GB ingest + $0.03/GB-month storage.
  3. Aggressive retention. Default CloudWatch Logs to “Never expire” — set to 14–30 days for application logs, 90 days for security/compliance logs, then export the older data to S3.
  4. Structured logging. Logs Insights queries on structured logs scan less data per query — $0.005 / GB scanned on JSON logs with field filtering is 10× cheaper than full-text scanning across unstructured logs.

Custom Metric Cardinality: The Hidden Explosion

Custom metrics bill per unique metric per month. The cardinality math is multiplicative: a metric with 5 dimensions × 10 possible values per dimension = 100,000 potential unique metrics, all of which bill if all combinations occur.

The most common waste pattern: publishing a metric with a high-cardinality dimension. User ID, request URL, container instance ID, customer ID — any dimension with hundreds or thousands of possible values will explode the metric count.

Alarm Sprawl: The Untracked Multiplier

Alarms accumulate. An organization that hits an incident, creates 20 alarms during the post-mortem, and never deletes them, will have thousands of alarms within a year. At $0.10/alarm/month for standard resolution, this is $100s/month for alarming alone. If alarms are high-resolution (10-second evaluation) by default — many incident-response runbooks specify high-resolution — the multiplier is 3×.

Audit quarterly:

  • Find alarms that have never triggered. Many are dead — delete.
  • Find alarms whose SNS topic targets an inbox no one reads. Either consolidate or delete.
  • Find composite alarms that depend on alarms that themselves are dead. Composite alarms are $0.50/each; clean them first.

Dashboards: Easy to Create, Easy to Forget

After the first 3 free per account, dashboards are $3/each per month. A large organization with shared dashboards across teams accumulates dashboards over time. The cost is small per dashboard but compounds: 100 dashboards across an organization is $300/month.

The cleanup: use Cross-Account Observability (CloudWatch’s centralized observability primitive) to share dashboards across accounts rather than recreating them per account. Audit individual dashboard usage with CloudWatch’s dashboard view metrics; consolidate or delete those with no views in 60+ days.

Container Insights: Per-Cluster Multiplier

Container Insights for EKS publishes hundreds of metrics per cluster (CPU, memory, network, disk per node and per pod) plus enables Container Insights logs. On a 50-node cluster, this can land at $500–$2,000/month per cluster in CloudWatch.

For cost-sensitive deployments, the alternatives:

  • OpenTelemetry → Amazon Managed Service for Prometheus. Prometheus’s per-sample pricing is generally lower than Container Insights’ per-metric model at the cardinality typical for Kubernetes.
  • Selective enablement. Enable Container Insights only on production clusters; use kubectl/k9s for dev/staging visibility.
  • FluentBit to S3 for container logs. Skip CloudWatch Logs for container logs entirely; route to S3 via Firehose for long-term storage at a fraction of the cost.

Synthetics and RUM: Frequency-Driven

Synthetics canaries bill $0.0012 per run. A canary running every minute costs $0.0012 × 60 × 24 × 30 = $51.84/month — small. A canary running every 10 seconds costs 6× that, $311/month. Across 10 canaries at 1-minute frequency, the bill is ~$520/month.

The pattern: budget canary frequency. Critical-path APIs warrant 1-minute checks; secondary endpoints can run every 5 or 15 minutes; nightly batch jobs need only daily canaries.

RUM bills $1/100K events. A high-traffic web app pulling 10M page views per month with RUM enabled generates $100/month — modest. The bill driver is event volume; configure RUM sampling at the application level for very high-traffic sites.

When to Use What CloudWatch Feature

CloudWatch Logs for active queries; S3 for retention; custom metrics with low cardinality; alarms with hygiene; dashboards consolidated.

Use when

  • CloudWatch Logs for application logs that get actively queried — last 14–30 days
  • Logs Insights for ad-hoc investigation; pre-aggregate with metric filters for routine dashboards
  • Custom metrics with pre-aggregated dimensions — account tier, service name, region — not per-user
  • EMF (Embedded Metric Format) for high-volume metrics; auto-aggregation reduces cost
  • High-resolution alarms only on customer-facing SLI metrics where 10-second evaluation matters
  • Container Insights selectively — production EKS clusters where the observability matters operationally

Avoid when

  • CloudWatch Logs as the long-term retention store — S3 lifecycle is 80–95% cheaper for compliance retention
  • Custom metrics with high-cardinality dimensions (user ID, request URL, container ID) — pre-aggregate
  • Default high-resolution alarming on everything — $0.30 × thousands compounds quickly
  • Container Insights on dev / staging EKS clusters where the observability is rarely consulted
  • Synthetics canaries running every 10 seconds when 1-minute would do — 6× cost for usually-no benefit
  • Dashboards created and never deleted — audit quarterly

CloudWatch is rarely the wrong observability primitive. The bill problems are almost always log verbosity, metric cardinality, and alarm/dashboard sprawl — none of which require migrating off CloudWatch.

A 30-Day CloudWatch Bill Cleanup Plan

Week 1 — Logs retention and sampling. Audit every log group’s retention setting. Default to 14–30 days for application logs, 90 for security. Identify the top 10 log groups by ingestion volume; apply sampling at the source for the high-volume ones.

Week 2 — Custom metric cardinality. Find metrics with the highest unique-count using the CloudWatch Metrics API. Identify dimensions that drive the cardinality. Pre-aggregate or remove the high-cardinality dimensions.

Week 3 — Alarm and dashboard cleanup. List every alarm via aws cloudwatch describe-alarms; identify alarms that have never triggered (use CloudWatch’s history metric). Delete dead alarms. List every dashboard; identify those with no views in 60+ days; delete or consolidate.

Week 4 — Container Insights and Synthetics scope. For EKS/ECS clusters with Container Insights enabled, decide which clusters genuinely need it (production yes; dev usually no). Disable on non-production. Audit Synthetics canary frequencies; reduce to the lowest cadence that meets SLO needs.

Cross-check the broader observability cost picture in our observability beyond CloudWatch post if migrating workloads to OpenTelemetry + Managed Prometheus + Grafana.

What This Post Doesn’t Cover

  • Cross-Account Observability — CloudWatch’s central-observability pattern is feature-rich but adds its own cross-account read charges; covered separately.
  • Application Signals — the modern application performance management feature on CloudWatch has per-monitored-service pricing; covered separately.
  • AWS Managed Service for Prometheus (AMP) comparison — different pricing model (per sample ingested + per query); covered in the Prometheus cardinality post.
  • Lambda Insights pricing — separate add-on at $0.20/M function invocations enhanced; covered in the Lambda cost optimization series.

If You Only Do One Thing This Week

Set CloudWatch Logs retention to 30 days (or less) on every log group via a one-time script: aws logs describe-log-groups --query 'logGroups[?!retentionInDays].logGroupName' --output text | xargs -I{} aws logs put-retention-policy --log-group-name {} --retention-in-days 30. Log groups with no retention policy currently keep logs forever, billing at $0.03/GB-month storage in perpetuity. Setting a default retention is non-destructive (you can always change it back) and starts the cleanup of accumulated old logs within a day. Pair with a Service Control Policy that enforces a maximum retention period on new log groups and the storage line stops growing.

For logs sampling and structured-logging patterns to reduce the ingestion line, the CloudWatch logging costs post covers the application-side techniques.

PP
Palaniappan P

AWS Cloud Architect & AI Expert

AWS-certified cloud architect and AI expert with deep expertise in cloud migrations, cost optimization, and generative AI on AWS.

AWS ArchitectureCloud MigrationGenAI on AWSCost OptimizationDevOps

Recommended Reading

Explore All Articles »
5 min

Amazon GuardDuty Pricing: Nine Data Sources, One Compounding Bill

GuardDuty bills across nine separate data sources — CloudTrail management events at $4/M tiered down, VPC Flow Logs at $1/GB tiered, EKS Runtime Monitoring per vCPU-hour, plus S3, DNS, Lambda, RDS, and Malware Protection. The 30-day free trial regularly hides the true production bill, and organization-wide auto-enable turns every new account into a billing line.

6 min

Amazon EventBridge Pricing: Six Components, One Surprise Bill

EventBridge looks like a $1/million-events service. It is actually six different billing dimensions — custom events, Pipes at $0.40/M, API Destinations at $0.20/M, Schema Discovery at $0.10/M, Archive at $0.10/GB-month, and cross-region replication that doubles the publish line. Built-in AWS-service events are free; custom buses are where the bill lives.