Amazon Web Services

Your biggest cloud bill, read end to end.

AWS is where most teams spend the most and over-provision the most. Volumes detach from deleted instances and keep billing; dev databases sit on Multi-AZ; security groups quietly open a database port to the whole internet.

Nuvozy inspects roughly 70 AWS services in one read-only pass, pairs each cost finding with real CloudWatch utilization and live AWS pricing, and surfaces the security misconfigurations in the same sweep, so cost and risk are one report, not two tools.

Organization-wide checks across an AWS Organization

gp2 → gp3

Migrating gp2 volumes to gp3 is typically cheaper for the same (often better) performance, with zero downtime.

Paying double

A dev RDS instance left on Multi-AZ pays for failover protection non-production doesn't need.

1 scan

Public S3 buckets, public snapshots, and active root access keys are caught in the same pass that finds your savings.

What we scan on AWS

A representative sample of the AWS checks, grouped by service domain. Cost waste and security risk are surfaced in the same read-only pass. The complete, searchable list is further down this page.

Compute & containers

EC2, EBS, Lambda, ECS, EKS, Auto Scaling, SageMaker.

EC2 zombie & oversized instances

Idle and over-provisioned instances, backed by real CPU/memory metrics.

Lambda Graviton & forgotten functions

arm64 migration for ~20% off; functions with no recent invocations.

EKS Spot & Karpenter opportunities

Move fault-tolerant node groups to Spot for up to 70% off.

Auto Scaling minimum oversized

ASG floors set higher than demand ever needs.

Storage & database

EBS, S3, RDS, Aurora, DynamoDB, ElastiCache, Redshift.

Unattached EBS volumes & orphaned snapshots

Block storage billing for resources that are long gone.

S3 cold-data & lifecycle gaps

Hot-tier data unread for months; Intelligent-Tiering candidates.

RDS idle & Multi-AZ on dev/staging

Databases nobody queries, and non-prod paying 2× for HA.

DynamoDB provisioned waste

Provisioned capacity sitting far above what's consumed.

Network & long tail

Elastic IPs, NAT, ELB, VPC endpoints, Transit Gateway.

Unattached Elastic IPs & idle NAT gateways

Hourly charges for plumbing carrying no traffic.

Idle load balancers & orphaned target groups

ALB/NLB and target groups attached to nothing.

Off-hours schedule & tag-coverage

Structural levers: sleep non-prod nights/weekends, fix allocation gaps.

Duplicate CloudTrails & dead alarms

The forgotten operational long tail that quietly bills on.

Security & CSPM

IAM, KMS, public exposure, GuardDuty, CloudTrail, Inspector.

Security groups open to 0.0.0.0/0

SSH, RDP, and database ports reachable from the internet.

Public buckets, snapshots & AMIs

Data shared with the entire world, flagged immediately.

IAM root keys, missing MFA, stale keys

Identity hygiene that shrinks your blast radius.

GuardDuty / flow logs / CloudTrail gaps

Detective blind spots named per region.

Every check we run on AWS

All 214 checks, generated directly from the scanner so this list matches what actually runs. Search for a service to see whether your stack is covered.

  • Commitment opt-in

    Reserved Instances underutilized

    Aggregate RI utilization < 80% over 30 days. Unused RI hours are money already spent regardless of consumption. Requires Cost Explorer.

  • Commitment opt-in

    Savings Plan coverage gap

    On-demand spend that a 1-yr no-upfront Compute SP would cover at a blended ~15% discount. Requires Cost Explorer.

  • Compute uses metrics

    App Runner services with no traffic

    Running services averaging < 1 request/day over 14+ days. Provisioned container memory bills around the clock.

  • Compute uses metrics

    AppStream fleets idle

    AppStream 2.0 ALWAYS_ON fleets with average InUseCapacity below 1 over the lookback window. ALWAYS_ON instance hours bill regardless of session activity.

  • Compute

    Auto Scaling group rightsizing (Compute Optimizer)

    Auto Scaling groups Compute Optimizer flags for a smaller instance type, with CO's estimated monthly savings.

  • Compute uses metrics

    Auto Scaling minimum oversized

    ASGs with MinSize > 1 whose member instances average < 10% CPU for 14 days. Lowering MinSize lets the group scale in during quiet periods.

  • Compute

    Batch compute environments holding idle capacity

    Compute environments with desiredvCpus > 0 while no jobs are running or queued in any attached queue. Capacity bills whether jobs run or not.

  • Compute uses metrics

    EC2 low-CPU oversized

    Running instances with avg CPU < 5% and p95 < 15% over 30 days. Recommends one-step-down within the same family. CPU-only - memory blindness is flagged on each finding.

  • Compute

    EC2 zombie instances

    Instances stopped 7+ days but still paying for attached EBS volumes. The 'forgotten dev box' pattern.

  • Compute uses metrics

    ECS services with no traffic

    Active services whose ALB target groups handled < 1 req/day for 14 days. Common abandoned-service pattern - tasks keep running, no callers.

  • Compute

    EKS Karpenter migration opportunity

    EKS clusters with 3+ managed node groups using static autoscaling. Karpenter typically saves 20% on the EC2 portion by bin-packing across instance types per-pod.

  • Compute

    EKS Spot capacity opportunity

    EKS managed node groups running on capacityType=ON_DEMAND with Linux-class AMIs. Spot saves up to 70% for workloads that tolerate interruption (stateless services, batch, CI runners).

  • Compute uses metrics

    EKS node groups underutilized

    Managed node groups with desiredSize > 1 and avg EC2 CPU < 20% over 14 days. Recommend shrinking desired size by ~30% and letting cluster-autoscaler grow back.

  • Compute opt-in

    EKS pods over-requested

    Workloads whose CPU/memory requests >> actual usage per Kubecost. Right-size requests so cluster-autoscaler can shrink the fleet.

  • Compute

    EMR clusters idle (WAITING)

    EMR clusters in WAITING state for 7+ days. The master and core nodes keep paying EC2 charges while no step is running.

  • Compute

    EMR clusters structurally oversized

    EMR clusters with > 5 core nodes, auto-terminate disabled, and no termination protection. Surfaces structurally large long-lived clusters that warrant a rightsizing review.

  • Compute uses metrics opt-in

    Fargate services oversized

    Fargate services with Container Insights CPU + memory utilization < 20% of task reservation. Recommends halving task size. Paid: Container Insights.

  • Compute

    Glue dev endpoints idle

    Glue dev endpoints not modified in the last 90 days. Dev endpoints are billed by DPU-hour while READY, so idle ones are real dollars.

  • Compute uses metrics

    Idle Lightsail instances

    Running instances with avg CPU < 5% and egress < 1 MB/day over the lookback. The flat bundle fee bills regardless.

  • Compute uses metrics

    Idle MWAA (Airflow) environments

    Environments averaging < 0.1 running tasks over 14+ days. The base environment fee bills 24/7-$350+/month even for small.

  • Compute uses metrics

    Lambda Graviton (arm64) candidate

    x86_64 Lambda functions whose runtime has a native arm64 build. Switching architecture is ~20% cheaper per GB-second with no code change for managed runtimes.

  • Compute uses metrics

    Lambda Provisioned Concurrency idle

    Lambda Provisioned Concurrency allocations averaging < 30% utilization over 30 days. PC is billed by allocated GB-second, so the unused fraction is wasted spend.

  • Compute uses metrics

    Lambda forgotten functions

    Functions with at most 5 invocations on any day in 30 days. Governance finding - Lambda is invocation-priced, so $0 quantified savings; the value is reduced attack surface and tooling noise.

  • Compute

    Lambda memory rightsizing (Compute Optimizer)

    Lambda functions Compute Optimizer flags as over- or under-provisioned on memory, with CO's estimated monthly savings. Replaces the deferred Logs-Insights-based LAMBDA_OVER_MEMORY.

  • Compute

    Outposts capacity review

    Active Outposts flagged for a manual capacity review. An Outpost is a fixed prepaid commitment, so an under-filled rack is large waste. But utilization needs per-instance-family CloudWatch data.

  • Compute uses metrics

    SageMaker hosted endpoints low traffic

    SageMaker hosted endpoints averaging under 100 invocations/day over 30 days. Endpoints are billed per-instance-hour while InService regardless of traffic.

  • Compute uses metrics

    SageMaker notebook instances idle

    SageMaker notebook instances InService with CPU under 1.5% for 14+ days. Notebooks bill per second regardless of activity.

  • Compute uses metrics

    Step Functions STANDARD where EXPRESS fits

    STANDARD state machines with > 10k executions/month and avg duration < 5s. EXPRESS pricing is typically ~5x cheaper for this profile.

  • Compute

    WorkSpaces ALWAYS_ON idle

    AlwaysOn-mode WorkSpaces with no user connection in 30+ days. AlwaysOn billing charges full monthly fee regardless of session activity.

  • Database uses metrics

    Aurora unused read replica

    Aurora reader instance with avg DatabaseConnections < 1 for 30 days while the writer has traffic. Replicas cost full hourly rate.

  • Database

    CloudHSM clusters (review high cost)

    CloudHSM clusters with at least one ACTIVE HSM. Each HSM bills $1.45/hour regardless of crypto traffic. Surface every cluster for cost-aware review.

  • Database uses metrics

    DocumentDB clusters idle

    DocumentDB clusters with CPUUtilization under 5% and DatabaseConnections under 5 averaged over 30 days.

  • Database

    DynamoDB PITR surcharge on large tables

    DynamoDB tables with PITR enabled and > 1 GB stored. The $0.20/GB-month PITR surcharge can add up on large tables; review whether the recovery window is worth the cost.

  • Database uses metrics

    DynamoDB on-demand vs provisioned mismatch

    PAY_PER_REQUEST DynamoDB tables sustaining 100+ requests/sec. PROVISIONED with autoscaling targeting 70% utilization is typically 30-50% cheaper at this consistent traffic level.

  • Database uses metrics

    DynamoDB provisioned waste

    Provisioned-mode tables with consumed/provisioned < 20% for 30 days. Switch to on-demand or autoscaling to track real load instead of peak.

  • Database

    DynamoDB sparse GSI

    Global Secondary Indexes whose item_count is < 10% of the base table. Provisioned RCU/WCU on the GSI is wasted; review or drop.

  • Database

    DynamoDB without autoscaling

    Provisioned tables without an autoscaling target attached. Capacity stays flat at peak instead of tracking real load.

  • Database uses metrics

    ElastiCache idle clusters

    Clusters with avg CurrConnections < 1 AND CPU < 5% for 30 days. Forgotten test/dev caches - cache.r6g.large alone is ~$150/month.

  • Database

    ElastiCache outdated node generation

    Clusters on previous-gen node types (m5/r5/t3) when current-gen Graviton (m6g/r6g/t4g) is cheaper at equivalent specs.

  • Database uses metrics

    Kinesis streams over-sharded

    Provisioned-mode Kinesis streams whose observed peak incoming bytes/sec and records/sec sit well below the configured shard count's capacity (1 MB/s and 1000 records/s per shard).

  • Database uses metrics

    MSK clusters over-provisioned

    Provisioned MSK clusters with peak broker CPU under 20% across the lookback window. Typical fix is halving the broker count, preserving Kafka's topic partition layout.

  • Database uses metrics

    MemoryDB for Redis clusters idle

    MemoryDB clusters with average CurrConnections under 5 and EngineCPUUtilization under 5% over 30 days.

  • Database uses metrics

    Neptune clusters idle

    Neptune clusters with cluster-level CPUUtilization under 5% over 30 days. Neptune bills per-instance-hour regardless of query activity.

  • Database uses metrics

    OpenSearch domains idle

    OpenSearch / Elasticsearch domains with effectively zero search and indexing activity for 30+ days. Full domain hourly cost is recoverable by deletion.

  • Database uses metrics

    OpenSearch domains oversized

    OpenSearch domains with sustained low CPU (<15%) but real traffic. Typical fix is halving the data-node count. Master-eligible / warm nodes are not modified by this finding.

  • Database

    RDS Extended Support surcharge

    RDS / Aurora instances running engine versions past standard EOL. AWS charges $0.10/vCPU-hour (Year 1-2; $0.20 in Year 3) until the database is upgraded to a supported version.

  • Database

    RDS Multi-AZ on dev/staging

    RDS instances with Multi-AZ enabled and environment tags indicating dev / staging / qa. Multi-AZ doubles the hourly instance cost for a failover that non-prod rarely needs.

  • Database uses metrics

    RDS idle instances

    RDS instances with avg CPU < 5% AND avg connections < 2 for 30+ days. Forgotten test/dev databases - often the largest single line item.

  • Database uses metrics

    RDS storage autoscaling off

    RDS instances with allocated storage far exceeding usage AND MaxAllocatedStorage unset. Enable storage autoscaling so future allocations track real usage; ($0.115/GB-month on gp3).

  • Database

    Redshift DC2 to RA3 migration

    DC2-class clusters that have an RA3 equivalent. RA3 separates compute from storage; cheaper at scale once data exceeds the bundled DC2 disk.

  • Database

    Redshift non-prod always on

    Non-prod Redshift clusters (env=dev/staging/test) without a pause schedule. Pause + resume during off-hours saves ~60% per cluster.

  • Database uses metrics

    Timestream tables idle

    Timestream tables with zero query SampleCount observed over the lookback window. Storage retention keeps billing whether or not the data is queried.

  • Governance

    AWS Config recording all resources (no filter)

    AWS Config recorder set to record all supported resource types with no exclusion list. Bills $0.003 per item recorded per region. High-churn resources (e.g. ECS tasks, EC2 Spot interruptions) can quickly dominate the bill.

  • Governance uses metrics

    Abandoned empty SQS queues

    Queues with zero messages, no configuration change in 180+ days, and no sends over the metric lookback. Cleanup candidates.

  • Governance

    App Runner services paused for months

    Services in PAUSED state with no update in 90+ days. Likely decommissioned in practice. Delete to clear the config.

  • Governance uses metrics

    AppSync APIs with no requests

    GraphQL APIs averaging < 1 request/day over the lookback. Abandoned endpoints that still accept queries.

  • Governance

    AppSync APIs without logging

    GraphQL APIs with no CloudWatch log config. Debugging and incident response are blind without request logs.

  • Governance

    Athena workgroups without query cost cap

    Athena workgroups with no BytesScannedCutoffPerQuery. A single misbehaving SELECT can scan petabytes; this finding identifies workgroups where that cost runaway is not gated.

  • Governance

    Carbon-intensity hotspots

    Significant EC2 spend (>$100/month) in regions with a grid carbon intensity > 500 gCO2e/kWh. Reports an emissions estimate to support sustainability targets. No dollar savings claimed.

  • Governance

    CloudTrail duplicate trails

    Multiple trails in the same region capturing the same event selectors. AWS gives one trail per region for free; additional trails capturing overlapping events pay $2/100k events twice.

  • Governance

    CloudWatch alarms stuck in INSUFFICIENT_DATA

    Metric alarms in INSUFFICIENT_DATA for 30+ days. Usually monitor a metric that no longer reports - either delete or fix the dimension.

  • Governance

    CloudWatch dashboards unused

    Accounts with more than 3 dashboards (free tier) where some haven't been modified in 180 days. Each billable stale dashboard is $3/month.

  • Governance

    CloudWatch metric streams idle

    CloudWatch metric streams in state=running whose LastUpdateDate is older than 30 days. Often forgotten exports to a third-party observability sink that's no longer in use.

  • Governance

    CodeBuild projects unused

    CodeBuild projects with no completed build in the last 90 days. CodeBuild is per-build-minute priced, so the dollar savings are $0. Clean up reduces IAM/source-provider blast radius.

  • Governance

    CodeDeploy apps with no recent deployments

    Deploy applications with zero deployments in the last 180 days. Dormant apps leave behind deployment groups + IAM wiring as drift.

  • Governance

    CodePipeline pipelines never executed

    Pipelines with no execution history. Scaffolds never wired to a real trigger. Stale config worth removing.

  • Governance opt-in

    Cost anomalies (last 30d)

    AWS Cost Anomaly Detection hits over the last 30 days, with impact dollars and root-cause dimension. Requires Cost Explorer.

  • Governance

    Disabled EventBridge rules

    Rules in DISABLED state. Often left over from incident response or migrations and never cleaned up.

  • Governance

    DynamoDB deletion protection disabled

    DynamoDB table has deletion protection disabled.

  • Governance

    DynamoDB point-in-time recovery disabled

    DynamoDB table has point-in-time recovery disabled, so there is no continuous backup for restore-to-timestamp.

  • Governance

    EC2 EBS optimization disabled

    EBS-backed instance has EBS optimization disabled, throttling volume throughput on instance types that support it.

  • Governance

    EC2 detailed monitoring on non-prod

    Instance has paid detailed (1-minute) CloudWatch monitoring enabled on a non-prod host where basic 5-minute metrics suffice.

  • Governance

    ECS dev/staging services running 24/7

    ECS services tagged dev/staging/qa with desiredCount > 0 and no scheduled scaling. A nightly + weekend shut-down via Application Auto Scaling schedule cuts non-prod compute by ~62%.

  • Governance

    ELB target groups orphaned

    Target groups not attached to any load balancer. No direct hourly cost but they accumulate as IaC drift and noisy CloudWatch dimensions.

  • Governance

    Empty Cognito user pools

    User pools older than 90 days with zero users. Leftover from abandoned projects and proofs-of-concept.

  • Governance uses metrics

    EventBridge rules that never fire

    Enabled rules with targets whose Invocations sum is zero over 30+ days. The event pattern matches nothing that occurs.

  • Governance

    EventBridge rules with no targets

    Enabled rules with zero targets. Every matching event is evaluated and then dropped. Pure misconfiguration.

  • Governance opt-in

    Free-tier exhaustion (approx.)

    Free-tier-eligible usage types now incurring paid cost (approximate, CE-derived). Requires Cost Explorer.

  • Governance

    Glue jobs idle

    Glue ETL jobs with no successful run in the last 90 days. Glue is per-run priced so the dollar savings are $0, but cleaning up reduces IaC drift, IAM blast radius, and Catalog clutter.

  • Governance

    Idle Batch job queues

    Enabled job queues with zero jobs in every status (including recent terminal history). Cleanup candidates.

  • Governance uses metrics

    Idle Kendra index

    ACTIVE Kendra indices with ~zero queries over the lookback. The hourly base fee bills 24/7. Enterprise edition is ~$1,000/month.

  • Governance uses metrics

    Idle Lex bots

    Available Lex V2 bots with ~zero runtime requests over the lookback. Lex bills per request, so this is governance hygiene (retire dead bots) rather than a cost saving.

  • Governance

    IoT topic rules left disabled

    IoT Core message-routing rules in the disabled state. They route nothing. Dead config that obscures the active topology.

  • Governance

    KMS key pending deletion

    Customer-managed CMK is in PendingDeletion state, which will break anything still encrypted under it when the window elapses.

  • Governance

    Lambda no dead-letter target

    Lambda function has no dead-letter target configured, so failed async events are dropped after retries exhaust.

  • Governance

    Lambda runtime deprecated

    Lambda function uses a runtime AWS has deprecated or scheduled for end-of-support.

  • Governance

    License Manager configs consuming nothing

    Available license configurations with zero consumed licenses. Tracking rules attached to nothing. Skews compliance reporting.

  • Governance

    Load balancer access logs disabled

    ALB/NLB has the access-logging attribute disabled, leaving no request-level audit trail.

  • Governance

    Load balancer deletion protection disabled

    ALB/NLB has deletion protection disabled, risking accidental removal of the load balancer.

  • Governance opt-in

    ML service usage spend

    Usage-priced ML service spend (Bedrock, Polly, Rekognition, etc.) over the last 30 days. Requires Cost Explorer.

  • Governance

    Macie jobs scanning daily

    Macie classification jobs configured with DAILY frequency. Macie bills per-GB scanned at $1/GB (first 50 TB/month); daily re-scans of large buckets often run up the bill far beyond what compliance requires.

  • Governance

    Off-hours schedule candidates

    Non-prod EC2 / RDS / ECS resources running continuously. Stopping nights and weekends via EventBridge or Application Auto Scaling schedules saves ~62% of compute time per week.

  • Governance

    Production SQS queues without a DLQ

    Production-tagged queues with no redrive policy. Failed messages are silently retried until retention expiry, then lost.

  • Governance

    RDS auto minor version upgrade disabled

    RDS instance has AutoMinorVersionUpgrade disabled, drifting from patched engine versions.

  • Governance

    RDS automated backups disabled

    RDS instance has BackupRetentionPeriod=0, so automated backups and point-in-time recovery are disabled.

  • Governance

    RDS deletion protection disabled

    Production-class RDS instance has DeletionProtection disabled, risking accidental deletion.

  • Governance

    Region price arbitrage

    Workloads running in regions where the same instance type costs >15% more than us-east-1, and no data-residency tag justifies the region. The delta is real savings if migration is feasible.

  • Governance

    S3 Storage Lens not configured

    No custom S3 Storage Lens configuration exists. The free default dashboard gives account-wide storage analytics that surface cold-data and lifecycle savings. Recommended to enable.

  • Governance

    S3 Transfer Acceleration enabled but unused

    Buckets with TransferAcceleration=Enabled and zero accelerated bytes over the lookback window. No billing impact today, but leaves a confusing-to-debug feature on.

  • Governance

    S3 buckets without access logging

    Buckets with server-access logging off. Forensics readiness only - not a cost finding. Default-off in the picker; opt in for audited environments.

  • Governance

    S3 lifecycle missing abort multipart upload

    Bucket has lifecycle rules but none aborts incomplete multipart uploads, so partial uploads accrue storage charges forever.

  • Governance

    SES account in sandbox

    Regions with verified SES identities but no production access. Sends are capped at 200/day to verified recipients only.

  • Governance

    SES configuration sets with no destinations

    Configuration sets with zero event destinations. They do nothing. Senders referencing them gain no tracking.

  • Governance opt-in

    SNS SMS spend

    Monthly SNS SMS spend per region over the last 30 days. Requires Cost Explorer.

  • Governance

    SNS topics with no subscriptions

    Topics with zero confirmed or pending subscriptions. Publishes go nowhere; common leftover after a workload moves off SNS.

  • Governance

    SQS dead-letter queues growing

    Dead-letter queues holding > 1000 messages. Signals a broken consumer whose failures nobody is redriving.

  • Governance

    Security group unused (no attachments)

    Non-default security group is attached to zero ENIs/resources, accumulating audit noise.

  • Governance

    Service Catalog products never provisioned

    Catalog products with zero provisioned instances. Offerings nobody launches. Clutters the self-service catalog.

  • Governance

    Snow Family jobs completed but not cleaned up

    Snowball/Snowcone jobs in a Complete/Cancelled state older than 90 days. No ongoing charge, but stale inventory worth tidying.

  • Governance uses metrics

    Step Functions never executed

    State machines older than 30 days with zero executions over the lookback. Abandoned workflow definitions.

  • Governance

    Tag coverage report

    Account-wide summary of how many resources carry each of the common governance tags (Environment, Owner, CostCenter). Pure reporting. No dollar savings. Surfaces tagging debt for FinOps.

  • Governance uses metrics

    Unused SES identities

    Verified identities in regions with zero sends over the lookback, or identities with sending disabled. Cleanup.

  • Governance

    WAFv2 rules with no traffic

    WAFv2 rules whose 7-day sampled-request population is zero. Each rule bills $1/month independent of whether it has matched any traffic.

  • Network uses metrics

    CloudFront unused distributions

    Distributions with zero requests for 30 days. Common forgotten test/staging deployments still tying up CNAMEs and cert bindings.

  • Network opt-in

    Data transfer top talkers

    Costliest data-transfer usage types (inter-AZ, NAT, inter-region, internet egress) over the last 30 days. Requires Cost Explorer.

  • Network uses metrics

    Direct Connect ports running under-utilized

    Dedicated Direct Connect ports averaging < 5% of the provisioned speed. The flat per-port hourly fee scales with speed, so downgrading one tier is a large recurring saving.

  • Network

    ELB Classic migration candidate

    Classic Load Balancers are in maintenance mode. ALB (for HTTP/HTTPS) or NLB (for TCP) is the recommended successor with cheaper LCU pricing and modern features (HTTP/2, WAF, WebSockets, gRPC).

  • Network

    Global Accelerator with no endpoints

    Enabled accelerators with no endpoints behind any listener. The flat $0.025/hr per-accelerator fee bills while routing to nothing.

  • Network uses metrics

    Idle Application Load Balancers

    Application LBs with < 100 requests/day for 14+ days. Idle LBs still pay the hourly base charge.

  • Network

    Lightsail load balancers with no targets

    Load balancers with zero attached instances. The flat $18/month fee bills regardless.

  • Network uses metrics

    NAT Gateways with low traffic

    NAT Gateways processing < 1 GB/day for 30 days. Often replaceable with VPC endpoints (S3, DynamoDB, ECR) at zero per-hour cost.

  • Network uses metrics

    Network Load Balancers with no traffic

    Network Load Balancers with avg ActiveFlowCount below 1 over 14+ days. NLBs pay the hourly base regardless of traffic.

  • Network

    Route 53 orphaned health checks

    Health checks not referenced by any record set in any hosted zone. $0.50/check/month - small individually, accumulate quickly.

  • Network uses metrics

    Transit Gateway attachments unused

    Transit Gateway attachments (VPC / VPN / DX / peering) that have forwarded effectively zero bytes in the lookback window. Each active attachment is billed $0.05/hr regardless of traffic.

  • Network

    Unattached Elastic IPs

    Elastic IPs without an active association. AWS bills idle EIPs by the hour - small per-EIP, big in aggregate.

  • Network uses metrics

    VPC endpoints unused

    Interface / GatewayLoadBalancer VPC endpoints with effectively zero BytesProcessed in the lookback window. Billed per AZ per hour regardless of traffic.

  • Security

    ACM Private CA unused

    ACM Private CA in ACTIVE state with no state change in 90 days. $400/CA/month while it exists - real money for an unused CA.

  • Security

    ACM certificate expiring soon

    Certificates with NotAfter within 30 days that are referenced by an AWS resource. CRITICAL - misses here cause customer outages.

  • Security

    ACM certificates not in use

    Issued certs with empty InUseBy. Free at AWS, but adds review noise and IaC drift; safe to delete after a final ownership check.

  • Security

    ALB HTTP listener without HTTPS redirect

    Application Load Balancers with a port-80 HTTP listener whose default action is not a redirect to HTTPS. Traffic between client and ALB is unencrypted.

  • Security

    AMI is public

    Self-owned EC2 AMIs with launchPermission shared as ``all``. Anyone with an AWS account can launch instances from the AMI; if it baked in secrets, they leak.

  • Security

    API Gateway methods without auth

    REST API methods configured with authorizationType=NONE and no API key required. Open to anyone on the internet.

  • Security

    API Gateway stage without WAF

    REST API stages with no Web ACL attached. WAF is the first line of defense against common L7 attacks (SQLi, XSS) and rate-limiting bots.

  • Security opt-in

    Access key unused (verified)

    Active IAM access keys never used, or unused for the entire lookback window, per iam:GetAccessKeyLastUsed. Requires CloudTrail lookup.

  • Security

    Cognito user pools without MFA

    User pools with MFA disabled and 50+ users. Credential stuffing against Cognito-hosted login pages is routine.

  • Security opt-in

    Console login without MFA

    ConsoleLogin events where MFAUsed=No over the lookback window. Password-only console access is a top account-takeover vector. Requires CloudTrail lookup.

  • Security

    EBS encryption by default disabled

    Account/region EBS encryption-by-default is off, so new volumes are created unencrypted unless each request opts in.

  • Security

    EBS snapshot is public

    EBS snapshots with createVolumePermission shared as ``all``. Anyone with an AWS account can create a volume from the snapshot and read every byte.

  • Security

    EBS volume not encrypted

    In-use EBS volumes with Encrypted=false. Data at rest on the volume (and its snapshots) is stored unencrypted.

  • Security

    EC2 IMDSv2 not enforced

    Running instance allows IMDSv1 (HttpTokens != required), exposing the metadata SSRF credential-theft path.

  • Security

    EC2 instance has public IP

    Instance has a public IPv4 association, widening the attack surface beyond private networking.

  • Security

    ECR repository policy public

    ECR repository policy grants pull/push to a wildcard principal without a restricting Condition (public or cross-account exposure).

  • Security

    ECR repository tags mutable

    ECR repository image-tag mutability is MUTABLE, allowing tags to be silently overwritten (supply-chain risk).

  • Security

    ECR scanning disabled

    ECR repositories with image scan-on-push disabled. Basic scanning is free and catches OS-package CVEs at push time. No excuse not to have it on.

  • Security

    EFS file system not encrypted

    EFS file systems with Encrypted=false, leaving file data unencrypted at rest.

  • Security

    GuardDuty disabled in region

    Region has no GuardDuty detector. GuardDuty is the AWS-managed threat-detection service; without it, malicious API calls and compromised EC2 traffic go unflagged.

  • Security

    IAM old access keys

    Access keys created more than 365 days ago. Long-lived keys are a rotation hygiene problem; short-lived sessions or roles are preferred.

  • Security

    IAM policy with Action=* Resource=*

    Customer-managed or inline policies attached to a role that Allow Action=* on Resource=* without a Condition. The IAM equivalent of 'root' for the attached principal.

  • Security

    IAM role with wildcard principal

    Roles whose AssumeRolePolicyDocument allows Principal=* (or AWS=*) without a Condition narrowing it. Lets any AWS account assume the role.

  • Security

    IAM root account access keys

    Root account has API access keys. AWS recommends never using these; compromise is account-takeover with no rotation path.

  • Security

    IAM unused users

    Users whose console login and all access keys have been idle 90+ days. Dormant users widen the attack surface.

  • Security opt-in

    IAM user with no verified activity

    IAM users with zero console or API activity across the CloudTrail lookback window (credential report + LookupEvents). Verified-unused; stronger than the age-based IAM_USER_UNUSED. Requires CloudTrail lookup.

  • Security

    IAM users without MFA

    Users with console access but no MFA device. Phishing-only path to the AWS Console; MFA shuts that down.

  • Security

    Inspector v2 not enabled

    Inspector v2 status is DISABLED for one or more of EC2 / ECR / Lambda in the region. Inspector is the AWS-managed CVE scanner; leaving services unscanned hides known vulnerabilities.

  • Security

    KMS key policy too wide

    Customer-managed KMS keys whose default policy allows ``kms:*`` from Principal=* or a cross-account principal without a ``kms:CallerAccount`` Condition.

  • Security opt-in

    KMS key unused (verified)

    Customer-managed CMKs with zero Decrypt/Encrypt/GenerateDataKey events in the lookback window. Safe-to-schedule-deletion; recovers ~$1/key/mo. Requires CloudTrail lookup.

  • Security

    KMS keys without rotation

    Customer-managed symmetric KMS keys with KeyRotationEnabled=False. Annual rotation is a one-toggle compliance + hygiene win.

  • Security

    KMS unused customer-managed keys

    Customer-managed CMKs older than 1 year. Heuristic only - true usage requires CloudTrail data events. $1/key/month adds up across many environments.

  • Security

    Lambda function URL with no auth

    Functions with a Lambda Function URL configured at AuthType=NONE. Anyone on the internet can invoke the function with no signing required.

  • Security

    Lambda resource policy wildcard principal

    Lambda resource policy grants invoke to a wildcard principal without a source ARN or account condition.

  • Security

    Load balancer weak TLS policy

    HTTPS/TLS listener uses an outdated SSL policy permitting TLS 1.0 or TLS 1.1.

  • Security

    No multi-region CloudTrail

    No multi-region CloudTrail exists in the account. Regional trails only capture API activity in their home region. Actions in any other region are invisible to audit.

  • Security

    OpenSearch domain encryption disabled

    OpenSearch domains with encryption-at-rest or node-to-node encryption disabled.

  • Security

    OpenSearch domain public endpoint

    OpenSearch domain has no VPC endpoint and an access policy that permits open/wildcard principals.

  • Security

    RDS publicly accessible

    RDS instances with PubliclyAccessible=true. The DB endpoint resolves to a public IP - one misconfigured security group away from exposure.

  • Security

    RDS snapshot is public

    Manual RDS / Aurora snapshots whose restore attribute is shared with ``all``. Anyone in AWS can restore the snapshot into their own account.

  • Security

    RDS storage not encrypted

    RDS instances with StorageEncrypted=false. Database storage, automated backups, and snapshots are unencrypted at rest.

  • Security

    Redshift cluster not encrypted

    Redshift clusters with Encrypted=false, leaving warehouse storage unencrypted at rest.

  • Security

    Redshift cluster publicly accessible

    Redshift cluster has PubliclyAccessible=true, exposing the data warehouse endpoint to the internet.

  • Security opt-in

    Root account used

    Root-account console sign-in or API activity in the CloudTrail lookback window. Root should be used essentially never. Requires CloudTrail lookup.

  • Security

    S3 Block Public Access disabled

    Buckets without all four BlockPublicAccess flags set. Public exposure risks data leaks AND unbounded egress charges from scrapers.

  • Security

    S3 bucket does not enforce TLS

    Bucket policy lacks an aws:SecureTransport=false Deny, so plaintext HTTP access to the bucket is permitted.

  • Security

    S3 bucket has ACLs enabled

    Buckets with ObjectOwnership != BucketOwnerEnforced still allow object-level ACL grants, which can bypass the bucket policy and create unexpected public access.

  • Security

    S3 bucket policy wildcard principal

    Bucket policy grants a Principal:* Allow with no restricting Condition (account / VPCE / source IP), exposing the bucket.

  • Security

    S3 buckets without default encryption

    Buckets with no default SSE rule. SSE-S3 is free and a single API call to enable; SSE-KMS is the next step for compliance.

  • Security

    S3 versioned bucket without MFA Delete

    Versioned bucket without MFA Delete, so object versions can be permanently purged without a second factor.

  • Security

    SNS topic not encrypted

    SNS topics with no KmsMasterKeyId set, so messages are not encrypted at rest.

  • Security

    SNS topics with public access policy

    Topic policies allowing Principal=* without an account-scoping Condition (aws:SourceAccount / aws:SourceOwner / aws:SourceArn). Anyone on the internet can publish or subscribe.

  • Security

    SQS queue not encrypted

    SQS queues with neither SSE-SQS nor SSE-KMS enabled, leaving messages unencrypted at rest.

  • Security

    SQS queue policy public

    SQS queue policy grants send/receive to a wildcard principal without a restricting Condition.

  • Security opt-in

    Secret never accessed

    Secrets Manager secrets with no GetSecretValue events in the lookback window. Dead weight or stale credential. Requires CloudTrail lookup.

  • Security

    Secrets Manager rotation disabled

    Actively-used Secrets Manager secrets (LastAccessedDate within 30 days) with rotation disabled. Long-lived credentials in active production code are a stale-key risk.

  • Security

    Secrets Manager unused secrets

    Secrets last accessed more than 90 days ago. $0.40/secret/month - common cleanup target in accounts with many environments.

  • Security

    Security group RDP open to the world

    Security groups with port 3389 (Windows RDP) reachable from 0.0.0.0/0 or ::/0. Frequently scanned and exploited.

  • Security

    Security group SSH open to the world

    Security groups with port 22 (SSH) reachable from 0.0.0.0/0 or ::/0. Anyone on the internet can attempt to log in - brute force / 0-day risk.

  • Security

    Security group all ports open to the world

    Security groups with -1 (all protocols) or full 0-65535 port range reachable from 0.0.0.0/0 or ::/0. Top-severity exposure.

  • Security

    Security group database ports open to the world

    Security groups with database ports (3306, 5432, 1433, 27017, 6379, 9200, ...) reachable from 0.0.0.0/0 or ::/0. Direct internet exposure of databases is a top data-breach pattern.

  • Security

    Security group egress fully open

    Security group has an unrestricted 0.0.0.0/0 all-protocol egress rule, enabling unbounded data exfiltration paths.

  • Security

    VPC flow logs disabled

    VPCs without any flow-log subscription. Flow logs are the only record of in-VPC traffic; without them, incident response has no network forensics signal.

  • Storage

    AMI sprawl (pinned snapshot storage)

    Self-owned AMIs older than 90 days with no live instances launched from them. Their pinned EBS snapshots keep paying storage charges until the AMI is deregistered.

  • Storage

    AWS Backup plans without lifecycle

    AWS Backup plan rules with no DeleteAfterDays. Recovery points accumulate forever. A daily backup with no expiry doubles storage every year.

  • Storage

    CloudWatch Logs verbose loggers

    Log groups storing > 100 GB even with retention set. Hint that a verbose logger or DEBUG-by-default config is wasting space.

  • Storage

    CloudWatch Logs without retention

    Log groups with no retention policy and > 1 GB stored. Logs accumulate forever at $0.03/GB-month - common pattern from Lambda / API Gateway.

  • Storage

    CodeArtifact domains unused

    CodeArtifact domains with zero repositories but residual asset storage. Storage bills $0.05/GB-month regardless of whether any repository remains.

  • Storage

    DataSync tasks never executed

    Transfer tasks with no execution history. DataSync bills per-GB transferred, so these carry no ongoing charge. But they're stale config, usually a migration that never happened.

  • Storage uses metrics

    EBS provisioned IOPS over-allocated

    io1 / io2 / above-baseline gp3 volumes whose observed peak VolumeReadOps+WriteOps sit well below the provisioned IOPS. Provisioned IOPS are billed separately from the volume's storage charge.

  • Storage

    EBS volume rightsizing (Compute Optimizer)

    EBS volumes Compute Optimizer flags for a cheaper type / IOPS / throughput configuration, with CO's estimated monthly savings.

  • Storage

    ECR repositories large + stale

    ECR repositories holding 1+ GB of images whose newest image was pushed more than 90 days ago. ECR doesn't expose pull counts, but a repo with no recent push activity is a strong proxy for an abandoned image set still paying storage.

  • Storage

    ECR repositories without lifecycle policy

    Private ECR repositories with no lifecycle policy attached. Without one, every pushed image (including untagged CI intermediates) accumulates at $0.10/GB-month.

  • Storage

    EFS without lifecycle policy

    EFS file systems > 100 GB without a transition-to-IA policy. EFS Standard is 12x more expensive than IA per GB-month.

  • Storage uses metrics

    FSx file systems with low usage

    File systems whose daily read+write volume is < 5% of provisioned capacity for 14+ days. Capacity bills regardless.

  • Storage

    FSx manual backup sprawl

    File systems with > 100 user-initiated backups or a manual backup older than 180 days. FSx never expires manual backups.

  • Storage

    Idle EBS Fast Snapshot Restore

    Fast Snapshot Restore enabled per snapshot per AZ bills ~$0.75/hr (~$540/month) whether or not volumes are restored from it.

  • Storage

    Orphaned AWS Backup recovery points

    Recovery points older than 7 days whose source resource ARN is not present in the current scan. Likely safe to delete after a final review.

  • Storage

    Orphaned EBS snapshots

    Snapshots whose source volume no longer exists, older than 30 days. Likely safe to delete after a final review.

  • Storage

    RDS manual snapshots > 90 days

    Manual RDS DB / cluster snapshots older than 90 days. Snapshot storage bills $0.095/GB-month indefinitely. Clean up the long tail of one-off pre-change snapshots.

  • Storage

    S3 Intelligent-Tiering candidate

    Buckets > 1 TB in Standard with no Intelligent-Tiering configuration and no lifecycle transition. IT auto-moves cold objects to IA / Archive at no retrieval cost.

  • Storage

    S3 buckets with cold-data candidates

    Buckets > 10 GB in Standard with no lifecycle transition. Recommend Intelligent-Tiering (no retrieval fees) or IA / Glacier with honest retrieval-discounted savings.

  • Storage

    S3 incomplete multipart uploads

    Buckets without an AbortIncompleteMultipartUpload rule. Failed multipart uploads accumulate paid storage indefinitely.

  • Storage

    S3 versioning without lifecycle

    Buckets with versioning enabled but no rule expiring noncurrent versions. Old object versions accumulate forever - silent cost leak.

  • Storage uses metrics

    Storage Gateways with no cloud activity

    Running gateways with near-zero CloudBytesUploaded/Downloaded over the lookback. The gateway host keeps costing money after the workload moves off.

  • Storage

    Unattached EBS volumes

    EBS volumes in 'available' state for 7+ days. Pay full storage cost for nothing - usual cause is forgotten cleanup after instance terminate.

  • Storage

    Unattached Lightsail disks

    Additional block-storage disks not attached to any instance. They bill per GB-month while holding stale data.

  • Storage

    gp2 to gp3 migration

    gp2 volumes safe to migrate to gp3 in-place. ~20% cheaper, no downtime, matches gp2 baseline performance for volumes within 3000 IOPS.

Checks marked opt-in use a paid or billing-data cloud API and never run unless you switch them on. A default scan uses only free APIs.

How you connect

A read-only IAM role (or access keys)

One-click CloudFormation / Terraform from the dashboard, scoped with an ExternalId you control.

AWS-managed SecurityAudit + ViewOnlyAccess. No write access, ever. Revoke it any time in your console.

How the dollars are calculated

Live AWS bulk pricing per region, with a curated baseline as offline fallback. Every finding records its pricing source.

Every finding is backed by the raw cloud API response it came from, with a confidence score and the pricing source labelled, no black-box numbers.

Scan your AWS estate free

Connect a read-only iam role (or access keys) and run a read-only scan. Findings come priced in real dollars with a fix and the evidence for each.

Start scanning free

Other clouds we scan