database

Amazon RDS

Managed relational database — MySQL, PostgreSQL, Oracle, SQL Server, or Aurora, without managing the host. Here's what RDS is good for, what it costs, how it connects to EC2 and Lambda, and the mistakes Design Beaver catches as you draw.

Updated July 12, 2026

What RDS is

RDS runs a standard SQL engine — MySQL, PostgreSQL, MariaDB, Oracle, SQL Server, or Aurora — as a DB instance inside a VPC. AWS handles the host underneath: patching, backups, storage provisioning, and, if you turn it on, Multi-AZ failover. You still get a normal SQL endpoint, so the same client tools and drivers you’d use against a self-managed database work here. What you don’t get is OS-level access to the box — that’s a separate, narrower product called RDS Custom. It’s the default choice when an application needs real relational structure rather than a key-value or document model.

Because an RDS instance lives inside a subnet’s IP space in a VPC, Design Beaver models it as VPC-resident and validates as you draw which services can reach it and what each connection has to be set up to be correct.

When to use RDS (and when not to)

Reach for RDS when you need real SQL — joins, transactions, foreign keys — and you want automated backups, patching, and optional failover without managing the database host yourself. It’s the right call when the app already speaks a standard engine’s wire protocol and migrating off it isn’t practical, and when a production workload needs high availability through a Multi-AZ deployment.

Don’t reach for it when the workload is extremely high, unpredictable request-rate traffic that suits DynamoDB’s scaling model better. It’s also the wrong tool when you need direct OS-level access to the database host — that’s RDS Custom or a self-managed EC2 database, not standard RDS — or when you’re doing simple key-value lookups with no relational structure, where a managed NoSQL store is usually simpler and cheaper.

Variants: the engine, not the instance size

The real choice with RDS is the database engine, not the instance class. Open-source engines, commercial engines, and AWS’s own Aurora each change what you get and what you pay.

OptionWhat it is
MySQLWidely used open-source engine; broad tooling and driver compatibility.
PostgreSQLOpen-source engine with strong extension ecosystem (PostGIS, pgvector, etc.) and standards compliance.
MariaDBMySQL-compatible fork; drop-in for most MySQL workloads.
OracleCommercial engine; license-included or bring-your-own-license (BYOL) models available.
Microsoft SQL ServerCommercial engine; Express/Web/Standard/Enterprise editions, license-included or BYOL.
Aurora MySQL-CompatibledefaultAWS's own storage-and-compute-decoupled engine, wire-compatible with MySQL; higher throughput and faster failover/replica creation than standard RDS MySQL.
Aurora PostgreSQL-CompatibleSame Aurora architecture, wire-compatible with PostgreSQL.
Db2IBM Db2 engine, BYOL licensing only.

RDS pricing

You pay per DB-instance-hour, plus storage, optional provisioned IOPS, backup storage beyond the free allotment, and data transfer — and the engine you pick moves the number more than the instance size does.

Pay per DB-instance-hour (billed per-second, 10-minute minimum), plus storage per GB-month, provisioned IOPS if used, backup storage beyond the free allotment, and data transfer. Rates vary significantly by engine (license-included engines like Oracle/SQL Server cost more than open-source engines), instance class, and Single-AZ vs Multi-AZ deployment (Multi-AZ roughly doubles compute cost since it runs a standby).

OptionRepresentative rate
mysqldb.t4g.micro (burstable, Graviton): ~$0.016/hr on-demand, Single-AZ
postgresqlComparable to MySQL for equivalent instance classes
sqlserverLicense-included editions cost substantially more than open-source engines at equivalent instance sizes
aurora-mysqlAurora pricing is structured separately (per-ACU for Serverless v2, or per-instance for provisioned) — see aws.amazon.com/rds/aurora/pricing/

Keeping the bill down

  • Use Reserved Instances for steady-state production workloads for meaningful savings over on-demand
  • Use Graviton-based instance classes (db.t4g/db.m6g/db.r6g) where the engine supports them for better price-performance than equivalent x86 classes
  • Right-size instance class to actual CPU/memory usage rather than over-provisioning for peak

us-east-1 (rates vary by region). Rates as of 2026-07. Verify at the official pricing page before using for real cost estimates — this list is not kept in sync with AWS pricing changes, and per-instance-class rates were not fully confirmed against a live pricing table in this research pass.

How RDS connects to other services

RDS is a target, not an initiator — EC2 and Lambda connect into it. What matters on each of those edges is the requirement that makes it actually work: same-VPC placement, a security-group-scoped inbound rule on the DB port, and — for Lambda — a proxy in front. Design Beaver models each connection so it knows what belongs on it.

  • EC2

    An EC2 instance (e.g. running an app server) connects to RDS as its application database — the canonical two-tier web app pattern

  • A Lambda function connects to RDS as its application database, typically for a serverless API backed by a relational store

  • ECS

    A containerized application running as an ECS task (on Fargate or EC2) connects to RDS as its relational database — the container equivalent of the EC2 app-tier-plus-managed-database pattern

  • App Runner

    An AWS App Runner service connects to a private RDS database as its data layer, reaching it over the VPC through an App Runner VPC connector

  • RDS Proxy

    RDS Proxy maintains a warm pool of connections to this DB instance and routes client queries through it, smoothing bursty connection churn from serverless/autoscaling clients and speeding failover

What RDS can’t connect to

Some edges look reasonable on a canvas but aren’t real AWS integrations — a database isn’t a CloudFront origin, a Route 53 target, or an ALB backend. Design Beaver flags them instead of letting you draw a diagram that can’t be built.

  • S3

    RDS does not connect out to S3 as an architectural edge — there's no native direct integration in that direction. Data movement between them (e.g. Aurora's S3 import/export or MySQL's S3 integration for loading/saving data) is an engine feature invoked by SQL/API calls, not a drawable connection.

  • CloudFront is an HTTP(S) edge cache/CDN in front of an origin — it has no direct database client relationship; RDS is never a CloudFront origin.

  • Not a valid DNS alias target and not something a domain resolves to directly — Route 53 points browsers at HTTP(S) origins like CloudFront, S3, ALB, or API Gateway, never at a database instance.

  • Peer database services, not architecturally wired to each other — an application may use both, but there's no native direct connection between an RDS instance and a DynamoDB table.

  • ALB is a layer-7 HTTP(S) load balancer that routes to registered targets over HTTP(S) — it has no database wire protocol client relationship and never has an RDS instance as a backend target. The EC2 tier behind the ALB connects to RDS, not the ALB itself.

Anti-patterns Design Beaver catches

These are the RDS mistakes that pass a diagram review but break under load or expose the database — the ones the validation engine flags as you draw.

Lambda functions connecting directly to RDS with no RDS Proxy in front, under meaningful concurrency

Why it breaksEach concurrent Lambda execution can hold its own DB connection; traffic spikes can exceed the database's connection limit and cause connection errors application-wide

Do this insteadPut RDS Proxy between Lambda and the DB instance to pool and share connections

Treating Multi-AZ as a read-scaling feature

Why it breaksA Multi-AZ DB instance deployment's standby exists purely for failover and does not serve read traffic — it's a distinct concept from read replicas

Do this insteadUse read replicas for read scaling; use Multi-AZ (instance or cluster deployment) for high availability/failover. The two are complementary, not substitutes.

Publicly accessible RDS instance used only by resources inside the same VPC

Why it breaksUnnecessarily exposes the database to the internet when only private connectivity is needed

Do this insteadKeep Public access off and place the instance in private subnets, reached via security-group rules from the app tier

Gotchas that bite in production

  • Multi-AZ is not a read-scaling feature. A Multi-AZ DB instance deployment has one standby that exists purely for failover — it does not serve read traffic. Read replicas are the separate mechanism for read scaling. Don’t conflate the two. (A Multi-AZ DB cluster deployment, the newer two-standby variant, can serve reads from its standbys, but that’s a distinct configuration.)
  • Lambda → RDS without RDS Proxy is a known failure mode. Lambda can scale to hundreds or thousands of concurrent execution environments in seconds, each holding its own connection. RDS has a fixed connection limit, so a spike can exhaust it and throw connection errors across the whole application. RDS Proxy sits between Lambda and RDS, pooling a much smaller number of real connections, and it preserves app-side connections through a Multi-AZ failover.
  • EC2 → RDS deliberately skips RDS Proxy. An EC2 app server holds a small, steady pool of long-lived connections rather than opening a new one per invocation, so it doesn’t hit the same connection-exhaustion problem. If you see EC2 → RDS with no proxy in front, that’s the expected shape, not a missing piece.
  • Use security groups, not raw CIDR blocks, to allow app-tier access. The RDS security group’s inbound rule should reference the EC2 or Lambda security group directly rather than an IP range — that’s what keeps the rule working as instances are replaced.
  • A DB subnet group needs subnets in at least two Availability Zones, even for a Single-AZ deployment. That’s what lets you convert to Multi-AZ later without rebuilding the subnet group.

Further reading

Frequently asked questions

When should you use Amazon RDS?
Use RDS when your application needs real SQL — joins, transactions, referential integrity — rather than a key-value or document model, and you want automated backups, patching, and optional Multi-AZ failover without running the database host yourself. It's a poor fit for very high, unpredictable request rates where DynamoDB's scaling model fits better, for workloads that need OS-level host access (use RDS Custom or a self-managed EC2 database), or for simple key-value lookups with no relational structure.
How do you connect Lambda to RDS correctly?
Put the Lambda function inside the same VPC as the RDS instance, allow inbound traffic from the Lambda security group on the DB port, and route through RDS Proxy rather than connecting directly. Lambda can scale to hundreds or thousands of concurrent execution environments in seconds, each holding its own database connection, so without a proxy to pool connections a traffic spike can exhaust the database's connection limit. Design Beaver flags direct Lambda → RDS under concurrency as an anti-pattern.
Is Multi-AZ a read-scaling feature for RDS?
No. A Multi-AZ DB instance deployment's standby exists purely for failover and does not serve read traffic — it's a distinct concept from read replicas. Use read replicas for read scaling and Multi-AZ for high availability. The two are complementary, not substitutes.
Can RDS connect to an Application Load Balancer?
No. An ALB is a layer-7 HTTP(S) load balancer that routes to registered targets over HTTP(S) — it has no database wire-protocol client relationship and never has an RDS instance as a backend target. The EC2 tier behind the ALB connects to RDS, not the ALB itself. Design Beaver flags an ALB → RDS edge as invalid.
How much does Amazon RDS cost?
RDS bills per DB-instance-hour (per-second increments, 10-minute minimum), plus storage per GB-month, optional provisioned IOPS, backup storage beyond the free allotment, and data transfer. Rates vary a lot by engine — license-included engines like Oracle and SQL Server cost more than open-source engines — and Multi-AZ roughly doubles compute cost since it runs a standby. Verify current rates on the official pricing page before estimating a bill.

Validate your RDS architecture as you draw

Design Beaver checks your AWS design in real time — missing queues, invalid connections, and security anti-patterns, caught before you ship. It’s live in beta, free, and runs in your browser with no account.

Open the app →

Prefer email? Get new features in your inbox:

← All supported services