Skip to main content
schedule · aws

Auto Scaling Groups pinned so MinSize blocks every scale-in

resource types
1
rule IDs covered
1
severity
medium

What does ZopNight detect here?

An Auto Scaling Group whose MinSize equals its DesiredCapacity, both above 1, can never shed capacity. The floor blocks every scale-in. ZopNight flags these only when a scaling policy exists and a measured idle window backs a schedule, pricing the saving as monthly cost times the measured idle fraction.

Signal and threshold

How ZopNight evaluates Auto Scaling Groups pinned so MinSize blocks every scale-in.
Field Value
Rule IDsRC-054
Categoryschedule
Severitymedium
Metricnone — pure configuration read
Sourceasg_floor.go

Why a floor lock wastes money quietly

When MinSize and DesiredCapacity are set to the same number (say both at 4), the group’s scale-in policy has nowhere to go. Demand drops at night, the policy tries to remove an instance, and the floor refuses. The group holds peak capacity 24/7 while looking, on a dashboard, like autoscaling is working. Nothing errors. Every pinned instance keeps billing at its full on-demand hourly rate, so the bill just never goes down.

The usual origin is a load test or an incident: someone raises MinSize to force capacity, the incident ends, and the setting stays.

The four gates, in order

  1. The group is floor-locked: MinSize equals DesiredCapacity and both are greater than 1.
  2. The group has at least one scaling policy. Lowering MinSize on a group with zero policies is inert: nothing would scale it in anyway, so that case abstains (it belongs to a different rule).
  3. A real monthly cost figure exists for the group. No price, no finding.
  4. The usage heatmap shows a measured off-hours idle fraction greater than zero.

Miss any gate and the rule says nothing.

Check a group yourself

Terminal window
aws autoscaling describe-auto-scaling-groups \
--query 'AutoScalingGroups[?MinSize==DesiredCapacity && MinSize>`1`].[AutoScalingGroupName,MinSize,DesiredCapacity]' \
--output table

Then confirm each listed group actually has a scale-in policy:

Terminal window
aws autoscaling describe-policies \
--auto-scaling-group-name my-asg \
--query 'ScalingPolicies[].[PolicyName,PolicyType]'

What the number means

The saving is monthly cost multiplied by the measured idle percentage from the heatmap, the fraction of the week the group demonstrably sits idle. It is never a flat assumed percentage. The lever is a recurring schedule that lowers MinSize during that window so the existing policy can scale in, then restores it before demand returns. It is not a stop, and not a deletion. The group keeps serving through the whole cycle.

Where it deliberately stays silent

  • Groups with no scaling policies, where lowering the floor changes nothing.
  • Groups without pricing data, since the rule never reports an unpriced saving.
  • Groups with no measured idle window. A floor-locked group that is busy around the clock is correctly pinned, and flagging it would be noise.

See it fire on your bill.

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

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

417 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·