← All episodes

Episode 7 · October 12, 2026

Idle RDS Instances: Why Stopping Isn't Enough and How to Delete Safely

An RDS instance bills by instance class for every hour it runs, whether or not anything connects, and Multi-AZ roughly doubles that instance charge. This episode covers why idle databases slip past monitoring that only alarms on spikes, how to detect one with the CloudWatch DatabaseConnections metric at zero for at least seven days, why stopping is only temporary (storage and backups keep billing, and AWS starts the instance again after seven days), why deletion with a final snapshot is the real fix, and why to confirm with the application owners first, since hard-coded references or recovery scripts may still depend on the database. Find this waste on your own machine, read-only: pip install cloudcostwise

Idle RDS Instances: Why Stopping Isn't Enough and How to Delete Safely

Read the related post

Transcript

Auto-generated from the audio. The hosts are AI-generated voices; mistakes in the transcript are possible.

Imagine renting a car, parking it in your driveway, and paying a per-mile charge while it just sits there with the engine off. That would be ridiculous. It sounds ridiculous, right? But if we look at Amazon RDS database instances, that is exactly what is happening. Welcome to The Deep Dive.

Today we are doing a waste pattern teardown designed specifically for you. Yeah, it really is a perfect analogy. The meter just keeps running because we are talking about cloud compute. It bills per hour, or technically per second, with a 10-minute minimum. Right, and it bills based on the instance class, whether or not a single application actually connects to it, which is, you know, the really surprising part.

Exactly. The unit math is totally transparent. It is just your instance class rate times hours equals the cost. You should always check the exact instance class price on the RDS pricing page rather than just assuming one. Yeah, because those costs scale up fast.

Oh, and if you have configured a multi-AZ deployment for high availability, you are roughly doubling that instance charge right out of the gate. Right out of the gate, yeah. And here is where people get tripped up. They think, well, I will just stop the instance, so I stop paying that hourly compute charge. I mean, that makes total sense.

You turn it off, the billing should stop. It should, but the disk does not disappear. The storage and the backups continue to bill. So you stop the compute, but you are still paying rent on the space it takes up. Wow, so the underlying EBS volumes and automated snapshots are still just sitting there, but you would think a massive idle database would trip an alarm somewhere, you know?

You really would think so, but you have to remember how engineering teams actually configure their monitoring. Right, like we set alarms for resource spikes, CPU hitting 90% to prevent outages, things like that. Exactly. We do not typically set alarms for 0% utilization. The database is not failing.

It is just sitting there. 0% usage goes completely undetected by design. That is wild. It just blends into the total RDS line item on a massive AWS bill, and organizationally, I guess nobody explicitly owns it. Yeah, an engineer spins it up for a quick staging test, finishes the test, moves on to the next sprint, and just entirely forgets to tear it down.

So how do you actually detect it yourself today without buying any fancy tools? It is actually pretty simple. You just look at the CloudWatch database connections metric. Okay, just that one metric. Yeah, just that.

If you see that metric sitting at exactly zero for at least seven consecutive days, you likely have an idle database on your hands. Zero connections for a full week is a great signal. But if I spot that, my first instinct is just to click stop in the console and cross it off my to-do list. A lot of people do that. The problem is, an RDS instance is basically a zombie resource if you just hit stop.

It does not stay dead. Wait, what? It turns itself back on? It does. Stopping an instance is only temporary.

AWS will automatically start it again after seven days to ensure it does not fall behind on required maintenance updates. Oh, man. So you think you have stopped the billing leak, but a week later it springs back to life and starts charging that hourly compute rate all over again. Exactly. So the only actual fix is deletion.

But you absolutely must take a final snapshot first. Right, because once you delete an instance without one, that data is lost for good. Yes, taking that final snapshot is non-negotiable. But even with a snapshot, I have to give a strict safety warning here. Never call a resource provably or guaranteed unused.

Because no preview or dry run makes deleting it 100% safe. You always have to manually confirm with the application owners first, right? Precisely. Even if connections are at zero, something critical might still depend on it. Like a hard-coded reference by ID in an old code base, or maybe a rollback script for an emergency deployment.

Yeah, or some automated scale-out process that is just waiting for a specific trigger. If you delete it without checking those dependencies, you might break a critical recovery path. And nobody has looked at that path in months. So the metrics give you the target, but human verification prevents the outage. Exactly.

You always verify. So if you want a practical next step to find these hidden meters running in your own environment, you can use a free source-available scanner just by running pip install cloudcostwise. Yeah, it runs read-only on your own machine, flags this specific idle RDS pattern, and sends absolutely nothing to CloudWise. Awesome. It definitely leaves you wondering, you know, if a massive relational database can hide in plain sight and bill quietly week after week, what other orphaned resources are currently running in your staging environments right now?

Find this waste in your own account, read-only, on your own machine: pip install cloudcostwise