Migration

Amazon RDS to Supabase migration: why teams consolidate their AWS stack

Amazon RDS to Supabase

Why teams stop stitching Cognito, S3, and API Gateway together by hand — and what actually happens to your database, auth, and API layer along the way.

Amazon RDS is, at its core, a very good managed Postgres instance — and nothing more. That’s not a criticism; it’s the design. RDS handles provisioning, patching, and backups for your database and stops there. Everything else a real application needs — authentication, file storage, an API layer, realtime updates — has to be assembled separately, usually from other AWS services that each come with their own console, their own pricing model, and their own operational overhead.

That gap is what usually starts the conversation about an Amazon RDS to Supabase migration. This guide covers why teams make the move, what actually changes technically, and how complex the process really is — based on the patterns we see across migrations at Gart Solutions.

TL;DR
  • RDS is just a managed Postgres instance — Auth, Storage, and an API layer all have to be built and billed separately, typically via Cognito, S3, and API Gateway.
  • Assembling those three services means three consoles, three IAM configurations, and three places costs can quietly grow.
  • Teams want one bill and one dashboard instead of stitching together a backend from separate AWS primitives.
  • Migration complexity is low: both platforms are standard Postgres, and the official path is pg_dump / psql. The real work isn’t moving data — it’s rebuilding the Auth and API layer.
  • Gart Solutions plans and executes migrations of any complexity — from Amazon RDS specifically, and from the wider Postgres and BaaS ecosystem more broadly.

Why teams are leaving RDS for Supabase

RDS is just managed Postgres — nothing else is included

RDS gives you a database: provisioning, automated backups, patching, multi-AZ failover if you want it. It does not give you user authentication, file storage, or an API layer — those are separate products, separate bills, and separate integration work. For a team that just wants “a backend,” RDS alone is the database layer of a backend, not the backend itself. Everything else has to be built on top, from scratch, using other services.

Cognito + S3 + API Gateway, stitched together by hand

The typical way teams fill that gap is Cognito for authentication, S3 for file storage, and API Gateway (often with Lambda resolvers, or AppSync for GraphQL) as the API layer in front of RDS. Each of those is a capable service on its own. The cost is integration: three IAM policies to get right, three sets of client SDKs to wire into the frontend, three services to monitor when something breaks, and business logic that ends up scattered across Lambda functions instead of living close to the data it operates on.

None of this is exotic — it’s the standard AWS-native backend pattern, and plenty of production systems run on exactly this stack successfully. But it’s meaningfully more moving parts than a team building an MVP, or a small platform team maintaining an existing product, necessarily wants to own.

One bill, one dashboard, instead of three services

This is less a technical argument than an operational one, but it’s usually the reason the migration actually gets scheduled: Cognito, S3, and API Gateway show up as three separate line items with three separate pricing models, and reasoning about “what does our backend cost” means adding across services that don’t share a billing dashboard. Supabase collapses the same functional surface — Postgres, Auth, Storage, and an API layer — into one project, one dashboard, and one bill. For teams whose actual complaint isn’t “AWS is bad” but “we’re maintaining glue code between three services to do what should be one thing,” that consolidation is the point.

What actually happens during an RDS to Supabase migration

The database itself: the easy part

This is the good news, and it’s worth saying plainly: because RDS and Supabase are both standard Postgres, the database migration itself is mechanically simple. There’s no NoSQL-to-relational redesign, no schema reinvention — your tables, types, indexes, and constraints move over largely as-is. The official path is pg_dump and psql (or pg_restore for the custom-format dump), the same tooling every Postgres DBA already knows:

# Dump the RDS database
pg_dump -h my-instance.xxxxxxxxxx.us-east-1.rds.amazonaws.com \
  -U postgres -d mydb -Fc -f mydb.dump

# Restore into Supabase
pg_restore -h db.xxxxxxxxxxxx.supabase.co -U postgres \
  -d postgres --no-owner --no-privileges mydb.dump

For larger databases or migrations that need to run with minimal downtime, AWS Database Migration Service (DMS) or logical replication can keep the source and destination in sync during a staged cutover instead of relying on a single dump-and-restore window. Either way, the data itself isn’t the hard part of this migration — the surrounding services are.

Auth: Cognito can’t export password hashes, so plan for a live migration

This is the detail that catches teams off guard, because it’s easy to assume Auth migration works the way it does when leaving Firebase — export the hashes, import them, done. Cognito doesn’t allow password hash export, by design: AWS explicitly restricts access to the underlying SRP verifiers for security reasons, so there’s no file you can pull down and hand to another system.

The standard workaround, and the one we use, is a just-in-time migration pattern: when a user signs in for the first time after cutover, an Edge Function checks whether they already exist in Supabase Auth. If not, it verifies their credentials against Cognito directly (using Cognito’s own authentication API), and on success, creates the equivalent user in Supabase Auth with that now-verified password. The user experiences a normal login — no forced password reset — and the migration happens gradually, one authenticated sign-in at a time, instead of all at once. Users who never sign in again during the transition window are the only ones who eventually need a password reset, and that’s a policy decision (how long to run dual-auth) rather than a technical limitation.

Storage: S3 to Supabase Storage is close to a direct copy

This part is genuinely simple, and it’s worth calling out because it’s not always obvious: Supabase Storage exposes an S3-compatible API. That means standard S3 tooling — the AWS CLI, rclone, Cyberduck — can talk to Supabase Storage directly, which makes bulk-copying objects out of an existing S3 bucket and into Supabase close to a lift-and-shift rather than a rebuild. The part that needs actual engineering attention is access control: S3 bucket policies and IAM rules need to be re-expressed as Supabase Storage RLS policies, which — same as with the database — live in SQL rather than a separate policy language.

API layer: replacing API Gateway and Lambda resolvers

This is usually where the real engineering effort in an RDS migration lives. Supabase generates REST and GraphQL APIs directly from your Postgres schema, which means a meaningful share of what a typical API Gateway + Lambda setup exists to do — expose CRUD operations over the database — is simply already there once the schema and RLS policies are in place. Custom business logic that lived in Lambda resolvers (calculations, third-party API calls, multi-step workflows) needs to be ported to Supabase Edge Functions, but the boilerplate CRUD layer that usually makes up the bulk of an API Gateway configuration often disappears entirely rather than needing a rewrite.

How complex is an Amazon RDS to Supabase migration, really?

Component Complexity Why
Database (schema + data) Low Both platforms are standard Postgres; official path is pg_dump/psql or pg_restore
Authentication Moderate Cognito can’t export password hashes; requires a just-in-time migration pattern via Edge Function
Storage Low Supabase Storage is S3-compatible; standard S3 tools work directly, only access-control policies need rewriting
API layer Low–Moderate Generated REST/GraphQL APIs replace most CRUD-layer Lambda resolvers; custom business logic ports to Edge Functions

Overall: low. Unlike a NoSQL-sourced migration, there’s no data-model redesign here — the database layer moves with well-understood, decades-old tooling. The work that remains is replacing three separate AWS services with Supabase’s equivalents, which is real engineering effort, but it’s integration work with documented patterns on both ends, not open-ended architecture design.

Common pitfalls we see

  • Assuming pg_dump handles everything. Postgres extensions enabled on your RDS instance aren’t automatically available on the destination — they need to be checked and enabled explicitly. The same goes for custom types, sequences owned by specific roles, and any objects that depended on RDS-specific superuser workarounds.
  • Expecting Cognito to migrate like Firebase Auth. Teams that have done a Firebase migration before sometimes assume the same hash-export approach will work for Cognito. It won’t — plan for the just-in-time migration pattern from the start, not as a fallback discovered mid-project.
  • Underestimating how much logic lives in Lambda resolvers. API Gateway configurations often accumulate business logic well beyond simple CRUD over the years. Auditing what’s actually in each resolver — not just what the API Gateway console shows as routes — is necessary before deciding what maps to a generated API versus what needs a dedicated Edge Function.
  • Ignoring VPC and networking setup. RDS instances are frequently deployed inside a private VPC with tightly scoped security groups. Connection pooling, IP allowlisting, and networking need to be planned deliberately for the new setup, especially for self-hosted Supabase deployments that need to sit inside a client’s own cloud environment.

A quick pre-migration checklist

  • How many Postgres extensions and custom types does your RDS instance use? Each one needs to be confirmed as available (or replicated) on the destination before cutover.
  • What proportion of your Lambda resolvers are pure CRUD versus custom business logic? This determines how much of your API Gateway layer disappears automatically versus needs to be rebuilt as Edge Functions.
  • How long can you realistically run Cognito and Supabase Auth in parallel during a just-in-time user migration? This is a policy decision, not a technical one, and it determines how many users you’ll eventually need to force through a password reset.
  • Is your RDS instance inside a private VPC? If so, networking and connection pooling need to be part of the migration plan from day one, not an afterthought during cutover.
  • Does your team need self-hosted Supabase inside your existing AWS account, or is moving to Supabase Cloud acceptable? This materially changes the infrastructure side of the project.

🔄 Untangling Cognito, S3, and API Gateway into one platform?

Gart Solutions runs zero-downtime cloud migrations for teams consolidating their AWS backend onto Supabase — including the Auth cutover pattern and Edge Function rebuilds.

How Gart Solutions approaches these migrations

An Amazon RDS to Supabase migration is deceptively named — the database part is genuinely low-effort, but the project as a whole touches identity, storage access control, and API architecture across three separate AWS services. Our process typically covers:

  • Database migration — pg_dump/pg_restore or DMS-based logical replication for larger, minimal-downtime cutovers
  • Just-in-time Auth migration — an Edge Function-based bridge that migrates Cognito users on sign-in without forcing password resets
  • Storage transfer — bulk-copying S3 objects into Supabase Storage via S3-compatible tooling, with IAM policies rebuilt as RLS
  • API layer rebuild — auditing Lambda resolvers to separate what the generated API replaces from what needs to become an Edge Function

Just as important: we handle migrations of any level of complexity, not only from Amazon RDS. The same team that untangles a Cognito/S3/API Gateway stack also runs migrations from Firebase, Neon, Heroku, Render, and legacy MySQL or MSSQL databases onto Supabase — and, where it’s the right call for a client, migrations away from Supabase too. Whatever the source, the underlying question is the same: what’s the safest path from where your data and identity layer are now to where they need to be, without breaking production along the way.

Conclusion

RDS does one thing well — it’s a solid managed Postgres instance — and stays the right choice for teams who specifically want just the database and nothing else. But once “just the database” means stitching Cognito, S3, and API Gateway together by hand, and the actual complaint is operational overhead rather than database performance, an Amazon RDS to Supabase migration solves a real problem. The database migration itself is low-effort, well-tooled Postgres-to-Postgres work; the actual project is consolidating three AWS services into one platform without disrupting the users and data that depend on them.

Planning a Supabase or Postgres migration?

Gart Solutions’ database migration engineers plan and execute Postgres migrations — into Supabase, within a live schema, or off a managed platform entirely — with a rollback plan built in from day one, not bolted on after something breaks.

40% cost reduction on a comparable Postgres migration
25% query performance improvement
Minimal downtime during cutover
Database Migration Cloud Migration SRE & Monitoring Compliance Audit
Talk to a migration engineer  →
Let’s work together!

See how we can help to overcome your challenges

FAQ

Is it hard to migrate from Amazon RDS to Supabase?

The database migration itself is low-complexity — both platforms are standard Postgres, and the official path is pg_dump/psql or pg_restore, tooling most Postgres teams already know. The real effort is in replacing the surrounding AWS services: Cognito needs a just-in-time Auth migration, and API Gateway/Lambda resolvers need to be split between what Supabase's generated APIs replace and what becomes a custom Edge Function.

Can I migrate Cognito users to Supabase Auth without forcing a password reset?

In most cases, yes, but not through a direct export — Cognito doesn't allow password hash export by design. The standard approach is a just-in-time migration: an Edge Function verifies each user's credentials against Cognito at their next sign-in and creates the equivalent Supabase Auth user on success, so most users never notice the migration happened. Users who don't sign in during the transition window eventually need a password reset.

Does Supabase support the Postgres extensions my RDS instance uses?

Supabase supports a wide range of standard Postgres extensions, but availability isn't universal, and it's worth confirming explicitly rather than assuming. This is one of the first things to check during migration planning — it's a quick audit, but an extension your application depends on silently not being available is the kind of surprise you want to catch weeks before cutover, not during it.

Can I migrate a large RDS database with minimal downtime?

Yes. For databases where a single pg_dump/restore window isn't acceptable, AWS Database Migration Service or Postgres logical replication can keep the RDS source and Supabase destination in sync continuously, so cutover becomes a brief traffic switch rather than an extended maintenance window.

Is Supabase Storage really compatible with S3?

Yes — Supabase Storage exposes an S3-compatible API, so standard S3 clients like the AWS CLI, rclone, and Cyberduck can interact with it directly. That makes migrating files out of an existing S3 bucket closer to a bulk copy operation than a rebuild, though bucket-level access control still needs to be re-expressed as Supabase Storage RLS policies.

What happens to my API Gateway and Lambda resolvers?

Resolvers that are essentially CRUD operations over your database are often replaced entirely by Supabase's auto-generated REST and GraphQL APIs, once your schema and RLS policies are in place. Resolvers containing genuine custom logic — calculations, third-party integrations, multi-step workflows — need to be ported to Supabase Edge Functions. Auditing which is which is a necessary early step, not something to discover mid-migration.

How long does an RDS to Supabase migration take?

The database migration itself can often happen in days. The bulk of the timeline is usually the Auth just-in-time migration window (which can run for weeks by design, to catch inactive users gradually) and the API layer rebuild. Gart Solutions scopes this during an initial technical audit, based on how much custom logic lives in your Lambda resolvers and how many Cognito users you have.

Can Gart Solutions handle migrations involving other AWS services beyond RDS, Cognito, and S3?

Yes. AWS backends often accumulate additional services beyond the core three — SQS for queuing, SNS for notifications, EventBridge for scheduled jobs — and each one needs its own migration decision (replicate as a Supabase Edge Function and Postgres trigger, keep running alongside Supabase, or retire entirely). We scope this as part of the initial technical audit rather than assuming a one-size-fits-all replacement.

What other platforms can Gart Solutions help migrate to or from Supabase?

Beyond Amazon RDS, we regularly handle migrations from Firebase, Neon, Heroku, Render, and legacy MySQL or MSSQL databases onto Supabase, as well as migrations away from Supabase when that's the right call for a client's scale or compliance needs. The common thread is the same engineering discipline: a tested cutover plan, careful handling of identity data, and no surprises in production.
arrow arrow

Thank you
for contacting us!

Please, check your email

arrow arrow

Thank you

You've been subscribed

We use cookies to enhance your browsing experience. By clicking "Accept," you consent to the use of cookies. To learn more, read our Privacy Policy