Skip to content

RDS Migration

Date: February 2026 | Downtime: ~3 minutes

  1. Neon free tier quota exceeded — account locked, couldn’t even pg_dump
  2. Canadian data residency — Neon in US, RDS in ca-central-1 (Montreal)
  3. Cost predictability — Neon serverless billing unpredictable; RDS db.t4g.micro fixed ~$13/mo
  4. Fewer moving parts — eliminated auth-db Docker container

Before: Backend → Neon (US) + Auth → auth-db container (Docker)

After: Backend → RDS ca-central-1 (mealpal DB) + Auth → RDS ca-central-1 (auth DB)

Both databases on one RDS instance, accessed by separate users with separate privileges.

PropertyValue
Instancedb.t4g.micro (2 vCPU, 1GB RAM)
EnginePostgreSQL 16.10
Storage20GB gp3
EncryptionAWS KMS
Publicly AccessibleNo (VPC-only)
Backup7-day retention
Deletion ProtectionEnabled
  • asyncpg (Python): Use ssl=require in connect_args
  • pg (Node.js): Use DATABASE_SSL=true env var. Do NOT put sslmode=require in the URL — it conflicts with ssl: { rejectUnauthorized: false } in Pool config

RDS added ~$13/mo. Total AWS bill went from ~$22-25/mo to ~$35-38/mo.

All stored in AWS SSM Parameter Store:

Terminal window
aws ssm get-parameter --name "/mealpal/rds/connection-urls" \
--with-decryption --region ca-central-1