Trying Out the New EC2 Auto Scaling Feature "reservations-then-balanced" for AZ Distribution That Prioritizes Capacity Reservations
This page has been translated by machine translation. View original
Introduction
On June 30, 2026, a new AZ distribution strategy, reservations-then-balanced, was added to EC2 Auto Scaling.
With the conventional balanced-best-effort, even distribution across AZs takes priority, so reservations sometimes could not be used when they were unevenly distributed across AZs. With reservations-then-balanced, you can operate in a way that consumes capacity reservations first and distributes instances beyond the reserved capacity across AZs.
| Item | balanced-best-effort | reservations-then-balanced |
|---|---|---|
| Priority during scale-out | Even AZ distribution | Consume capacity reservations → AZ distribution |
| Termination order during scale-in | Prioritizes AZ balance | Instances outside the reservation are terminated first (result of this verification) |
| Reservation utilization (3 reserved instances in AZ-a, 3-AZ configuration, this verification) | 1/3 at Desired=3 | 1/3 at Desired=3, confirmed up to 2/3 at Desired=5 |
Verification Environment
- Region: ap-northeast-1
- ODCR: t4g.nano × 3, ap-northeast-1a, targeted
- Auto Scaling Group (ASG): 3-AZ configuration of ap-northeast-1a / 1c / 1d, Max=5
Verification
Creating the ODCR
I created a targeted ODCR for t4g.nano × 3 in ap-northeast-1a.
aws ec2 create-capacity-reservation \
--availability-zone ap-northeast-1a \
--instance-type t4g.nano \
--instance-platform "Linux/UNIX" \
--instance-count 3 \
--end-date-type unlimited \
--instance-match-criteria targeted
{
"CapacityReservationId": "cr-xxxxxxxxxxxxxxxxx",
"InstanceType": "t4g.nano",
"AvailabilityZone": "ap-northeast-1a",
"TotalInstanceCount": 3,
"AvailableInstanceCount": 3,
"State": "active",
"InstanceMatchCriteria": "targeted"
}
Creating the ASG (CloudFormation)
I created the ASG with the following CloudFormation template. It is first deployed with balanced-best-effort (the default) and later switched to reservations-then-balanced.
CloudFormation template (click to expand)
AWSTemplateFormatVersion: "2010-09-09"
Description: >
ASG with reservations-then-balanced strategy.
t4g.nano instances with ODCR priority in AZ-a, then balanced across AZs.
Parameters:
CapacityReservationId:
Type: String
Description: "ODCR ID (e.g., cr-0123456789abcdef0) created by create-odcr.sh"
SubnetAZa:
Type: AWS::EC2::Subnet::Id
Description: "Subnet in ap-northeast-1a"
SubnetAZb:
Type: AWS::EC2::Subnet::Id
Description: "Subnet in ap-northeast-1c"
SubnetAZc:
Type: AWS::EC2::Subnet::Id
Description: "Subnet in ap-northeast-1d"
AmiId:
Type: AWS::SSM::Parameter::Value<AWS::EC2::Image::Id>
Default: /aws/service/ami-amazon-linux-latest/al2023-ami-kernel-default-arm64
Description: "AMI ID (default: latest Amazon Linux 2023 ARM64)"
DesiredCapacity:
Type: Number
Default: 3
MinSize:
Type: Number
Default: 0
MaxSize:
Type: Number
Default: 5
Resources:
LaunchTemplate:
Type: AWS::EC2::LaunchTemplate
Properties:
LaunchTemplateName: !Sub "${AWS::StackName}-lt"
LaunchTemplateData:
ImageId: !Ref AmiId
InstanceType: t4g.nano
TagSpecifications:
- ResourceType: instance
Tags:
- Key: Name
Value: !Sub "${AWS::StackName}-instance"
AutoScalingGroup:
Type: AWS::AutoScaling::AutoScalingGroup
Properties:
AutoScalingGroupName: !Sub "${AWS::StackName}-asg"
LaunchTemplate:
LaunchTemplateId: !Ref LaunchTemplate
Version: !GetAtt LaunchTemplate.LatestVersionNumber
VPCZoneIdentifier:
- !Ref SubnetAZa
- !Ref SubnetAZb
- !Ref SubnetAZc
MinSize: !Ref MinSize
MaxSize: !Ref MaxSize
DesiredCapacity: !Ref DesiredCapacity
AvailabilityZoneDistribution:
CapacityDistributionStrategy: balanced-best-effort
CapacityReservationSpecification:
CapacityReservationPreference: capacity-reservations-first
CapacityReservationTarget:
CapacityReservationIds:
- !Ref CapacityReservationId
- Target the ODCR with
CapacityReservationSpecification(capacity-reservations-first+ ODCR ID) AvailabilityZoneDistributionis created withbalanced-best-effortinitially, and later switched toreservations-then-balancedvia the API
Before: Scale-out with balanced-best-effort
These are the results after setting Desired Capacity to 3.
| AZ | Instance ID | CR Preference | LifecycleState |
|---|---|---|---|
| ap-northeast-1a | i-0ea798b6xxxxxxxx | open | InService |
| ap-northeast-1c | i-07479a5fxxxxxxxx | open | InService |
| ap-northeast-1d | i-07391cc3xxxxxxxx | open | InService |
{
"Total": 3,
"Available": 2
}
As a result of even distribution across the 3 AZs (a:1, c:1, d:1), only 1 instance of the AZ-a reservation was consumed, and the remaining 2 are unused.
After: Scale-out with reservations-then-balanced
Switch to reservations-then-balanced with update-auto-scaling-group. In this verification, this change did not cause existing instances to be replaced immediately.
aws autoscaling update-auto-scaling-group \
--auto-scaling-group-name reservations-balanced-demo-asg \
--availability-zone-distribution '{"CapacityDistributionStrategy":"reservations-then-balanced"}'
0 → 3 instances
Because AZ balance is also considered during the initial scale-out, reservation consumption in this verification stayed at 1 instance (1/3), the same as with balanced-best-effort. The difference became clear from the next scale-out.
One instance in AZ-a was placed in the reservation (capacity-reservations-only), and the remaining 2 were distributed to c and d.
| AZ | Instance ID | CR Preference | Capacity Reservation |
|---|---|---|---|
| ap-northeast-1a | i-08fcce94xxxxxxxx | capacity-reservations-only | cr-xxxxxxxxxxxxxxxxx |
| ap-northeast-1c | i-0ef98d3axxxxxxxx | open | — |
| ap-northeast-1d | i-015bca4cxxxxxxxx | open | — |
ODCR remaining: 2/3 (Available: 2)
3 → 5 instances
Of the 2 additional instances, one was placed in AZ-a and consumed a reservation, and the other was placed in AZ-c. ODCR consumption increased to 2/3.
| AZ | Instance ID | CR Preference | Capacity Reservation |
|---|---|---|---|
| ap-northeast-1a | i-08fcce94xxxxxxxx | capacity-reservations-only | cr-xxxxxxxxxxxxxxxxx |
| ap-northeast-1a | i-085d201exxxxxxxx | capacity-reservations-only | cr-xxxxxxxxxxxxxxxxx |
| ap-northeast-1c | i-0ef98d3axxxxxxxx | open | — |
| ap-northeast-1c | i-00cb22cfxxxxxxxx | open | — |
| ap-northeast-1d | i-015bca4cxxxxxxxx | open | — |
ODCR remaining: 1/3 (Available: 1)
Scale-in: Confirming that instances using reservations remain
I reduced Desired Capacity from 5 to 3. Instances outside the reservation were terminated first, and the instances using the reservation remained.
Terminated instances:
| Instance ID | AZ | CR Preference |
|---|---|---|
| i-015bca4cxxxxxxxx | ap-northeast-1d | open |
| i-00cb22cfxxxxxxxx | ap-northeast-1c | open |
Remaining instances:
| AZ | Instance ID | CR Preference | Capacity Reservation |
|---|---|---|---|
| ap-northeast-1a | i-08fcce94xxxxxxxx | capacity-reservations-only | cr-xxxxxxxxxxxxxxxxx |
| ap-northeast-1a | i-085d201exxxxxxxx | capacity-reservations-only | cr-xxxxxxxxxxxxxxxxx |
| ap-northeast-1c | i-0ef98d3axxxxxxxx | open | — |
As a result, the AZ placement is skewed to a:2, c:1, but the reservation utilization is maintained (ODCR remaining: 1/3).
Summary
reservations-then-balanced is an effective AZ distribution strategy for configurations with capacity reservations that are unevenly distributed across AZs.
In this verification, with 3 instances' worth of ODCR concentrated in a single AZ, balanced-best-effort consumed the reservation for only 1 instance at Desired=3. On the other hand, with reservations-then-balanced, reservation consumption advanced to 2/3 when scaling out from Desired=3 to 5, and I was able to confirm that instances using the reservation remained during scale-in.
If reservations can be placed evenly across AZs, even the conventional balanced-best-effort makes it easier for even AZ distribution and reservation consumption to line up. If reservations are concentrated in a specific AZ, reservations-then-balanced becomes a strong option. In either case, I recommend checking the actual placement results to confirm that reservations are being consumed as intended.
Reference Links
