AWS RDS for PostgreSQL and Aurora
Choose between Amazon RDS for PostgreSQL and Aurora PostgreSQL-Compatible by compatibility boundary, failover behavior, connection limits, and cost model — checked 2026-08.
AWS offers two managed paths for PostgreSQL workloads, and they are not the same product. Amazon RDS for PostgreSQL runs the community engine as a managed instance. Aurora PostgreSQL-Compatible is a PostgreSQL-compatible engine on AWS-built distributed storage, managed as a cluster rather than a server. Drivers and most SQL work on both; parameters, extensions, failover, and billing do not behave identically. For the cross-provider view, see the cloud service map.
When each one fits
RDS for PostgreSQL is the default choice when:
- you want behavior as close to community PostgreSQL as a managed service allows;
- one primary with an optional Multi-AZ standby and read replicas meets your availability target;
- storage stays comfortably below the 64 TiB ceiling and you prefer provisioned, predictable sizing.
Aurora PostgreSQL-Compatible earns its price when:
- you need faster failover and read scaling across up to 15 Aurora Replicas that share one cluster volume;
- storage should grow automatically in 10 GiB increments instead of being provisioned, up to 256 TiB;
- you accept an engine with its own release cadence, versioning scheme, and extension allowlist.
This is not a ranking. Both are managed services without host access, and the right answer depends on your measured failover, connection, and cost requirements.
RDS and Aurora side by side
| RDS for PostgreSQL | Aurora PostgreSQL-Compatible | |
|---|---|---|
| Storage | Provisioned EBS (gp3/io2), up to 64 TiB | Shared cluster volume, auto-grows to 256 TiB, six copies across three AZs |
| Replicas | Read replicas with independent storage, physical replication | Up to 15 Aurora Replicas sharing the cluster volume, typically low replica lag |
| Failover | Multi-AZ standby promotion, documented as typically 60–120 seconds | Typically tens of seconds when a reader is available; measure it yourself |
| Backup | Automated snapshots plus WAL, PITR within the retention window | Continuous backup with PITR inside the retention window |
| Engine versions | Community majors per the RDS release calendar | Aurora's own release cadence and version numbering |
| Extensions | Platform allowlist | Separate extension support matrix |
| Cost model | Instance plus provisioned storage | Instance plus consumed storage plus I/O requests; typically higher than RDS for the same workload |
Checked 2026-08
The ceilings above come from the RDS storage documentation and the Aurora overview, checked on 2026-08-06. Documented ceilings are not SLA commitments for your workload — model costs in the RDS and Aurora pricing pages, and rehearse failover before relying on either number.
Differences to accept
max_connectionsis computed differently on Aurora. The default isLEAST({DBInstanceClassMemory/9531392}, 5000)— a 16 GiB instance lands around 1,800 connections, and the cap is 5,000 regardless of instance size. High-concurrency applications need RDS Proxy or PgBouncer in front of either service; see the Aurora parameter reference.- Extension availability is a per-engine allowlist. Extensions that work on RDS, such as
pg_repack, may be missing or version-pinned on Aurora. Diff yourpg_extensionlist against the Aurora support matrix before migrating, not after. - Aurora is managed as a cluster. Some parameters apply cluster-wide, some system views and wait events differ from community PostgreSQL, and storage is billed by consumption plus I/O requests rather than provisioned capacity.
- Neither service gives host or superuser access.
rds_superuseris a reduced role; anything requiring OS access, arbitraryshared_preload_libraries, or untrusted languages is out of scope on both.
Validate before production
- Diff installed extensions and their exact versions against the target engine's allowlist.
- Run a real failover drill and time the application's reconnection behavior, not just the DNS flip.
- Size the connection budget from
max_connections, then decide on RDS Proxy or PgBouncer and its pooling mode. - Perform a PITR restore into a fresh instance or cluster and measure actual RPO/RTO.
- Model cost with realistic I/O — Aurora bills I/O requests separately, which surprises workloads migrating from provisioned RDS storage.
- Export once with
pg_dumpor snapshot export and restore into an independent PostgreSQL environment as an exit-path test.
For connection pooling, backup drills, and monitoring baselines that apply regardless of provider, see the production stack guide. If you only need a development or evaluation database, the free PostgreSQL guide covers zero-cost alternatives.
Last updated on
Cloud PostgreSQL service map
Understand mainstream managed and developer platforms through verified capability boundaries
Neon serverless PostgreSQL
When Neon's separated compute/storage, scale-to-zero, and database branching fit your workload — plus the limits to validate before production, checked 2026-08.