InsufficientInstanceCapacity means exactly what it says: at this moment, AWS does not have enough spare hardware of the instance type you requested in the specific Availability Zone you targeted. It is not a quota problem, not a billing problem, and not something a support ticket resolves in real time. The real workarounds are to be flexible on one of the three variables — the AZ, the instance type, or the timing — or to pay for guaranteed capacity ahead of time with an On-Demand Capacity Reservation.
What’s happening
Every Availability Zone has a finite pool of physical hosts per instance family, and AWS oversells nothing here: when the pool for m7i.2xlarge in us-east-1a is exhausted, launches fail with this error until capacity frees up or gets added. The error is scoped tightly — the same type may launch fine in us-east-1b at the same moment, and a different size in the same AZ may also work.
Two situations make it chronic rather than transient. First, constrained families: GPU instances (p4, p5, g6) and the newest generations are supply-limited industry-wide, and hitting capacity errors on them is routine, not exceptional. Second, the stop/start trap: while an instance runs, its capacity is yours; the moment you stop it, that slot returns to the shared pool. Stopping a large or scarce instance overnight to save money can mean being unable to start it in the morning. This bites hardest on GPU boxes and big memory-optimized types, and it also means a stop-and-resize operation can strand you — plan for that before you resize an instance.
Do not confuse this with VcpuLimitExceeded or other quota errors — those are about your account’s limits and are fixed with a quota increase request. Capacity is about AWS’s physical supply, and no form fixes physics.
What to check first
- Read the exact error code.
InsufficientInstanceCapacityis supply;InstanceLimitExceeded/VcpuLimitExceededis your quota. Different problems, different fixes. - Did you pin an Availability Zone? A launch that specifies
us-east-1acan only fail there. Unpinning is often the whole fix. - Is this a scarce family? GPU and newest-generation types fail this way often. Older mainstream types (m5, c5, r5) rarely do for long.
- Is an Auto Scaling group behind this? Check the ASG activity history — capacity errors show up there with the exact type and AZ that failed.
- Is this a stopped instance refusing to start? That is the released-slot problem, and the workarounds differ from a fresh launch.
How to verify
For an ASG, the activity log names the failure precisely:
aws autoscaling describe-scaling-activities \
--auto-scaling-group-name prod-web-asg \
--max-records 10 \
--query 'Activities[].[StartTime,StatusCode,StatusMessage]'
For manual launches, retry against a different AZ by specifying only the subnet:
# List subnets and their AZs in the VPC
aws ec2 describe-subnets \
--filters Name=vpc-id,Values=vpc-0123456789abcdef0 \
--query 'Subnets[].[SubnetId,AvailabilityZone]' --output table
# Try the launch in another AZ's subnet
aws ec2 run-instances --instance-type m7i.2xlarge \
--image-id ami-0123456789abcdef0 \
--subnet-id subnet-0fedcba9876543210 --count 1
If you run Spot or mixed fleets, Spot placement scores (EC2 > Spot Requests > Placement score) rate which regions and AZs currently have the best capacity for a set of types — useful signal even for on-demand planning. Capacity Reservations live under EC2 > Capacity Reservations, and the mechanics are documented at https://docs.aws.amazon.com/ec2/.
The runbook
- Retry in another Availability Zone. The single most effective move. Capacity is AZ-scoped, so shifting the launch to a sibling subnet resolves the majority of one-off failures. For an ASG, make sure it spans at least two or three AZ subnets so it can do this on its own.
- Flex the instance type. One size up or down in the same family (
m7i.xlargeinstead ofm7i.2xlarge), the previous generation (m6i), or an equivalent in a sibling family (c7i,r7idepending on workload shape). ASGs and EC2 Fleet support mixed instance types and attribute-based instance type selection precisely so this happens automatically — the pattern is covered in mixed instances policies. - If it is a stopped instance that will not start, keep retrying — and stop stopping it. Retries every few minutes usually get scarce capacity back within minutes to hours, but there is no SLA on that. If the workload matters, either leave it running or protect it with a reservation (next step).
- Buy an On-Demand Capacity Reservation for capacity you cannot gamble on. An ODCR guarantees the type/AZ combination and can be created and cancelled at any time. Honest cost mechanics: you pay the on-demand rate for reserved capacity whether an instance is running in it or not — it is insurance priced as compute. Pair it with Savings Plans or Regional RIs for the discount side; the reservation itself is about availability, not price.
- For GPU training workloads, use Capacity Blocks for ML. They let you reserve scarce GPU capacity for a defined future window instead of fighting the on-demand pool the morning your training job starts.
- If a whole environment must exist on demand (DR, big launches), talk to AWS ahead of time. Account teams and AWS Support can advise on capacity planning for large events — but only in advance, not mid-incident.
When this is the wrong move
Do not architect around a single AZ “because that is where the capacity was today” — you are trading a transient launch error for a permanent availability risk. And do not blanket the account with capacity reservations out of fear: unused ODCRs bill continuously, and reserving capacity you cannot name a requirement for is just paying for anxiety. Reserve what has a business case; stay flexible everywhere else.
Common mistakes
- Filing a support ticket and waiting, when a different AZ would have launched thirty seconds later.
- Pinning ASGs or launch templates to one AZ and one instance type, giving AWS zero room to place you.
- Stopping scarce GPU instances nightly to save money, then losing the capacity slot and the next day’s work.
- Confusing capacity errors with vCPU quota errors and requesting a quota increase that changes nothing.
Prevention
- Spread every ASG across at least two AZs, and configure multiple acceptable instance types or attribute-based selection.
- Keep launch templates AZ-agnostic; let the subnet list drive placement.
- Reserve capacity (ODCR) for the small set of instances where a failed launch has real business cost — stateful pets, GPU inference, DR targets.
- Watch Spot placement scores or launch-failure metrics for early warning that a family is getting tight in your region.
- Prefer current-generation mainstream families for baseline workloads; scarcity concentrates in the newest and most specialized types.
Capacity errors reward flexibility and punish pinning — the accounts that never notice them are the ones that gave EC2 more than one way to say yes. If nobody on your team truly owns the AWS environment end to end, that is the root of most of these problems — Stack Harbor runs AWS accounts daily under AWS Operations, and you can book an AWS review.