all posts

The best Amazon RDS alternatives in 2026

Ajay Kumar··10 min read

RDS is the database equivalent of buying the brand nobody gets fired for. It does backups, failover, minor-version patching, and encryption without anyone on your team owning those words, and it has done so reliably for well over a decade. That is worth real money.

It is also where a lot of infrastructure spend hides. A production instance, a standby for Multi-AZ, a staging instance that nobody sized down, three developer databases running 24/7, and storage that only ever grows because you cannot shrink a volume. None of it is unreasonable individually; together it is often the second-largest line on the bill after compute.

I build PandaStack, which includes managed Postgres, so treat the section about it accordingly. The rest of this is the comparison I'd want if I were doing the evaluation.

What you are actually giving up

Before shopping, be honest about which RDS properties you depend on. Most migrations that go badly do so because one of these was assumed rather than checked:

  • VPC-local networking. Your app talks to the database over a private subnet with a security group, and no traffic crosses the internet. Most alternatives connect over TLS from anywhere, which is fine but is a different security review.
  • IAM authentication and KMS-managed encryption keys. If your compliance story names these, moving is a policy exercise, not a technical one.
  • Extension availability. RDS supports a specific extension list; so does everyone else, and the lists differ. If you use PostGIS, pgvector, timescaledb, or a niche extension, check it first, not last.
  • Read replicas and connection scale. RDS gives you an instance with a fixed connection limit and replicas you provision. Serverless-shaped alternatives handle this very differently, usually with a pooler in front.
  • The blast radius you already accept. RDS restores are slow but well understood. A faster restore path is only better if it is also as well tested.

The alternatives worth evaluating

Aurora and Aurora Serverless — staying inside AWS

If the objection is performance or scaling rather than AWS itself, Aurora is the incremental move: storage is decoupled from compute, replicas are cheap to add, and failover is faster than classic Multi-AZ. Aurora Serverless scales capacity with load, which helps spiky workloads and does very little for a steady one. It is not usually the cheaper option, and "serverless" here means elastic capacity, not scale-to-zero economics for a dev database.

Neon — when branching is the point

Neon separates storage and compute and gives you copy-on-write database branches, which is genuinely transformative for preview environments: every pull request gets a full copy of production data structure without a full copy of production storage. Compute scales to zero when idle. The trade-offs are the ones inherent to the architecture — cold starts on the first query after idle, and a storage layer that is Neon's rather than plain Postgres on a disk.

Supabase — when you want more than a database

Supabase is Postgres plus auth, storage, realtime, and generated APIs. If you're building an application from scratch and would otherwise assemble those yourself, it removes a lot of work. If you only want the database, you are adopting a platform to get one component of it, and the platform will shape your schema decisions more than you expect.

Crunchy Bridge and Timescale — the Postgres specialists

Both are run by people who are deeply serious about Postgres specifically. Crunchy Bridge is close to "plain excellent Postgres, managed", which is exactly right if you want no architectural surprises. Timescale is the answer when your workload is time-series-shaped and you'd otherwise be building partitioning and rollups yourself.

Self-hosted on EC2 or Kubernetes — cheapest, and you pay in attention

Running Postgres yourself with an operator like CloudNativePG is dramatically cheaper on paper and entirely reasonable if someone on the team genuinely knows Postgres operations. The cost is not the setup; it is the 03:00 page during a failover and the day you discover your backups restore but your point-in-time recovery does not.

PandaStack — one Postgres per microVM, sleeping when idle

PandaStack runs each managed database as PostgreSQL 16 in its own Firecracker microVM with a durable volume, rather than as a tenant in a shared cluster. That gives hard isolation between databases and per-database failover. Idle databases auto-suspend and bill storage only, then wake on connection, which is aimed squarely at the dev and staging instances that make up most of an RDS bill. Backups, point-in-time recovery, and cross-host failover are included in the tier rate rather than priced separately.

Where it is not the answer: extreme write throughput, very large datasets, read-replica fan-out, or anything needing an AWS-native VPC-private connection. Tiers are RAM-based (1, 4, and 16 GiB), so if your working set is far past that, this is not your platform yet.

# Create a database, then clone it to a point in time for a debugging session
pandastack db create --label staging --size 4g

# A clone is a NEW database built from the source's archive — the original
# keeps serving traffic while you dig through yesterday's data
pandastack db clone <db-id> --label bug-repro --target-time 2026-08-19T14:30:00Z

The migration, in the order that hurts least

  1. Inventory extensions and server settings first. pg_dump does not carry your parameter group. Compare shared_buffers, work_mem, statement_timeout, and the extension list before you move a byte.
  2. Move a non-production database first and run your real integration suite against it, not a smoke test. Connection-limit and pooler behaviour only shows up under concurrency.
  3. Use logical replication for the cutover if downtime matters. Dump-and-restore is fine for a 10 GB dev database and unacceptable for a production one; logical replication lets you sync continuously and cut over in seconds.
  4. Re-point secrets, not code. If your application reads a connection string from one place, the cutover is a config change. If it is hard-coded in three services, fix that before migrating, not during.
  5. Keep the old database running, read-only, for a week. The cost of a week of RDS is trivial against the cost of discovering a missing table with no rollback path.
Check how your new provider handles connection limits before cutover. Postgres connections are expensive everywhere, and a platform that gives you a small instance with a pooler in front behaves very differently under a serverless app that opens a connection per invocation.

Where the savings actually are

For most teams, the production database is not the problem. It is the non-production estate: staging, three developer databases, a preview database per environment, and the demo instance from a launch two years ago. Those are up 24/7, doing nothing 90% of the time, and billed as if they were serving traffic.

So the highest-value change is usually not migrating production at all. It is moving everything else to something that either sleeps when idle or is cheap enough to be disposable, and leaving the production database exactly where it is until you have a reason beyond price. That is a one-week project with an obvious payback, rather than a quarter-long migration with a risk profile your team will feel every night.

Frequently asked questions

Is Aurora cheaper than RDS?

Rarely on the instance price, sometimes on the total. Aurora's storage is billed for what you actually use and grows automatically, so you stop over-provisioning volumes, and replicas share storage rather than duplicating it, which makes read scaling much cheaper than adding RDS read replicas. Against that, Aurora's I/O charges can surprise a write-heavy workload, and the compute rates are higher. The workloads where Aurora clearly wins on cost are ones with several read replicas or highly variable storage; a single modest instance with steady traffic is usually cheaper on plain RDS.

What is database branching and do I need it?

Branching gives every developer or pull request its own copy-on-write copy of the database, so a schema migration or a destructive test runs against realistic data without a full storage copy. You need it if your bugs are data-shaped — migrations that pass on an empty schema and fail on production data, or tests that need realistic rows to be meaningful. You do not need it if a seeded fixture database is genuinely representative of production, which is more often true for small applications than the marketing for branching suggests.

Can I keep my database in a private network on these platforms?

It varies, and it is the question most likely to end an evaluation. RDS lives in your VPC by default with no public endpoint. Most managed alternatives expose a TLS endpoint on the public internet, some add IP allowlists, and a few offer private connectivity such as PrivateLink or peering on higher tiers. If your security policy requires that database traffic never traverse the public internet, filter your shortlist on that requirement first — TLS with certificate verification satisfies many auditors, but not all of them, and finding out late wastes the entire evaluation.

How risky is moving Postgres between providers?

Lower than moving between database engines, and higher than most people plan for. The data moves cleanly because Postgres has good logical replication and a stable dump format. What breaks is everything around the data: extensions that are not available, server parameters that were tuned years ago and never documented, roles and grants that dump differently than you expect, and application connection behaviour under a pooler that was not there before. Budget for a full test cycle against the new database under production-like concurrency, and the actual data move will be the easy part.

What does auto-suspend do to my first query?

It adds the wake time to it. The implementations differ enormously: some resume a paused process in a second or two, some rebuild compute from a snapshot, some need to reattach storage. For a development database, waiting a few seconds after a coffee break is a non-issue and the cost saving is large. For anything user-facing, either keep it always on or make sure your connection layer retries the first query gracefully, because the alternative is a user seeing a timeout that only happens after quiet periods and is therefore nearly impossible to reproduce.

Keep reading

Run code in a microVM in one API call.

49ms p50 cold start. Fork, snapshot, and scale to zero.

Start free
Written by Ajay Kumar, Founder, PandaStack.