Cloud Databases

Aurora Serverless v2: Auto-Scaling Database for Variable Workloads

Use Aurora Serverless v2 for cost-effective scaling — ACU configuration, scaling behavior, and when it fits

JusDB Team
January 20, 2026
11 min read
174 views

If your application traffic looks like a heartbeat monitor — quiet at 3 AM, slammed at 9 AM, then unpredictable all afternoon — provisioned Aurora instances are burning money while your engineers sleep. Aurora Serverless v2 was designed specifically for this reality: a database that scales compute in near-real-time based on actual demand, billed to the second. The promise is compelling, but the details matter — ACU sizing, scaling behavior, cluster architecture constraints, and cost thresholds all determine whether Serverless v2 actually saves you money or quietly costs more than a steady provisioned instance. This post covers everything AWS engineers need to know before committing.

TL;DR
  • Aurora Serverless v2 scales in Aurora Capacity Units (ACUs) — fractional increments, near-instantly, with no cold-start penalty like v1.
  • Set min ACU as low as 0.5 and max ACU up to 128; you pay per ACU-hour consumed.
  • Serverless v2 instances can coexist in the same cluster as provisioned instances — useful for mixing a scaling writer with read replicas.
  • Unlike v1, Serverless v2 cannot pause to zero — there is no "auto-pause" feature, so idle costs never drop to $0.
  • Monitor ServerlessDatabaseCapacity in CloudWatch to observe real-time ACU consumption and tune your min/max settings.
  • Pair with RDS Proxy for connection pooling when Lambda or other short-lived clients hammer the endpoint.
  • Best fit: variable or unpredictable workloads, dev/test environments (with cost controls), and multi-tenant SaaS with noisy-neighbor isolation needs.

What Is Aurora Serverless v2?

Aurora Serverless v2 is a capacity mode for Amazon Aurora (both MySQL-compatible and PostgreSQL-compatible editions) where the database engine automatically adjusts compute resources in response to application load. Instead of selecting a fixed instance class — db.r6g.xlarge, say — you define a range of Aurora Capacity Units and let Aurora manage scaling within that range.

It is not a separate product or a managed-serverless abstraction layer. Under the hood it is still Aurora; the same storage engine, same replication protocol, same endpoint behavior. What changes is how compute is provisioned: rather than a pre-allocated VM with a fixed CPU/RAM profile, your database rides on shared infrastructure that dynamically allocates resources. The endpoint is persistent (no cold-start spin-up on first connection), the cluster DNS name never changes, and Multi-AZ high availability works the same way it does on provisioned.

The version distinction matters. Aurora Serverless v1 — the original release — used a completely different scaling mechanism that required pausing traffic and resuming capacity from cold. Scale events took tens of seconds to minutes, and the feature set was limited: no reader endpoints, no Global Database, no IAM authentication in early iterations. Serverless v2 is a ground-up rewrite that eliminates nearly all of those constraints.

The ACU Model: What You Are Actually Buying

An Aurora Capacity Unit (ACU) is the unit of compute capacity for Serverless v2. Each ACU is approximately 2 GiB of memory with proportional CPU and network. When your database is sitting at 2 ACUs, it has roughly 4 GiB of RAM available to the engine; at 8 ACUs, roughly 16 GiB.

You configure two parameters at the instance level:

  • Minimum ACU: The floor. Aurora will not scale below this value even when idle. The minimum supported value is 0.5 ACU.
  • Maximum ACU: The ceiling. Aurora will not scale above this value regardless of load. The current maximum is 128 ACU per instance.

Billing is calculated in ACU-hours. If your instance averages 4 ACUs over one hour, you are billed for 4 ACU-hours. Storage billing remains the same as standard Aurora: GB-month for the data stored, plus I/O charges if you are not on Aurora I/O-Optimized pricing.

Warning

Setting min ACU to 0.5 does not mean the database pauses. Aurora Serverless v2 has no auto-pause capability. The instance always consumes at least min ACU worth of resources and bills accordingly — 24/7. If you need true zero-cost idle periods, that feature existed only in v1 and is not available in v2.

Scaling Behavior: How Fast, How Fine-Grained

This is where Serverless v2 genuinely earns its name. Scaling happens in fine-grained increments (as small as 0.5 ACU steps) and occurs in near-real-time — typically within seconds of detecting demand. Aurora monitors CPU utilization, active connections, and internal engine metrics simultaneously. When any of these signals indicate the current capacity is insufficient, it begins scaling up immediately without pausing queries or dropping connections.

Compare this directly to v1:

Feature Serverless v1 Serverless v2
Scale-up speed 30 seconds – several minutes Seconds (near-instant)
Scale-down speed Slow, conservative Gradual, continuous
Minimum ACU 1 ACU 0.5 ACU
Maximum ACU 256 ACU (v1 units, different scale) 128 ACU
Auto-pause (scale to zero) Yes No
Reader endpoints No Yes
Multi-cluster coexistence No Yes (serverless + provisioned)
Global Database support No Yes
RDS Proxy support No Yes

Scale-down is intentionally conservative. Aurora will not immediately drop capacity the moment CPU drops — it observes a cooldown window to avoid thrashing on spiky but sustained workloads. This is generally desirable behavior; aggressive scale-down on a database that is about to receive another burst would be worse than holding a slightly higher capacity floor.

Configuration: Terraform Example

Here is a minimal Terraform snippet provisioning a Serverless v2 Aurora PostgreSQL cluster with one writer instance:

text
resource "aws_rds_cluster" "serverless" {
  cluster_identifier      = "myapp-serverless"
  engine                  = "aurora-postgresql"
  engine_mode             = "provisioned"   # v2 uses "provisioned" engine_mode
  engine_version          = "15.4"
  database_name           = "myapp"
  master_username         = "dbadmin"
  master_password         = var.db_password
  skip_final_snapshot     = false
  final_snapshot_identifier = "myapp-final"

  serverlessv2_scaling_configuration {
    min_capacity = 0.5
    max_capacity = 16
  }
}

resource "aws_rds_cluster_instance" "writer" {
  cluster_identifier = aws_rds_cluster.serverless.id
  instance_class     = "db.serverless"
  engine             = aws_rds_cluster.serverless.engine
  engine_version     = aws_rds_cluster.serverless.engine_version
}
Tip

Note that engine_mode is set to "provisioned" — not "serverless". The "serverless" engine mode refers to the legacy v1 path. Serverless v2 is enabled by setting instance_class = "db.serverless" on individual cluster instances combined with the serverlessv2_scaling_configuration block on the cluster.

Mixing Serverless and Provisioned Instances in One Cluster

One of the most powerful (and underused) patterns in Serverless v2 is the ability to mix instance types within a single Aurora cluster. A cluster can have a Serverless v2 writer alongside one or more provisioned read replicas, or vice versa.

A practical example: place a db.serverless writer with min=1, max=32 in front of write traffic that is genuinely variable, while maintaining a fixed db.r6g.2xlarge read replica for reporting workloads that need predictable, consistent memory. Both instances share the same Aurora distributed storage layer — no data synchronization lag introduced by the mixed topology.

This also unlocks a failover strategy: if your writer is Serverless v2 and a reader is provisioned, Aurora will promote the provisioned reader during a failover, giving you a fixed-size instance as the new writer until you restructure the cluster. Understand this before designing your failover runbooks.

CloudWatch Monitoring: ServerlessDatabaseCapacity

The critical metric for operating Serverless v2 is ServerlessDatabaseCapacity. This CloudWatch metric reports the current ACU value the instance is running at, updated approximately every minute. Use it to:

  • Validate your max ACU ceiling is not being hit continuously — if the metric is pegged at your maximum, your ceiling is too low and queries may be queuing.
  • Right-size your min ACU — if the metric rarely drops below 4 ACUs overnight, you may be paying for more minimum capacity than needed, or your minimum is set correctly to avoid scale-up lag during morning ramp.
  • Set billing alarmsACUUtilization (percentage of max consumed) combined with cost anomaly detection gives you early warning on runaway spend.
text
# Example: CloudWatch alarm when Serverless writer is pegged at max ACU
aws cloudwatch put-metric-alarm \
  --alarm-name "aurora-serverless-at-max-capacity" \
  --metric-name "ServerlessDatabaseCapacity" \
  --namespace "AWS/RDS" \
  --dimensions Name=DBInstanceIdentifier,Value=myapp-writer \
  --statistic Maximum \
  --period 300 \
  --evaluation-periods 3 \
  --threshold 16 \
  --comparison-operator GreaterThanOrEqualToThreshold \
  --alarm-actions arn:aws:sns:us-east-1:123456789012:db-alerts

RDS Proxy Integration

Serverless v2 is a natural fit for Lambda-driven workloads, but Lambda's concurrency model can trivially exhaust PostgreSQL's connection limit. Each Lambda execution opens a new connection; at scale this produces connection storms that overwhelm even a well-sized database.

RDS Proxy sits in front of the Aurora endpoint, maintains a persistent connection pool, and multiplexes thousands of application connections onto a smaller number of database connections. Serverless v2 supports RDS Proxy natively — something v1 could not do.

text
resource "aws_db_proxy" "app_proxy" {
  name                   = "myapp-proxy"
  debug_logging          = false
  engine_family          = "POSTGRESQL"
  idle_client_timeout    = 1800
  require_tls            = true
  role_arn               = aws_iam_role.rds_proxy_role.arn
  vpc_security_group_ids = [aws_security_group.db.id]
  vpc_subnet_ids         = var.private_subnet_ids

  auth {
    auth_scheme = "SECRETS"
    secret_arn  = aws_secretsmanager_secret.db_credentials.arn
    iam_auth    = "REQUIRED"
  }
}

resource "aws_db_proxy_default_target_group" "app" {
  db_proxy_name = aws_db_proxy.app_proxy.name

  connection_pool_config {
    max_connections_percent      = 90
    max_idle_connections_percent = 50
  }
}

resource "aws_db_proxy_target" "app" {
  db_proxy_name          = aws_db_proxy.app_proxy.name
  target_group_name      = aws_db_proxy_default_target_group.app.name
  db_cluster_identifier  = aws_rds_cluster.serverless.cluster_identifier
}

Use Cases: When Serverless v2 Wins

Variable SaaS workloads. Multi-tenant applications where each tenant's activity is unpredictable benefit directly from ACU scaling. The database adapts to aggregate demand rather than provisioning for peak-of-peaks across all tenants simultaneously.

Development and staging environments. A min=0.5, max=4 Serverless v2 instance costs a fraction of a fixed db.r6g.large when idle. Even without auto-pause, the cost savings during the 16+ hours per day that dev instances sit quiet are significant. Set an AWS Budget alert at $30/month per instance and let developers self-serve.

Event-driven and batch-adjacent architectures. Applications that receive predictable burst windows — end-of-day batch processing, scheduled report generation, nightly ETL — can burst to high ACUs during the window and scale back without manual intervention.

New applications with unknown load profiles. When you genuinely do not know what a production workload will look like, Serverless v2 lets the database find its own equilibrium rather than forcing you to right-size a provisioned instance before you have traffic data.

Limitations to Know Before You Commit

Warning

No auto-pause. This is the single most important limitation to internalize. Aurora Serverless v2 does not support pausing to zero like v1 did. A min=0.5 instance runs continuously and bills continuously. If you have a true zero-traffic window (overnight, weekends) and need $0 compute cost during that window, v2 is not the right tool. Consider scheduling instance stop/start via Lambda for those scenarios, or evaluate whether v1 still fits a narrow dev/test use case.

  • Storage auto-scaling behavior is shared with standard Aurora — Serverless v2 does not add any special storage scaling behavior beyond what Aurora already provides.
  • Performance Insights is supported but has some metric gaps compared to provisioned instances at very low ACU values.
  • Parameter groups have some constraints at minimum ACU levels — certain memory-intensive parameters (like shared_buffers overrides in PostgreSQL) may be capped by actual available memory at 0.5 ACU.
  • Maximum 128 ACU per instance. If your workload regularly exceeds what 128 ACU can provide, provisioned instances with explicit instance classes give you more predictable ceiling behavior.

Cost Model: When Does Serverless v2 Actually Save Money?

At time of writing, Aurora Serverless v2 pricing for PostgreSQL-compatible in us-east-1 is approximately $0.12 per ACU-hour (verify current pricing in the AWS pricing page — it varies by region and engine). Compare this to provisioned:

  • A db.r6g.large (2 vCPU, 16 GiB RAM) costs roughly $0.26/hour on-demand — equivalent to approximately 8 ACUs of memory headroom.
  • A Serverless v2 instance averaging 4 ACUs costs approximately $0.48/hour.
  • A Serverless v2 instance averaging 2 ACUs (light load) costs approximately $0.24/hour.

The crossover point where Serverless v2 becomes more expensive than a Reserved provisioned instance is typically around 50-60% sustained utilization of the equivalent provisioned instance size. If your database is busy 18+ hours per day at near-peak capacity, a 1-year Reserved provisioned instance will be cheaper. If your database is consistently idle for 8+ hours and spiky during the rest, Serverless v2 will typically win on cost.

Tip

Run your first month of Serverless v2 with Cost Explorer enabled and examine ACU-hour consumption by hour of day. This gives you the actual data needed to decide whether a Reserved provisioned instance would have been cheaper, or whether Serverless v2 is earning its keep. Most teams underestimate idle time; Serverless v2 almost always wins when idle time is honestly accounted for.

Key Takeaways

Key Takeaways
  • Aurora Serverless v2 scales compute in ACU increments (0.5 minimum, 128 maximum) in near-real-time — a fundamental improvement over v1's cold-start scaling behavior.
  • Set min_capacity and max_capacity on the cluster; assign db.serverless as the instance class — the engine_mode is still provisioned at the cluster level.
  • There is no auto-pause in v2. Minimum capacity always runs and always bills. Design cost controls around this constraint, not around the assumption that idle equals $0.
  • Serverless v2 and provisioned instances can coexist in the same cluster, enabling flexible writer/reader topologies and predictable failover behavior.
  • Monitor ServerlessDatabaseCapacity in CloudWatch; alarm when the metric is sustained at your configured maximum to detect capacity ceiling issues before they impact users.
  • Pair with RDS Proxy for Lambda or other high-concurrency connection sources to avoid connection exhaustion during ACU scale-out events.
  • Serverless v2 is cost-effective for variable, dev/test, and event-driven workloads; provisioned Reserved instances win on cost for consistently high-utilization, predictable workloads.

How JusDB Can Help

Choosing between Aurora Serverless v2, provisioned Aurora, and other managed database options involves workload-specific tradeoffs that generic documentation cannot fully address. JusDB's database comparison engine lets you model your actual traffic patterns — ACU consumption, hourly utilization, storage growth — against real AWS pricing data to produce a cost and performance projection before you migrate or re-architect.

Whether you are evaluating Aurora Serverless v2 for the first time, tuning an existing cluster's min/max ACU settings, or comparing Aurora against alternatives like AlloyDB, PlanetScale, or Neon for your next project, JusDB surfaces the data you need to make the call with confidence. Explore the Aurora comparison tools and database cost calculators at JusDB.com.

Share this article