Skip to main content
CloudArq
scopeaws
lenscost
checks32
cost guide · aws · finops

AWS cost optimization: find the waste, then the fix

A read-only audit that checks for the wasteful patterns that quietly inflate an AWS bill — idle and oversized compute, orphaned storage, idle networking and databases, missing commitments, and AI spend. Every finding carries the exact remediation steps, most with a per-resource cost estimate. No agents, no spend cap, never auto-fix.

Updated 2026-07-20 · ~11 minute read

27
cost checks
160
total checks
5
waste categories
0
agents installed
audience

Who this is for

Teams running on AWS whose bill has crept up faster than their traffic — the founder who just got a surprising invoice, the engineer told to “find some savings” before the next board meeting, the platform team that inherited an account full of resources nobody remembers creating. AWS cost waste is rarely one big line item; it is a long tail of idle, oversized, and orphaned resources, each too small to notice on its own. This page walks through exactly what CloudArq checks for, so you can see whether that long tail is hiding in your account.

the problem

Where AWS waste actually hides

Most AWS waste is not a mistake you would ever see on a dashboard — it is the residue of normal engineering. A load test spins up an oversized instance that never gets scaled back. A database migration leaves the old RDS running “just in case.” A stopped instance keeps billing for its EBS. A NAT gateway sits in a subnet with almost no traffic. A Provisioned Throughput reservation for a Bedrock model outlives the experiment it was created for. None of these trips an alarm, because nothing is broken — they are simply running, billed, and doing nothing.

CloudArq checks for 32 of these patterns across 6 categories — compute, storage, networking, databases and managed services, commitments and governance, and AI spend. Each one is a specific, provable condition read from your AWS metadata and CloudWatch metrics: an instance under 5% CPU for 14 days, a volume attached to nothing, a Reserved Instance used under 80%. It is capability detection — CloudArq tells you what is wasteful and how to fix it; it never changes anything on your account.

the estimate

How the dollar estimates are calculated

There is no headline “save $X” figure on this page, and there is none in the product either — a single global savings number would be a guess dressed up as a fact. Instead, CloudArq estimates the potential monthly cost of each individual resource live, from that resource’s own AWS metadata: the instance type, the volume size and type, the snapshot age, the provisioned throughput, and the relevant public AWS price. The estimate is grounded in your actual configuration, so it is useful for prioritising which findings to tackle first.

It remains an estimate, not a promise. The real saving depends on the change you choose to make — right-sizing versus deleting, moving to a Savings Plan versus staying on-demand — and on your negotiated rates. CloudArq is honest about that: the number helps you rank the work, and the remediation steps tell you exactly how to realise it.

the 32 checks

The 32 cost checks, by category

Each check describes a capability the read-only audit surfaces — the wasteful pattern it checks for — never an observed behaviour or a promised saving. The tag on each check is the lowest plan that includes it.

Compute

5 checks
  • unused_ec2Starter
    Checks for EC2 instances running at under 5% average CPU over 14 days — running, billed, and doing effectively nothing.
  • oversized_ec2Starter
    Checks for EC2 instances whose sustained CPU and memory utilisation is low enough to right-size to a smaller instance type.
  • ec2_stopped_with_ebsStarter
    Checks for stopped EC2 instances that are still billing for their attached EBS volumes — compute is off, storage is not free.
  • ec2_on_demand_convertiblePro
    Checks for steady-state on-demand instances running longer than 30 days that would be cheaper on a Reserved Instance or Savings Plan.
  • lambda_unusedPro
    Checks for Lambda functions with zero invocations in 30 days — dead code still carrying storage and configuration overhead.

Storage

8 checks
  • unused_ebsStarter
    Checks for unattached EBS volumes — provisioned, billed by the GB-month, and attached to nothing.
  • gp2_to_gp3_ebsMax
    Checks for gp2 EBS volumes that would deliver the same performance at lower cost as gp3.
  • old_snapshotsStarter
    Checks for EBS snapshots older than 90 days that are likely stale and quietly accumulating storage cost.
  • old_amisStarter
    Checks for AMIs older than 180 days whose backing snapshots keep billing long after the image is used.
  • ebs_iops_wastePro
    Checks for io1/io2 volumes whose peak IOPS stays under 50% of what is provisioned — you are paying for headroom you never use.
  • s3_incomplete_multipartStarter
    Checks for incomplete multipart uploads older than 7 days — orphaned upload parts that keep billing until a lifecycle rule aborts them.
  • cloudwatch_expensive_logsPro
    Checks for CloudWatch log groups larger than 5 GB with no retention policy — ingestion and storage cost that grows without bound.
  • ecr_no_lifecycleMax
    Checks for ECR repositories with no lifecycle policy, so untagged and superseded image layers accumulate indefinitely.

Networking

3 checks
  • idle_nat_gwStarter
    Checks for NAT gateways passing under 1 GB in 30 days — an hourly charge for a gateway carrying almost no traffic.
  • unattached_eipStarter
    Checks for Elastic IPs that are allocated but not associated — AWS bills an unattached EIP by the hour.
  • data_transfer_cross_regionMax
    Checks for cross-region VPC peering carrying meaningful data transfer, where a same-region design would avoid the inter-region rate.

Databases & managed

9 checks
  • idle_rdsStarter
    Checks for RDS instances with zero database connections over 7 days — a live, billed database nobody is talking to.
  • oversized_rdsStarter
    Checks for RDS instances whose sustained CPU and memory are low enough to right-size to a smaller class.
  • rds_idle_connectionsPro
    Checks for RDS instances whose peak connection count stays under 5 over 14 days — over-provisioned for the load they carry.
  • rds_multi_az_devMax
    Checks for Multi-AZ RDS in non-production environments, where the standby doubles cost for redundancy dev/test rarely needs.
  • elb_idlePro
    Checks for load balancers serving under 100 requests per day over 7 days — an hourly charge for a balancer with almost no work.
  • idle_elbMax
    Checks for load balancers with effectively no traffic over 30 days — a stronger idle signal for cleanup.
  • idle_elasticache_clusterMax
    Checks for ElastiCache clusters with effectively no connections over 30 days — a billed cache serving nothing.
  • elasticache_reserved_unusedMax
    Checks for ElastiCache reserved nodes with no matching running node — a commitment you are paying for but not consuming.
  • unused_security_groupsStarter
    Checks for security groups referenced by nothing — no cost by themselves, but the housekeeping signal of drift and orphaned infrastructure.

Commitments & governance

4 checks
  • no_savings_planMax
    Checks for steady compute spend with no active Savings Plan, where a commitment would discount usage you are already paying full on-demand rates for.
  • ri_underutilizationMax
    Checks for Reserved Instances used under 80% — a prepaid commitment burning off without matching usage.
  • untagged_cost_ownerPro
    Checks for resources with no owner or cost-allocation tag, so spend cannot be attributed and orphaned resources hide.
  • s3_request_pricingMax
    Checks for S3 buckets serving more than a million requests per day, where request-tier pricing or a caching layer may cut the bill.

AI spend

3 checks
  • bedrock_provisioned_throughput_burnMax
    Checks for a Bedrock Provisioned Throughput running with no commitment term — billed hourly at the full rate whether or not the model is invoked.
  • rag_vector_store_costMax
    Checks for a Bedrock knowledge base on OpenSearch Serverless paying the minimum-OCU floor, where a smaller-footprint vector store is usually far cheaper.
  • idle_sagemaker_endpointMax
    Checks for a SageMaker real-time endpoint with almost no invocations over 30 days — billed 24/7 for compute it barely uses.

The three AI-spend checks above — bedrock_provisioned_throughput_burn, rag_vector_store_cost, and idle_sagemaker_endpoint — also surface in the AI Workload lens, alongside the security posture of your Bedrock agents, RAG, and guardrails.

how it works

How it works

Read-only, no agents, no spend cap, never auto-fix

The same connection model as every CloudArq audit.

5 facts
  • connectA read-only IAM role with an ExternalId — the same connection every CloudArq audit uses. No keys to paste, no agents to install.
  • storeCloudArq never stores your credentials, application data, database contents, or S3 objects. The audit reads configuration and CloudWatch metrics, nothing more.
  • estimateEach finding’s potential monthly cost is estimated live from that resource’s own AWS metadata and the relevant public price — grounded in your configuration, not a precomputed global figure.
  • fixDetection plus the remediation steps — never auto-fix. Each finding shows the exact CLI command or console path; you apply the change and stay in control.
  • no-capNo spend cap and nothing is ever stopped or throttled. CloudArq surfaces the waste and the fix; it never risks your workloads with a hard stop.
product · output

What the cost findings look like

audit · lens · costillustrative example
idle_nat_gw
NAT gateway carrying < 1 GB in 30 days
nat-0example · eu-north-1 · est. —/mo
fix →
unused_ec2
EC2 instance under 5% CPU for 14 days
i-0example · m5.xlarge · est. —/mo
fix →
unused_ebs
Unattached EBS volume
vol-0example · gp3 500 GB · est. —/mo
fix →
idle_rds
RDS instance with zero connections in 7 days
db-example-reporting · est. —/mo
fix →
bedrock_provisioned_throughput_burn
Bedrock Provisioned Throughput, no commitment term
bedrock · eu-north-1 · est. —/mo
fix →

Illustrative only — sample rows, not a real account; the est. column is masked. Each real finding shows a per-resource estimate and ships with remediation steps.

faq

Frequently asked

01What does CloudArq check for when it looks at AWS cost?
CloudArq checks for the wasteful patterns that quietly inflate an AWS bill: idle and oversized EC2, stopped instances still billing for their EBS, unattached EBS volumes and Elastic IPs, idle NAT gateways and load balancers, idle or oversized RDS and ElastiCache, old snapshots and AMIs, gp2 volumes that would be cheaper as gp3, missing Savings Plans and under-used Reserved Instances, untagged spend with no owner, and AI-specific spend like a Bedrock Provisioned Throughput running with no commitment term. It detects the pattern and gives you the exact remediation steps — it is read-only and never changes anything itself.
02How are the dollar estimates calculated — is there a headline “save $X” number?
No, there is no precomputed global savings figure. CloudArq estimates the potential monthly cost of each individual wasteful resource live from that resource’s own AWS metadata — instance type, volume size and type, snapshot age, provisioned throughput, and the relevant public AWS price — so the estimate is grounded in your actual configuration. It is an estimate to help you prioritise, not a promise; the real saving depends on the change you choose to make.
03Is the audit read-only? Can CloudArq delete or resize anything for me?
The audit is read-only end to end. CloudArq connects through a read-only IAM role secured with an ExternalId, never stores your credentials, application data, database contents, or S3 objects, and never auto-fixes. Every cost finding ships with remediation steps — the exact CLI command or console path — but you apply the change. Detection plus the fix, never a hard stop and never an automatic action on your account.
04Which plan includes the cost checks?
Cost checks run on every tier, including the free Starter tier — the plans differ in how many checks each includes. The full catalog, the AI Workload lens, and AI-assisted remediation ship on the Max tier. See the pricing page for the exact per-tier breakdown; the check counts there are computed from the same source of truth this page uses, so they always match.
05Does CloudArq set a spend cap or stop resources to control cost?
No. There is no spend cap and CloudArq never stops or throttles anything — that would risk your production workloads. It surfaces the waste and the remediation steps so you can decide. The goal is visibility and a guided fix, not a hard stop.
06Does it cover Bedrock and other AI spend?
Yes. Alongside the classic compute, storage, network, and database checks, CloudArq checks for AI-specific waste: a Bedrock Provisioned Throughput billed hourly with no commitment term, a RAG knowledge base paying the OpenSearch Serverless minimum-OCU floor, and a SageMaker endpoint billed 24/7 with almost no invocations. Those live in the AI Workload lens — see the AI workload page for the full picture.

Find the waste in your own account

The 32 cost checks run as part of the same read-only audit that covers all 192 CloudArq checks. Connect a read-only IAM role, run the audit, and each wasteful resource surfaces with the exact remediation steps, most with a per-resource cost estimate — nothing installed, nothing changed on your account.

For AI-specific spend, see the AI Workload lens; for who CloudArq is built for, the solutions overview.