JSTGTECH
← Back to blog

Service spotlight: Aurora Serverless v2 without the v1 cold starts

3 min read

Aurora Serverless v1 had a reputation problem, and it was earned: scale-to- zero meant a cold start that could take tens of seconds on the next connection, and scaling itself worked in coarse steps that didn’t handle sudden bursts well. Enough people got burned that “Aurora Serverless” became shorthand for “don’t.” v2 is a different architecture, not a patched v1, and it’s worth revisiting that reputation now that the two are easy to conflate.

What changed

v1 scaled by swapping the entire database to a differently-sized instance behind the scenes — a real cutover with a brief connection drop, done in discrete capacity steps. v2 scales capacity in place, in increments of 0.5 ACUs (Aurora Capacity Units, each roughly 2 GiB of memory plus proportional CPU and networking), typically in under a second, with no connection interruption. You set a min and max ACU range per cluster (as low as 0, up to 256 per instance) and Aurora adjusts within it continuously based on actual load — CPU, memory, and active connections — rather than stepping through a small number of predefined sizes.

Crucially, v2 instances can participate in a Global Database, use Multi-AZ with the same failover mechanics as provisioned Aurora, and even mix with provisioned instances in the same cluster (serverless reader, provisioned writer, or vice versa) — none of which v1 supported. That mixed- instance-class capability is the feature that makes it viable for real production topologies instead of just dev/test databases.

Where it earns its keep

  • Variable, hard-to-predict load — a multi-tenant SaaS database where tenant activity spikes unpredictably, or a workload with a strong daily/ weekly cycle (busy on weekday mornings, near-idle overnight) where sizing for peak means paying for idle capacity most of the time.
  • Dev/test/staging environments that see bursts of activity during work hours and near-zero the rest of the time — set a low min ACU and let it ride down without anyone managing an instance-stop/start schedule.
  • New workloads where you genuinely don’t know the right instance size ** yet.** Instead of guessing an r6g.xlarge and resizing later (a disruptive operation on provisioned Aurora), set a wide ACU range and let the actual traffic tell you where it settles — then, if it settles at a steady high number, consider whether provisioned pricing would now be cheaper for that stable load.

Where provisioned Aurora still wins

For a steady, predictable, high-utilization workload, provisioned Aurora with Reserved Instance pricing is cheaper than v2 at the equivalent capacity — the per-ACU-hour rate carries a premium over the equivalent provisioned instance-hour, same trade as Fargate versus EC2. If your database sits at a consistent 8 ACUs of load 24/7 with no meaningful variance, you’re paying for elasticity you’re not using.

There’s also a real floor: 0.5 ACU minimum for an “always-on” cluster is roughly comparable to a small t4g instance’s baseline cost — v2 doesn’t scale to true zero like v1 could (v2 got a scale-to-zero option later, but it reintroduces a cold-start pause on the next connection, the exact trade-off v2 was built to avoid at higher tiers, so it’s really only sane for genuinely idle dev environments).

The scaling-lag gotcha

Scaling is fast but not instant, and it reacts to load — it doesn’t predict it. A workload that goes from idle to a hard spike in under a second (a flash-sale-style traffic burst) can briefly get throttled or see elevated latency while Aurora scales up to meet it, because there’s a real control loop with a reaction time, not a pre-provisioned buffer sitting ready. Setting a higher minimum ACU than “what average load needs” gives the scaling logic headroom to absorb bursts before it has to react, at the cost of paying for that headroom continuously — a direct latency-versus-cost knob, not a free win.

A practical tip

Watch the ServerlessDatabaseCapacity CloudWatch metric against your min/ max bounds for a couple of weeks under real traffic before treating the range as tuned. A cluster that’s pinned at its max ACU most of the day isn’t “elastic,” it’s a provisioned database paying the serverless premium — that’s the signal to either raise the max or move to provisioned capacity for the baseline and reserve v2 for genuinely variable secondary workloads.

Related posts