Skip to main content
idle · aws

ElastiCache clusters with no connections, no cache lookups and under 5% CPU for 30 days

resource types
1
rule IDs covered
1
severity
medium

What does ZopNight detect here?

ZopNight flags ElastiCache clusters whose `CurrConnections`, `CacheHits` and `CacheMisses` all stay below 1 and whose `CPUUtilization` stays below 5%, on both average and peak, across 30 days of covered data. On-Demand nodes bill every node-hour regardless, so the saving is the cluster's full monthly run-rate.

Signal and threshold

How ZopNight evaluates ElastiCache clusters with no connections, no cache lookups and under 5% CPU for 30 days.
Field Value
Rule IDsRC-108
Categoryidle
Severitymedium
MetricCurrConnections
Thresholdconnections, hits, misses < 1; CPU < 5%
Evaluation window30d
SourceZopNight
Permissions usedelasticache:DescribeCacheClusters · elasticache:DescribeReplicationGroups · cloudwatch:GetMetricStatistics

Cache nodes bill by the hour whether or not anything reads them

ElastiCache pricing bills On-Demand nodes hourly from launch until termination, with each partial node-hour counted as a full hour. A cache left behind by a retired service, or created for a load test, costs the same as one handling production traffic. Caches also tend to be sized generously, so a forgotten one is rarely cheap.

Proving a cache is unused

Terminal window
aws elasticache describe-cache-clusters --show-cache-node-info \
--query 'CacheClusters[].[CacheClusterId,CacheNodeType,NumCacheNodes,ReplicationGroupId]'
aws cloudwatch get-metric-statistics --namespace AWS/ElastiCache --metric-name CacheHits \
--dimensions Name=CacheClusterId,Value=my-cache-001 \
--start-time 2026-08-26T00:00:00Z --end-time 2026-09-25T00:00:00Z \
--period 86400 --statistics Sum Maximum

Run the same for CacheMisses, CurrConnections and CPUUtilization. AWS notes that on Valkey and Redis OSS, ElastiCache itself uses 4 to 6 connections to monitor the cluster, so hits and misses are the clearer signal of real use when you check by hand.

Four quiet signals, all required

The rule looks at four CloudWatch metrics for the cluster over 30 days:

  • CurrConnections below 1;
  • CacheHits below 1;
  • CacheMisses below 1;
  • CPUUtilization below 5%.

Each must hold on both the average and the maximum, and each series must cover the full 30 days. The cluster also needs a resolved monthly cost, from node type rate times node count.

Any doubt means no finding

If one of the four metrics is missing, covers less than 30 days, or rises above its floor even once at peak, the cluster is left alone. That makes the rule strict: a single client holding a connection is enough to keep a cluster off the list, and on Valkey and Redis OSS the monitoring connections AWS describes can do the same. A cache that is used but oversized is a rightsizing question rather than an idle one.

The saving is the whole cluster

Terminal window
saving = node type hourly rate x node count x 730
cost after deletion = 0

Removing an idle cache

  1. Search application configuration and secrets for the cluster endpoint.
  2. Take a final backup where the engine supports it.
  3. Delete a replication group with a final snapshot: aws elasticache delete-replication-group --replication-group-id my-cache --final-snapshot-identifier my-cache-final
  4. For a standalone node cluster, use aws elasticache delete-cache-cluster --cache-cluster-id my-cache-001.

See it fire on your bill.

Connect an account read-only. The first findings land in minutes.

472 rule families across 353 resource types on 22 platforms. Every threshold, metric, and IAM action is documented on these pages before you grant anything.

472 rule families documented
353 resource types covered
read-only default access level
Multi-cloud automation· Production-ready in 30 min· SOC 2 · ISO 27001· 20–60% off the bill, first month· 4 platforms · 1 console· Multi-cloud automation· Production-ready in 30 min· SOC 2 · ISO 27001· 20–60% off the bill, first month· 4 platforms · 1 console·