235 AWS cost optimization checks, and an honest account of where they stop.
- Detection rules
- 235 built in
- Service families
- 15 covered
- Regions
- All enabled, unless pinned
- Window
- Trailing 30 days, run rate
- Finding key
- account + region + rule + resource
Eleven things the output does on every run
- 01
235 AWS cost checks on every scan
Storage, compute, networking, databases, serverless, containers, ML and governance. Each one named, each one identifiable on the finding it raises.
- 02
Savings Plans and reserved-instance coverage
Savings Plans coverage as a share of eligible spend, reserved instance coverage as a share of eligible hours, and a purchase sized to steady-state usage.
- 03
Every enabled AWS region
Not a default list, not the regions that happened to be cheap to query. Every region enabled on the account, unless the operator pins the list deliberately.
- 04
Prints the arithmetic
Each estimate carries its terms. Multiply the printed terms and you land on the printed saving, exactly.
- 05
Reconciles findings against the bill
Findings are checked back against billed line items, and the items no rule covers are listed as plainly as the ones that are.
- 06
Refuses to invent data
A failed or empty call is skipped and logged loudly. It is never quietly rendered as a zero, and a price is never guessed: where your bill carries the usage, a finding is priced at what you actually paid per unit over the last 30 days - after your free allowances and discounts - and the finding says so; where it does not, the finding prints the quantity and says why.
- 07
Asks AWS for a second opinion
Cost Optimization Hub and Compute Optimizer are read on every scan. Each finding says whether AWS agrees, is silent, or raised it alone; AWS's estimate is printed beside Kostrix's, never added to it.
- 08
Reads the AI bill by model
Bedrock spend by provider, model, inference type and feature, with the token mix; models paying on-demand with no batch inference, sending input with no prompt caching, or holding provisioned throughput below its break-even are flagged - priced from your own bill and AWS's published ratios, never a guess.
- 09
Allocates what the tags miss
Allocation rules give resources without cost allocation tags a team by account, tag, name or service; shared pools are split evenly or in proportion; the unallocated remainder is listed, not spread. Your AWS Cost Categories are read and shown beside it.
- 10
Answers "what if I commit $X an hour?"
Pick a Savings Plan type, term, payment option and hourly commitment: coverage, utilization, net saving and break-even over your recent on-demand usage, hour by hour, with AWS's own recommendation beside it. Nothing is bought from the page.
- 11
Names the cause of a spend spike
Daily spend is tested per service, per region and per member account, AWS Cost Anomaly Detection is read where it is on, and the CloudTrail change events of that day are attached: who launched or changed what.
Every check, with the identifier it puts on a finding.
Fifteen service families, counted below and listed in full under them: open a family to read each check and the rule identifier it stamps on its findings.
The checks cover unattached EBS volumes and orphaned snapshots, idle and stopped EC2 instances, unassociated Elastic IPs, NAT gateways moving no bytes, load balancers with no healthy targets, RDS and ElastiCache instances nobody connects to, over-provisioned DynamoDB tables, idle Lambda functions, EKS and ECS waste, GPU boxes sitting warm, SageMaker endpoints and Bedrock provisioned throughput nobody calls, plus Graviton and Spot migration candidates and public IPv4 charges. Each check is priced from the AWS Price List API for the region the resource sits in; where a rate cannot be fetched the finding is still raised, without a figure attached.
Two families are written up in full, with the metric each check reads: unused EBS volumes and orphaned snapshots and idle EC2 instances, RDS databases, NAT gateways and load balancers.
| Service family | Checks | |
|---|---|---|
| Block storage and object storage | 25 | |
| EC2 and compute | 22 | |
| Networking, CDN and edge | 27 | |
| Databases and caches | 36 | |
| Analytics, streaming and search | 26 | |
| Serverless and integration | 15 | |
| Machine learning and AI | 15 | |
| Security and compliance | 22 | |
| Observability and governance | 18 | |
| Media and broadcast | 7 | |
| Developer tools and CI/CD | 8 | |
| IoT and edge computing | 4 | |
| Communications and application services | 5 | |
| Commitments | 3 | |
| End-user computing | 2 | |
| Built-in detection rules | 235 |
Plus Savings Plans and reserved-instance coverage, analyzed separately.
Block storage and object storage
25 checksEBS volumes and snapshots, S3 buckets, EFS file systems, AWS Backup, Storage Gateway, FSx and Transfer Family
ShowHide the 25 checks
- EBS volumes unattached or attached with zero I/O
ebs-unattached - Orphaned or aged EBS snapshots
ebs-snapshot-orphans - gp2 volumes cheaper as gp3
ebs-gp2-to-gp3 - Incomplete multipart uploads and missing lifecycle policies
s3-hygiene - Large Standard-class buckets with no tiering configuration
s3-intelligent-tiering - io1/io2 volumes that fit inside gp3's performance envelope
ebs-io-rightsize - Fast Snapshot Restore enabled on snapshots nothing has been restored from
ebs-fsr-idle - EFS file systems with no client connections and no I/O over the lookback
efs-idle-filesystem - EFS file systems on Provisioned Throughput driving far less than they pay for
efs-provisioned-throughput-idle - EFS file systems with no IA or Archive lifecycle transition while their data looks cold
efs-lifecycle-absent - Regional EFS file systems whose mount targets all sit in one Availability Zone
efs-one-zone-candidate - S3 buckets holding stale incomplete multipart upload parts, billed and invisible to object listings
s3-incomplete-multipart-uploads - Versioning-enabled S3 buckets with no whole-bucket noncurrent-version expiration rule
s3-noncurrent-version-bloat - S3 lifecycle rules archiving objects small enough that per-object overhead swamps the saving
s3-archive-small-object-overhead - S3 Intelligent-Tiering monitoring fee paid on objects too small ever to tier
s3-intelligent-tiering-small-object-fee - Long-retained standalone EBS snapshots in the standard tier that are archive-tier candidates
ebs-snapshot-archive-candidates - AWS Backup recovery points whose source resource no longer exists and which never expire
backup-orphaned-recovery-points - Long-retention AWS Backup plans that never transition recovery points to cold storage
backup-cold-storage-lifecycle-absent - Storage Gateway with no traffic for 30 days still holding billable volumes or virtual tapes
storage-gateway-idle - FSx file system (Windows, Lustre, ONTAP or OpenZFS) with no data read or written for 30 days
fsx-idle-filesystem - FSx for Windows / ONTAP / OpenZFS provisioned at a throughput tier far above its measured ceiling
fsx-throughput-overprovisioned - FSx for ONTAP volumes pinned to SSD with capacity-pool tiering disabled
fsx-ontap-tiering-absent - AWS Transfer Family servers billing protocol-hours for SFTP/FTPS/FTP/AS2 endpoints with zero confirmed transfer activity in 30 days
transfer-family-protocol-idle - S3 Batch Operations jobs billed for failed task attempts alongside successful ones
s3-batch-operations-failed-billed - S3 Storage Lens configurations on the paid advanced-metrics tier, sized by objects monitored
s3-storage-lens-advanced-metrics-cost
EC2 and compute
22 checksInstances, images, addresses, purchase mode, container capacity, Lightsail, GameLift, AppStream and Outposts
ShowHide the 22 checks
- Elastic IPs not associated with any resource
eip-unassociated - Running instances with negligible CPU and network
ec2-idle - Long-stopped instances still billing for storage
ec2-stopped - AMIs referenced by no instance
ami-unreferenced - Dev/test instances running 24×7
offhours-candidates - x86 instances with a drop-in Graviton equivalent at a lower On-Demand rate
graviton-migration - Underutilized EC2/RDS instances with a cheaper same-family size
ec2-rds-rightsizing - Interruption-tolerant On-Demand workloads that could run on Spot
spot-candidates - Fargate services idle or oversized for their reserved task size
ecs-rightsizing - EKS control planes with no nodegroups, no Fargate profiles and no tagged nodes
eks-cluster-waste - GPU/accelerator instances with near-idle CPU
gpu-idle - Dedicated Hosts running no instances, or packed below half capacity
dedicated-host-underutilized - Running instances on previous-generation x86 families that cost more than the same-size current-generation equivalent
ec2-previous-generation-family - T-family instances in unlimited mode paying surplus CPU credit charges above the cost of a fixed-performance instance
ec2-burstable-surplus-credits - ECS clusters whose EC2 container instances are reserved far below capacity
ecs-ec2-cluster-packing - Licence-included SQL Server billed per vCPU on instances CPU metrics show sitting idle
sql-server-license-density - Lightsail instances billing a full monthly bundle while doing nothing, including stopped ones
lightsail-idle-instance - Lightsail static IPs, disks, snapshots and load balancers left behind after their instance is gone
lightsail-orphaned-resources - GameLift managed EC2 fleets holding ACTIVE instances with no game or player sessions, or chronic idle capacity with no scaling policy
gamelift-fleet-idle - AppStream fleets holding capacity with no streaming sessions, or chronic low utilization with no scaling policy
appstream-fleet-idle - EKS clusters billed the extended-support control-plane surcharge for running a Kubernetes version past standard support
eks-extended-support-charges - AWS Outposts racks/servers whose committed EC2 capacity sits mostly unlaunched
outposts-capacity-underutilized
Networking, CDN and edge
27 checksLoad balancers, NAT, PrivateLink, Transit Gateway, CloudFront, Route 53, Route 53 ARC, Cloud WAN, VPC Lattice and dedicated links
ShowHide the 27 checks
- Load balancers with no listeners or no healthy targets
elb-half-connected - Target groups with no registered targets
target-group-empty - NAT gateways with ~zero bytes processed
nat-idle - VPCs sending S3/DynamoDB traffic through a NAT gateway instead of a free gateway endpoint
vpc-missing-gateway-endpoints - In-use public IPv4 addresses billing $3.65/month each
public-ipv4-audit - CloudFront distributions paying for Dedicated IP custom SSL where free SNI would serve
cloudfront-dedicated-ip-ssl - Near-zero-traffic CloudFront distributions still billing through an attached paid feature
cloudfront-idle-billable-attachments - High-volume CloudFront distributions with a low cache hit rate traceable to the cache key
cloudfront-cache-hit-low - CloudFront behaviours serving compressible content with compression off or defeated by the cache key
cloudfront-compression-disabled - Transit Gateway attachments billing hourly with no bytes crossing them
tgw-attachment-idle - Interface VPC endpoints billing ENI-hours in Availability Zones with no traffic
vpce-interface-idle - Client VPN endpoints billing association-hours with nobody connecting
clientvpn-endpoint-idle - Subnet and ENI flow logs re-delivering traffic a VPC-level flow log already delivers
flow-logs-duplicate-coverage - Route 53 Resolver endpoints billing ENI-hours with no queries or no path to receive them
route53-resolver-endpoint-idle - Traffic Flow policy records still instantiated against a dead zone or dead endpoints
route53-traffic-policy-orphan - Route 53 hosted zones with no useful records, no VPC association, or no queries over 30 days
route53-hosted-zone-unused - Route 53 health checks nothing in this account references, or that have been down all window
route53-health-check-orphan - Global Accelerator accelerators billing the fixed fee while disabled, endpoint-less or flow-free
globalaccelerator-idle - Site-to-Site VPN connections billing hourly whose tunnels were down for the entire window
vpn-tunnel-never-established - Direct Connect ports billing port-hours with no virtual interface or no BGP session all window
dx-connection-or-vif-orphan - VPC IPAM billed at Advanced Tier while none of its own tier-downgrade-blocking features are configured
ipam-advanced-tier-unneeded - Route 53 ARC routing control clusters billed hourly with zero routing controls configured
route53arc-cluster-empty - Route 53 ARC readiness checks billing hourly whose audited resources read as unresolvable
route53arc-readiness-check-stale - Gateway Load Balancers billed hourly with an empty or genuinely traffic-free target group
gwlb-target-group-empty - Cloud WAN core network edges billed hourly with zero attachments or zero attachment traffic
cloudwan-edge-idle - VPC Lattice Services billed hourly with zero requests over the trailing 30 days
vpclattice-service-idle - Classic Load Balancers billed hourly with zero requests to zero healthy instances
clb-idle-zero-traffic
Databases and caches
36 checksRDS and Aurora, DynamoDB and DAX, ElastiCache, MemoryDB, DocumentDB, Neptune, Amazon MQ, Keyspaces, DMS and Timestream
ShowHide the 36 checks
- RDS instances with zero connections
rds-idle - Provisioned DynamoDB far above consumption
dynamodb-overprovisioned - ElastiCache clusters with no client connections
elasticache-idle - Provisioned DynamoDB tables with zero consumed capacity
dynamodb-idle - MemoryDB clusters with no client connections
memorydb-idle - Aurora clusters on Standard paying heavy I/O charges, or on I/O-Optimized paying the premium for trivial I/O
aurora-storage-class-mismatch - Aurora Serverless v2 clusters billed at a minimum-ACU floor they never rise above
aurora-serverless-v2-min-acu-floor - DocumentDB clusters with no connections, unused reader replicas, and over-long backup retention
documentdb-idle - Databases enrolled in RDS Extended Support for an end-of-life engine version
rds-extended-support-charges - Stopped RDS instances still billing for storage, and restarted every seven days
rds-stopped-instance-residual - Multi-AZ enabled on a database tagged non-production
rds-multiaz-nonproduction - RDS instances on previous-generation classes with a cheaper current-generation equivalent
rds-previous-generation-class - Manual snapshots, orphaned snapshots and retained automated backups billing indefinitely
rds-backup-storage-sprawl - RDS Proxies with no client connections, or pointing at an unavailable target
rds-proxy-idle - RDS instances on io1/io2 or over-allocated gp2 paying for IOPS gp3 includes
rds-provisioned-iops-overpay - Neptune clusters holding a loaded graph with no query traffic, idle provisioned readers, and Serverless instances pinned at the minimum-NCU floor
neptune-idle - Aurora clones older than the measurement window whose database connections have been measured at zero throughout it
aurora-clone-sprawl - Aurora MySQL clusters with a backtrack window configured and billing whose backtrack capability has not been exercised in the measurement window
aurora-backtrack-unused - RDS instances with storage autoscaling enabled whose minimum free space never fell below the configured share of a permanently ratcheted allocation
rds-storage-highwater-mark - Amazon MQ brokers whose connection, message, producer and consumer maxima are measured at zero on every node for the whole measurement window
mq-idle-broker - Amazon Keyspaces tables over-provisioned, in the costlier capacity mode, or billing storage and PITR with no query traffic
keyspaces-capacity-mismatch - DMS replication instances (and DMS Serverless replications) billing with no running migration task
dms-idle-replication-instance - Timestream tables holding data in the memory store far longer than their metered bytes are shown to need
timestream-memory-store-retention - Performance Insights long-term retention or Database Insights Advanced mode, enabled fleet-wide, priced from the account's own bill
rds-performance-insights-retention - DAX cluster nodes billed per node-hour while serving zero cache requests
dynamodb-dax-idle - PITR and on-demand backup storage billed on a table nobody reads
dynamodb-pitr-backup-storage - Global Secondary Indexes billed for storage and throughput while never once being queried
dynamodb-gsi-unused - Standard-class tables whose measured storage-vs-throughput mix already crosses over to Standard-IA
dynamodb-standard-ia-candidate - Global-table replica regions billed full replicated-write price while serving zero local reads
dynamodb-global-table-replica-idle-reads - ElastiCache Serverless caches billed for a fixed storage floor their measured data never approaches
elasticache-serverless-storage-floor - ElastiCache snapshot storage billed above the one-free-snapshot-per-cache allowance
elasticache-backup-storage-overage - ElastiCache cache.r6gd data-tiering clusters whose measured dataset never approaches the equivalent memory-only capacity
elasticache-r6gd-tier-unused - Aurora Global Database secondary-region clusters billing full standing compute and storage with no CloudWatch evidence of read traffic
aurora-global-db-secondary-standing-cost - Aurora Global Database replicated-write-I/O charges accruing in every secondary region, proportional to primary write volume
aurora-global-db-replicated-write-io-spend - Aurora Global Database redo-log cross-region data-transfer charges billed on top of the per-I/O replication fee
aurora-global-db-cross-region-data-transfer - Timestream for InfluxDB dedicated DB instances billed hourly (plus provisioned storage) while CPU and query activity stay near zero
timestream-influxdb-instance-idle
Analytics, streaming and search
26 checksRedshift, OpenSearch and OpenSearch Serverless, EMR, Glue, Kinesis, Firehose, MSK, Athena, QuickSight, CloudSearch, MWAA, Managed Flink and OpenSearch Ingestion
ShowHide the 26 checks
- Redshift clusters with no database connections
redshift-idle - OpenSearch domains with no search or indexing traffic
opensearch-idle - EMR clusters alive and idle with auto-termination disabled
emr-cluster-idle-waiting - EMR Serverless pre-initialized capacity billing while idle
emr-serverless-preinit-idle - Glue ETL jobs allocating far more workers than any run needed
glue-job-worker-overprovisioned - Kinesis provisioned streams holding shards far above measured throughput
kinesis-stream-rightsizing - Registered Kinesis enhanced fan-out consumers that never retrieve a byte
kinesis-efo-consumer-unused - MSK provisioned brokers sized far above measured CPU
msk-broker-overprovisioned - Firehose delivery streams paying the 5 KB record-rounding surcharge
firehose-small-record-surcharge - Athena workgroups with no enforced per-query data-scanned cap
athena-workgroup-scan-guardrail - Scheduled Glue crawlers re-crawling everything against a catalogue that never changes
glue-crawler-full-recrawl-waste - OpenSearch dedicated master nodes several sizes larger than the cluster state requires
opensearch-dedicated-master-oversized - OpenSearch domains carrying EBS capacity the cluster has never come close to using
opensearch-hot-storage-overprovisioned - Redshift concurrency scaling burning past its free credits
redshift-concurrency-scaling-overspend - MSK broker EBS storage and provisioned throughput far above what CloudWatch shows the cluster using
msk-storage-overprovisioned - QuickSight paid seats held by disabled users, content-less authors, and unconfigured Pro tiers
quicksight-inactive-paid-seats - SPICE datasets nothing references, still billing per GB-month
quicksight-spice-orphaned-datasets - Long-running EMR clusters with no managed scaling and YARN headroom their own metrics say they never needed
emr-managed-scaling-absent - Redshift DC2/DS2 automated and manual snapshot storage exceeding the free provisioned-storage allowance
redshift-snapshot-storage-overage - Redshift cross-region snapshot copies billing full S3-rate storage in the destination region with no free allowance
redshift-cross-region-snapshot-copy-storage - MWAA environments billing their full base/scheduler/worker hours while zero DAG tasks execute
mwaa-environment-idle - Managed Service for Apache Flink applications billing their KPU floor idle, or manually pinned above it at low CPU
flink-kpu-idle-overprovisioned - OpenSearch Ingestion pipelines billing their configured minimum-OCU floor continuously while ingesting little or no data
osis-pipeline-ocu-floor-idle - Legacy CloudSearch domains billing search-instance-hours with zero successful search requests in 30 days
cloudsearch-domain-idle - Standalone Glue Data Quality runs that failed mid-execution after already billing the DPU-seconds consumed
glue-data-quality-run-failed-billed - OpenSearch Serverless collections with no search or ingestion request in the window, which still hold the account's OCU floor
aoss-collection-idle
Serverless and integration
15 checksLambda, API Gateway, Step Functions, SQS, SNS and EventBridge
ShowHide the 15 checks
- Lambda functions with zero invocations in 30 days
lambda-idle - x86 Lambda functions that would bill ~20% less on arm64
lambda-graviton - Lambda provisioned concurrency that nothing invoked
lambda-provisioned-concurrency-idle - API Gateway stage caches billing by the hour while serving few or no cache hits
apigw-stage-cache-unused - REST API stages billed at REST rates while using only features an HTTP API supports
apigw-rest-to-http-api - Lambda functions billing GB-seconds against memory their measured peak never approaches
lambda-memory-overallocated - Lambda functions whose recursive invocation loops AWS had to terminate, and functions with loop detection disabled
lambda-recursive-loop-burn - High-volume, short-lived Standard Workflows that meet every Express Workflow eligibility gate
sfn-standard-to-express - SQS queues short-polling hard enough that most billed ReceiveMessage calls return nothing
sqs-short-poll-empty-receives - SNS topics billing publish requests with zero live subscriptions to deliver to
sns-topic-no-live-subscribers - API Gateway, Step Functions and AppSync resources pinned to their most verbose logging setting, driving CloudWatch Logs ingestion charges
managed-service-log-verbosity - EventBridge archives on indefinite retention, large and old, with no replay in the account's replay history
eventbridge-archive-never-replayed - Express Step Functions workflows whose billed memory is inflated far above the 64 MB minimum by oversized payloads
sfn-express-billed-memory - Standard Step Functions state machines burning billed state transitions on executions that fail, abort or time out
sfn-failed-execution-transitions - Lambda functions provisioning /tmp above the 512 MB free allotment, billing a per-GB-second overage on every invocation
lambda-ephemeral-storage-overprovisioned
Machine learning and AI
15 checksBedrock, SageMaker, Comprehend, Kendra, Rekognition, Personalize and Q Business
ShowHide the 15 checks
- Bedrock provisioned throughput billing hourly with near-zero invocations
bedrock-spend-guard - SageMaker endpoints with zero invocations
sagemaker-endpoint-idle - SageMaker notebook instances left running with no Jupyter activity
sagemaker-notebook-idle - SageMaker Studio apps left InService, billing an ML instance with nobody using them
sagemaker-studio-app-idle - SageMaker training, processing and transform jobs that failed but were still billed
sagemaker-training-job-failed-billed - Comprehend custom-model endpoints running with no inference
comprehend-endpoint-idle - Kendra indexes billing edition base and capacity units with no queries
kendra-index-idle - SageMaker real-time endpoint variants running more instances than their traffic needs
sagemaker-endpoint-overprovisioned - SageMaker Studio spaces billing provisioned ML storage with no app attached
sagemaker-space-orphan-storage - SageMaker Feature Store online stores written to but never read
sagemaker-feature-store-online-unread - Comprehend custom-model endpoints provisioned at more inference units than they consume
comprehend-endpoint-overprovisioned - Rekognition Custom Labels model versions left in RUNNING, billing inference-unit-hours
rekognition-custom-labels-model-running - Managed MLflow tracking servers left running after the experiment ended, and servers billing while marked inactive
sagemaker-mlflow-idle - Personalize campaigns and recommenders billing a minProvisionedTPS floor with zero measured traffic
personalize-campaign-overprovisioned - Q Business indexes billing capacity units with nothing indexed, no live consumer, or capacity well past what indexed content needs
qbusiness-index-idle
Security and compliance
22 checksGuardDuty, Security Hub, WAF, Secrets Manager, KMS, ACM, Access Analyzer, Detective, Inspector, Macie, Shield, Audit Manager, Security Lake, Resilience Hub, Private CA, License Manager, CloudHSM, Directory Service and Cognito
ShowHide the 22 checks
- ACM certificates nearing expiry
acm-expiry - GuardDuty detectors billing in regions where the account holds no workload to analyse
guardduty-idle-region-spend - Security Hub CSPM billing per check in regions where the account holds no resources to check
securityhub-idle-region-standards - WAFv2 REGIONAL web ACLs billed with no associated resource (CloudFront-scope ACLs are not assessed)
waf-webacl-unassociated - Secrets billed monthly that have not been retrieved in the trailing 90 days, and their separately-billed replicas
secretsmanager-unused-secrets - Customer-managed KMS keys billed monthly while disabled or pending deletion (unreferenced-key detection is deliberately not attempted)
kms-idle-cmk-billing - IAM Access Analyzer internal-access analyzers billing $9/resource/region/month against an over-broad inclusion rule
access-analyzer-internal-access-scope - Unused-access analyzers billing $0.20/principal/month, duplicated or spent on long-dead IAM principals
access-analyzer-unused-access-dead-principals - Detective behaviour graphs ingesting at $2/GB, including data-source packages for services the account does not run
detective-graph-and-package-scope - GuardDuty Runtime Monitoring billed per vCPU on compute this scan can independently show is idle or stopped
guardduty-runtime-monitoring-scope - Inspector Lambda code scanning and CIS assessment schedules billed across the whole fleet, including never-invoked functions
inspector-paid-addon-scope - Macie automated sensitive-data discovery scoped over log, backup and analytics buckets at $1/GB inspected
macie-discovery-scope - Shield Advanced's flat $3,000/month subscription protecting zero or vanished resources
shield-advanced-unused-subscription - S3 buckets encrypted with SSE-KMS but without S3 Bucket Keys enabled, multiplying KMS request charges
kms-sse-kms-without-bucket-keys - ACTIVE AWS Private CAs billing their flat monthly operation fee with zero certificates issued in the trailing 30 days
acm-pca-idle-ca - AWS License Manager user-based subscriptions still billing a user associated to a terminated or long-stopped EC2 instance
licensemanager-usersub-orphaned-association - Audit Manager assessments billing per-resource-assessment charges that have never produced an assessment report
audit-manager-active-no-report - Security Lake data lakes ingesting, normalizing and storing log sources with zero subscribers configured to read them
security-lake-collector-no-subscribers - Resilience Hub applications already billing their monthly fee whose compliance has not been re-evaluated in over 30 days
resilience-hub-app-compliance-stale - CloudHSM clusters with billing HSMs that are not initialised or active, so they bill by the hour and serve nothing
cloudhsm-cluster-not-serving - Directory Service directories (Managed Microsoft AD, Simple AD) that are not Active or served no LDAP, Kerberos or NTLM request in the window
directory-service-idle - Cognito user pools on the Essentials or Plus tier with no sign-ins in the window, or on Plus with threat protection switched off
cognito-paid-tier-unused
Observability and governance
18 checksCloudWatch metrics, alarms, dashboards and logs, AWS Config, CloudTrail, tagging, Application Signals, CloudWatch RUM, X-Ray and Managed Grafana
ShowHide the 18 checks
- Log groups with retention set to Never Expire
logs-retention - Resources missing required cost-allocation tags
tag-hygiene - CloudWatch alarms watching EC2, RDS, ELB, Lambda, DynamoDB, ElastiCache, OpenSearch, ECS or EKS resources that no longer exist
cloudwatch-alarm-orphaned - Custom CloudWatch metrics receiving data that no in-account alarm, dashboard or metric stream consumes
cloudwatch-custom-metrics-unreferenced - Billable CloudWatch dashboards whose referenced metrics return no datapoints and which have not been modified in months
cloudwatch-dashboard-dead - CloudWatch metric streams whose destination has been failing for the whole window, or which stream every namespace in the region
cloudwatch-metric-stream-waste - High-volume Standard-class CloudWatch log groups using no Standard-only feature, eligible for the Infrequent Access class
logs-standard-to-infrequent-access - Periodic Config rules evaluating hourly, and managed rules billed twice through a conformance pack
config-rule-hourly-evaluation-frequency - Config recorders recording global IAM resource types in more than one region
config-recorder-sprawl - Config recorders on all resource types at CONTINUOUS frequency where measured churn is past the per-day break-even
config-recording-scope-and-frequency - More than one trail or Lake event data store delivering the same management events
cloudtrail-duplicate-management-trails - CloudTrail Insights billing to analyse every event while detecting nothing
cloudtrail-insights-no-detections - CloudWatch Contributor Insights rules matching nothing, or matching everything with no alarm or dashboard consuming it
contributor-insights-rules-unused - Application Signals services with measurable traffic, no SLO, and no alarm or dashboard consuming their signals
application-signals-no-objective - CloudWatch RUM app monitors sampling all sessions with every telemetry type on, on measurable high traffic
rum-appmonitor-oversampled - X-Ray sampling rules capturing traces at or near 100% on high, wildcard-scoped traffic
xray-sampling-overcollection - Transaction Search indexing above its free 1%, and the span-ingestion charge it routes onto the CloudWatch Logs bill
xray-transaction-search-indexing - Managed Grafana workspaces billing Editor licences where Viewer would do
grafana-workspace-license-audit
Media and broadcast
7 checksMediaLive, MediaConvert, MediaTailor, IVS, MediaConnect and Kinesis Video Streams
ShowHide the 7 checks
- MediaLive channels left RUNNING with no usable input or no delivered output
medialive-channel-idle - Active MediaLive reservations billing more reserved capacity than measured channel usage in their specification bucket
medialive-reservation-idle - MediaConvert reserved-slot queues whose measured transcoding is far below the reserved commitment
mediaconvert-reserved-queue-underused - MediaTailor Channel Assembly channels running with zero or near-zero manifest requests
mediatailor-channel-idle - IVS channels billing continuous video input with essentially no delivered viewer time
ivs-input-without-viewers - MediaConnect flows billed the full flow-hour rate for 30 days with every configured source never connected
mediaconnect-flow-source-lost - Kinesis Video Streams streams ingesting and storing footage nobody has read back in 30 days
kinesisvideo-stream-no-consumer
Developer tools and CI/CD
8 checksCodeBuild, CodePipeline, CloudFormation, Batch, Q Developer, DevOps Guru and Migration Hub Refactor Spaces
ShowHide the 8 checks
- CodeBuild reserved-capacity fleets provisioned far above the build minutes routed to them
codebuild-fleet-underutilized - CodeBuild projects spending billed minutes re-downloading sources and installing dependencies with caching disabled
codebuild-cache-disabled - CodePipeline pipelines on the wrong V1/V2 pricing model for how much they actually run
codepipeline-pricing-model-mismatch - Failed and abandoned CloudFormation stacks still holding chargeable resources
cfn-stack-orphans - Managed AWS Batch compute environments holding a non-zero minvCpus floor with no jobs running
batch-compute-env-idle-floor - Amazon Q Developer Pro seats billed at $19/user/month with zero recorded IDE activity in the trailing 30 days
qdeveloper-pro-seat-idle - Refactor Spaces environments billed hourly with zero measured traffic through any of their routes
refactorspaces-environment-idle - DevOps Guru analysing resources (billed per resource-hour) with no insight produced in 90 days
devops-guru-no-insights
IoT and edge computing
4 checksIoT Device Management, IoT Device Defender, IoT SiteWise and Ground Station's satellite contacts
ShowHide the 4 checks
- AWS IoT fleet-indexing index-update spend with no visible query consumer
iot-fleet-indexing-unqueried - IoT Device Defender ML Detect profiles billing datapoints with models that never activated, unused retained metrics, and double-counted metrics
iot-mldetect-model-not-active - IoT SiteWise storage left at unlimited hot-tier retention, and disassociated time-series storage left enabled
sitewise-hot-tier-unbounded-retention - Ground Station reserved-minute allocation going unscheduled across complete calendar months
groundstation-reserved-minutes-unused
Communications and application services
5 checksConnect, SES, WorkMail, Amplify and AppFlow
ShowHide the 5 checks
- Amazon Connect phone numbers claimed but not routable, or claimed against an instance with no call traffic
connect-phone-number-idle - SES dedicated IPs at a flat monthly rate that no configuration set or identity default routes mail through
ses-dedicated-ip-unrouted - Enabled WorkMail mailboxes that have never accumulated any mail
workmail-empty-mailbox - Amplify branches auto-building on every push while serving no custom domain, and stale pull-request preview branches
amplify-branch-build-waste - Scheduled AppFlow flows billing a run fee on every poll that returns nothing, or that fail every time
appflow-idle-scheduled-flow
Commitments
3 checksReserved instances and capacity reservations examined as resources in their own right
ShowHide the 3 checks
- On-Demand Capacity Reservations whose reserved slots go unoccupied: an active ODCR bills the full On-Demand rate for every slot whether an instance sits in it or not, so a half-empty reservation is a 100%-on-demand charge for air. Measured over the trailing 30 days from AWS/EC2CapacityReservations UsedInstanceCount against TotalInstanceCount, and priced only from the account's own billed UnusedBox line item
capacity-reservation-unused - Zonal Reserved Instances stranded in an Availability Zone with no matching instances
zonal-ri-mismatch - Convertible Reserved Instances stranded on instance families the account no longer runs
convertible-ri-exchange
End-user computing
2 checksWorkSpaces
ShowHide the 2 checks
- ALWAYS_ON WorkSpaces with no user connections
workspaces-idle - ALWAYS_ON WorkSpaces whose measured usage would cost less billed AUTO_STOP
workspaces-runningmode-mismatch
A separate analysis, with its units kept apart.
Reserved instances are bought in hours. Savings Plans are bought in dollars per hour of committed spend. Blending the two coverage figures produces a percentage of nothing, so Kostrix keeps them apart and prints the denominator beside each one.
- Savings Plans coverage and utilizationshare of eligible SPEND
- How much of your Savings-Plan-eligible compute and database spend over the trailing thirty days is already covered, how much is still paying On-Demand, and how much of what you have committed to is actually being used. Spend, never a blended percentage, because a Savings Plan is bought in dollars per hour.
- Reserved instance coverage and utilizationshare of eligible HOURS
- The same two questions for reservations across EC2, RDS, ElastiCache, Redshift, OpenSearch and MemoryDB - measured in hours, because that is the unit reservations are bought in, and reported separately from Savings Plans because the remedy is a different purchase.
- Expiry cliffsscheduled cost increases
- Reservations and Savings Plans whose term ends while the workload they cover is still running. This is a forecastable increase in next month's bill, not a saving, and it is deliberately kept out of the savings total.
- Sized purchase recommendationsone per instrument
- A Compute Savings Plan for SP-eligible compute and a Reserved Instance recommendation for RDS and Redshift, each sized at 80 percent of the uncovered amount so a quiet week does not leave you holding hours you never use.
share of eligible HOURS · denominator 18,240 eligible instance-hours
share of eligible SPEND · denominator 12,880.00 USD of eligible spend
blended coverage 52.2% never printed
Savings Plans and reserved-instance coverage, measured separately: the full write-up
| Unattached volumes | 2,113 | volumes |
|---|---|---|
| Mean provisioned size | 16.00 | GB |
| Provisioned total | 33,808 | GB |
| gp3 storage rate, ap-south-1 | 0.0800 | USD / GB-month |
| Estimated monthly saving | 2,704.64 | USD / month |
2,113 x 16.00 GB = 33,808 GB
33,808 GB x 0.0800 USD/GB-month = 2,704.64 USD/month
Every term on screen, every product exact.
An estimate that cannot be recomputed by hand is a claim, not a measurement. Kostrix prints the count, the size, the rate and its source, so the saving can be verified by anyone in the room without asking us how it works.
Where prices come from
The coverage gap is a feature, not an omission.
A scanner only knows what its rules know. Kostrix therefore walks the bill and asks the opposite question: which billed line items did no rule touch? On the reference account that was 18 of 34, and those 18 appear in the product beside the savings, not in a footnote.
Without this, an unexamined service looks exactly like an examined and clean one. That is the single most expensive misreading a cost tool can encourage, and it is the reason this view exists.
- Billed line items
- 34
- Covered by a rule
- 16
- Not yet covered
- 18
Delete unattached EBS volumes
2,113 volumes · ap-south-1 · $2,704.64/month
1 decision
Grouped by the decision, not by the object.
A list of 2,113 unattached volumes is not a report, it is a chore. Kostrix pools findings by the action they require, so the row you read is the decision you have to make, priced.
- Keyed properly
- Findings are keyed by account, region, rule and resource. Resource ids are not globally unique, and a tool that assumes they are will silently merge two accounts.
- Lineage attached
- Unattached volumes name their source snapshot, the AMI that snapshot backs, and whether a launch template still references it.
- Empty is not unknown
- A rule that ran and found nothing reads as empty. A rule that could not run reads as unknown. The UI and the report distinguish them.
- Demo stays demo
- Demonstration data is never mixed into a real account view, in either direction.
An absent measurement is not a measurement of zero.
When a metrics call returns nothing, the honest output is nothing. Rendering it as zero would invent an idle fleet and a saving to go with it, and that saving would be the one someone acts on.
| Region | Mean CPU |
|---|---|
| ap-south-1 | 4.1% |
| eu-west-1 | 11.7% |
| eu-north-1 | no measurement |
