AWS savings checks
AWS opportunities in Cost Savings come from two sources: AWS Cost Optimization Hub, with AWS's own estimates, and CloudYali's own rules, which read your resources, CloudWatch metrics and Cost & Usage Report. Both run once a day.
AWS Cost Optimization Hub
CloudYali collects every active Cost Optimization Hub recommendation in each connected account. The monthly savings is AWS's estimate. Turn on Cost Optimization Hub in the account, and Compute Optimizer for rightsizing; CloudYali reads them but does not turn them on.
| Recommendation | Category | Runbook |
|---|---|---|
| Rightsize an EC2 instance | Rightsizing | Yes |
| Rightsize an RDS instance | Rightsizing | General |
| Stop an idle EC2 instance | Wastage | Yes |
| Delete an EBS volume | Wastage | Yes |
| Delete an EC2 Auto Scaling group | Wastage | General |
| Upgrade an EBS volume to gp3 | Rightsizing | Yes |
| Move an EC2 instance to Graviton | Rightsizing | General |
| Buy a Compute Savings Plan | Commitment | Yes |
| Buy RDS Reserved Instances | Commitment | General |
Every other Cost Optimization Hub recommendation, such as Lambda, ECS on Fargate, EC2 Instance Savings Plans, SageMaker Savings Plans or ElastiCache, OpenSearch, Redshift, MemoryDB and DynamoDB reservations, appears under Other. It has no savings bucket, so it cannot be marked implemented yet.
CloudYali's rules
CloudYali's rules price most findings from AWS's public on-demand prices, refreshed weekly, and from the last 30 days of your Cost & Usage Report. Rules marked No amount find the resource but do not estimate its savings today; their opportunities show as Unconverted.
Compute
| Check | Detects | Monthly savings |
|---|---|---|
| Idle EC2 instance | Daily average CPU under 2% and network under 5 MB in and out, on all of the last 30 days | Its on-demand compute cost over the last 30 days, excluding hours covered by Reserved Instances or Savings Plans |
| Low-utilization EC2 instance | Daily average CPU under 10% on all of the last 14 days | The price difference to one size smaller in the same family |
| Intel EC2 instance | An instance on an Intel family | The price difference to the same size on Graviton |
| Graviton migration | An Intel or AMD instance with a direct Graviton equivalent | The price difference to the Graviton equivalent |
| Idle Bedrock provisioned throughput | Provisioned throughput in service for 7 days or more with no invocations | Its cost over the last 30 days |
| Unused Lambda SnapStart versions | A SnapStart version with no invocations in 90 days and no alias | Its cached memory at the SnapStart rate |
| EKS extended support | A cluster in, or within 90 days of, extended support | The extended support premium per cluster-hour |
Databases
| Check | Detects | Monthly savings |
|---|---|---|
| Idle RDS instance | No database connections for 30 days | Its on-demand compute cost over the last 30 days |
| Underutilized RDS instance | CPU under 60% and low read and write IOPS over 30 days | The price difference to one class smaller |
| Stopped RDS instance | Stopped for 5 days or more, close to AWS's automatic restart after 7 | Its allocated storage cost |
| Unused RDS Reserved Instance | A reservation with no matching running instance | The reservation's monthly cost |
| Previous-generation RDS class | An instance on db.m1 to m4, r3, r4, t1 or t2 | The price difference to the same size on a newer family |
| Oversized RDS storage | Under 25% of allocated storage used for 7 days | The cost of storage above peak use plus 20% |
| RDS on io1 or io2 storage | Provisioned-IOPS storage that gp3 could serve | The price difference to gp3 |
| RDS, Aurora, DocumentDB, ElastiCache and OpenSearch extended support | An engine version in, or within 90 days of, extended support | AWS's extended support fee for that engine |
| Inactive DynamoDB table | No reads or writes for 30 days | No amount |
| Old RDS snapshots | Any RDS snapshot older than 7 days | No amount |
| Long-retained manual RDS snapshots | A manual snapshot older than 90 days | No amount |
Storage
| Check | Detects | Monthly savings |
|---|---|---|
| EBS gp2 to gp3 | Any gp2 volume | The price difference to gp3 with matching performance |
| Underutilized EBS volume | An attached volume with almost no reads or writes for 15 days | Its storage cost |
| EBS performance | Provisioned IOPS or throughput above what the volume uses on 90% of 30 days | The cost of the unused IOPS and throughput |
| Unattached EBS volume | A volume attached to nothing | No amount |
| Snapshot of a deleted volume | A snapshot whose source volume no longer exists | No amount |
| Old EBS snapshot | A snapshot older than 120 days | No amount |
| EFS Intelligent-Tiering off | No Infrequent Access lifecycle on a file system | Half the data moved to Infrequent Access |
| Unused EFS | A file system with no mount targets | No amount |
| Inactive EFS | No client connections or IO for 30 days | No amount |
| S3 incomplete multipart uploads | Incomplete uploads older than 30 days | Their storage at the S3 Standard rate |
| ECR repository without a lifecycle policy | No lifecycle policy on a repository | Untagged images older than 90 days at $0.10 per GB |
| CloudWatch log group kept forever | A log group with no retention period | The storage cost of logs older than 90 days |
Networking and other
| Check | Detects | Monthly savings |
|---|---|---|
| Unused Elastic IP | An Elastic IP address attached to nothing | $3.65 |
| Inactive NAT gateway | No outbound traffic for 30 days | No amount |
| Unused load balancer | A load balancer with no listener or no target group | No amount |
| Unused internet gateway | An internet gateway attached to no VPC | No amount; AWS does not charge for it |
| Unused secret | A secret not read for 90 days | No amount |
| Redundant CloudTrail trails | More than one trail; the first is free | No amount |
Three rules have their own runbook: EBS gp2 to gp3, unused Elastic IP and idle RDS instance. Every other opportunity shows a general runbook in its details.