Our services
If you can think it, we can make it brainsoft.
If you can think it, we can make it brainsoft.
Written By: BrainSoft In DevOps
Cloud bills are dense. They list dozens of services, some with cryptic names, and the total at the bottom gets approved without much thought. But buried in that spreadsheet are "quiet" line items: small recurring charges that add up to real money over a quarter. Most teams don't notice them until finance asks why the bill jumped.
Here's a direct approach: treat your cloud bill like a code review. You read it line by line, question anything you don't recognize, and remove what isn't needed. In this post I'll walk you through the steps to audit your bill, identify waste, and cut costs without touching your core infrastructure. If you'd rather have a second pair of eyes, get in touch and we can review it together.
Don't rely on the dashboard summary. Download the detailed usage report from your cloud provider. For AWS, use the Cost and Usage Report; for Azure, the Cost Management exports; for GCP, the BigQuery billing export. You want a CSV or JSON with every line item, including resource IDs and tags.
# Example: AWS CLI to create a CUR in S3
aws cur put-report-definition --report-definition file://cur.jsonOpen the export in a spreadsheet or use a query. Sort by total cost descending. Then sort by number of line items. High-frequency small charges are often the quiet ones: data transfer, API requests, storage snapshots, or per-second charges.
Resources without tags are easy to forget. Use your cloud provider's cost allocation tags to group spending. Anything untagged is a candidate for review. For example, an old S3 bucket or a detached load balancer can sit there accruing charges.
# AWS CLI: list untagged volumes
aws ec2 describe-volumes --filters "Name=tag:Name,Values=" --query 'Volumes[*].VolumeId'Check for EC2 instances or databases running 24/7 when they're only needed during business hours. Also look for instances with low CPU utilization. Right-size them or schedule start/stop. Use AWS Compute Optimizer or Azure Advisor for recommendations, but verify manually.
Data transfer out to the internet is often a hidden cost. Look at which services are generating egress. Sometimes moving a workload to a different region or using a CDN can reduce costs. Also check inter-region transfer, which is easy to forget.
Snapshots, old backups, and infrequently accessed objects can be moved to cheaper storage tiers or deleted. Set up lifecycle policies to automatically transition objects to Glacier or delete old snapshots.
# AWS CLI: add lifecycle rule to S3 bucket
aws s3api put-bucket-lifecycle-configuration --bucket my-bucket --lifecycle-configuration file://lifecycle.jsonLook for old load balancers, elastic IPs, or unused NAT gateways. These can be deleted. Also check for duplicate resources created by accident (e.g., two databases for the same app).
If you have steady usage, consider purchasing reserved capacity or savings plans. This can cut compute costs by up to 60-70%. But only commit to what you'll definitely use.
Finally, create a budget that triggers an alert when spending exceeds a threshold. This way you catch spikes early, not at the end of the month.
Common ones include data transfer fees, especially egress, storage snapshots that are never deleted, idle load balancers, detached IPs, and small API request charges. Also look for per-second billing charges that accumulate from short-lived resources.
Use your cloud provider's cost analysis tools to filter by resource ID and look at last usage date. For example, AWS Trusted Advisor shows idle resources. You can also run scripts to list resources with no tags or with no recent activity.
Third-party tools can help, but they add another cost. Start with native tools like AWS Cost Explorer, Azure Cost Management, or GCP's billing reports. If you need more complex analysis or multi-cloud visibility, consider a tool, but only after you've done the manual review.