AWS account report · how it works

How we find waste in an AWS account, and what to do about it.

A plain walk-through of the problem types we look for, how we identify each one, the changes that usually save money, and the order to make them in. It follows one simulated company from first look to verified result.

1 · Find→2 · Explain→3 · Plan→4 · Change→5 · Verify
01 · What we look for

Six kinds of problem show up in almost every account

They overlap, and one resource can fall into more than one. The report sorts each finding into one of these groups so the fix is clear.

◷
Stale

Stale resources

Things nobody uses anymore but still get billed: old snapshots, unattached volumes, unused IPs, empty load balancers.

Example: a volume detached from a server deleted last spring, still billed every month.
◐
Non-required

Non-required capacity

Resources that run more than the team needs: development systems left on at night, machines larger than their load, duplicate environments.

Example: a test database running 24/7 while the team uses it about 10 hours on weekdays.
!
Vulnerability

Security gaps

Open ports, unpatched hosts, outdated container images, and public storage that should be private.

Example: an admin port reachable from the whole internet on a host that only staff need.
⚙
Broken logic

Broken logic

Scheduled jobs and policies that look healthy but do not do what they should: failing silently, or contradicting each other.

Example: a nightly export that reports success while writing nothing.
⌁
Exposure

Unexpected exposure

Services, buckets or databases reachable from places they should not be, which is both a security and a cost risk.

Example: a backup bucket with public read access and no owner tag.
%
Right-sizing

Over-provisioning

Capacity set for a peak that happens rarely, so most of the time the bill pays for empty machines.

Example: a cluster sized for a holiday peak, running at 18% average load all year.
02 · How we identify problems

From raw account data to a finding

We start with read-only data. Each source answers one question, and a finding is only written up when two or more sources agree.

1
Billing data Which services cost what, month by month, and how the bill changed.
2
Usage metrics CPU, memory, connections and traffic over 30–60 days, to separate idle from busy.
3
Inventory & config What exists, who owns it (tags), how it is set up, and what is public.
4
Findings Each one lists evidence, estimated monthly impact, risk and a suggested action.
03 · Simulated case

One company, followed from start to finish

The company below is simulated. Its name, workloads and numbers are invented to show the method. They are not a customer and not a promise of any result.

Simulated company: a 40-person software team

One AWS account. A Kubernetes cluster for production, a development database, block storage, a NAT gateway, and object storage.

Simulated case · invented values
Monthly AWS bill$7,000
Team size40 people
EnvironmentsProd + dev + test
Who looked at the billNobody, monthly
04 · What the report showed

Where the case money went, before and after

After the approved changes, the case bill runs at a lower rate. Grey is the baseline; blue is the run rate after the changes. Values are invented for teaching.

Before (monthly baseline)After (normalized run rate)
Kubernetes nodes
$2,100 → $1,500
Databases (RDS)
$1,400 → $900
Block storage & snapshots
$420 → $270
Everything else
NAT, S3, transfer, IPs
$3,080 → $2,980
05 · Walk-through

Three findings from the case, and the math behind each

Each saving is a formula you can apply to your own account. The numbers are the case's invented values.

1
Non-required

The development database runs all day and night

What we saw: the instance is busy about 10 hours on weekdays and almost idle at weekends. Connection logs confirm no one uses it overnight.

How we checked: 60 days of connection and CPU metrics, plus the team's stated working hours.

Estimate = monthly cost × share of hours idle
2
Stale

Snapshots and volumes nobody owns

What we saw: 64 snapshots older than 90 days and 18 volumes not attached to anything. None carry an owner tag.

How we checked: the inventory showed no attachments; the snapshot dates were past the team's own retention rule.

Estimate = storage size × price per GB, for the items confirmed unused
3
Vulnerability

An admin port open to the internet

What we saw: a management port reachable from every address on three hosts that only staff need.

How we checked: the security rules and the hosts' login logs. The risk is high even though the cost impact is small.

Estimate = not a cost saving; the fix is a risk reduction, verified by re-scanning the port
06 · The case in numbers

How the case's findings were grouped

The same six groups as above, with invented counts for the case.

243findings
StaleSnapshots, volumes, unused IPs and security groups
142
Non-required capacityAlways-on dev systems, oversized machines, duplicate environments
58
VulnerabilitiesMissing patches, exposed ports, outdated images
37
Broken logicJobs failing silently, policies contradicting each other
6

Largest groups in the case

Snapshots over 90 days
64
Always-on dev systems
19
Oversized machines
14
Unused security groups
23
Unattached volumes
18

Counts are invented and shown for teaching only.

07 · Course of action

The order we change things in

Lowest risk first, and every change is approved and reversible before it is made.

1

Confirm owner

Find who uses each resource. No owner, no change.

2

Confirm usage

Check metrics over a full business cycle, not one quiet week.

3

Test in non-production

Apply the change to a copy first and watch it for a week.

4

Approve the change

Named approval, change ticket, and an agreed maintenance window.

5

Make it reversible

Backup, restore test and written rollback steps before the change.

6

Verify the bill

Compare a normalized cost against a comparable period, after the change.

08 · Best practices that prevent the problems

Habits that keep waste from coming back

These are the practices that, when followed, stop most of the problem types above from returning.

  • Tag every resource with an owner and an environment, and reject untagged resources at creation.
  • Set retention rules for snapshots, logs and backups, and enforce them automatically.
  • Schedule non-production to run only in the hours the team works.
  • Right-size on evidence: change capacity only after 30 days or more of usage data.
  • Restrict access by default: no public ports or buckets unless a named owner approves.
  • Patch on a fixed cadence and rebuild base images regularly, not only after an incident.
  • Make scheduled jobs fail loudly, with alerts when a job produces no output.
  • Review the bill monthly, with a named person and a short list of changes.
09 · How the report helps

What each part of the report answers

The report is written so your team can act on it, and finance can check the numbers.

Executive summaryWhat is costing money, what is at risk, and the proposed order of work.
Findings with evidenceEach problem, the data behind it, and its estimated monthly impact.
Risk matrixHow risky each change is, how much downtime it could cause, and how easy it is to undo.
Implementation planThe changes in order, with approval gates and infrastructure-as-code where possible.
Savings attributionEach saving tracked on its own against a normalized baseline, so nothing is counted twice.
RunbookWhat changed, how to roll it back, and what to watch in the weeks after.

How savings are estimated

For any account, the report uses the same steps: confirm the cost of each resource from billing data, confirm how much of that cost is unused or avoidable, then apply the change only after approval. The result is an estimate for your account, shown with its assumptions. It is not a promise.

See which of these apply to your account

Start with a free 20-minute call. We will tell you which of these problem types we would check first for your setup.

Book the free call ↗