[{"data":1,"prerenderedAt":695},["ShallowReactive",2],{"blog-en-aws-cost-review-small-teams":3},{"_path":4,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":8,"description":9,"date":10,"slug":11,"author":12,"image":13,"tags":14,"body":19,"_type":689,"_id":690,"_source":691,"_file":692,"_stem":693,"_extension":694},"/en/blog/aws-cost-review-small-teams","blog",false,"","How I review AWS costs for small teams without turning it into a FinOps project","A realistic, actionable AWS cost review process for teams that can't justify a full FinOps function — and don't need one.","2026-04-01","aws-cost-review-small-teams","Alejandro Rodríguez","/og-image.png",[15,16,17,18],"aws","finops","cost-optimization","consulting",{"type":20,"children":21,"toc":672},"root",[22,30,36,41,48,53,78,84,89,112,117,121,127,134,168,171,177,242,245,251,318,321,327,386,389,395,470,473,479,525,528,534,580,583,589,594,604,614,624,634,637,643,648,653,658],{"type":23,"tag":24,"props":25,"children":27},"element","h1",{"id":26},"how-i-review-aws-costs-for-small-teams-without-turning-it-into-a-finops-project",[28],{"type":29,"value":8},"text",{"type":23,"tag":31,"props":32,"children":33},"p",{},[34],{"type":29,"value":35},"Most teams I work with have the same problem: they know their AWS bill is higher than it should be, but they don't have the time or headcount to run a proper FinOps program. They're not a bank. They don't have a dedicated cost team. What they have is an engineer or two who care, and a CTO who's nervous about the bill at the end of every month.",{"type":23,"tag":31,"props":37,"children":38},{},[39],{"type":29,"value":40},"So this is the process I actually use when doing a cost review for a small team. It's deliberately simple. The goal isn't perfect cloud economics — it's making the most impactful changes with the least operational disruption.",{"type":23,"tag":42,"props":43,"children":45},"h2",{"id":44},"who-this-is-for",[46],{"type":29,"value":47},"Who this is for",{"type":23,"tag":31,"props":49,"children":50},{},[51],{"type":29,"value":52},"Engineering teams of 3–30 people on AWS who:",{"type":23,"tag":54,"props":55,"children":56},"ul",{},[57,63,68,73],{"type":23,"tag":58,"props":59,"children":60},"li",{},[61],{"type":29,"value":62},"have never done a formal cost review",{"type":23,"tag":58,"props":64,"children":65},{},[66],{"type":29,"value":67},"are spending somewhere between $2,000 and $30,000/month",{"type":23,"tag":58,"props":69,"children":70},{},[71],{"type":29,"value":72},"don't have dedicated FinOps, platform, or SRE headcount",{"type":23,"tag":58,"props":74,"children":75},{},[76],{"type":29,"value":77},"want to stop wasting money without spending weeks on it",{"type":23,"tag":42,"props":79,"children":81},{"id":80},"when-to-use-this-checklist",[82],{"type":29,"value":83},"When to use this checklist",{"type":23,"tag":31,"props":85,"children":86},{},[87],{"type":29,"value":88},"Use this when:",{"type":23,"tag":54,"props":90,"children":91},{},[92,97,102,107],{"type":23,"tag":58,"props":93,"children":94},{},[95],{"type":29,"value":96},"the AWS bill has grown noticeably but workloads haven't changed much",{"type":23,"tag":58,"props":98,"children":99},{},[100],{"type":29,"value":101},"you're heading into a fundraise or board review and someone asks about cloud spend",{"type":23,"tag":58,"props":103,"children":104},{},[105],{"type":29,"value":106},"you've just inherited an AWS account and don't know what's running",{"type":23,"tag":58,"props":108,"children":109},{},[110],{"type":29,"value":111},"costs jumped unexpectedly and you're trying to find why",{"type":23,"tag":31,"props":113,"children":114},{},[115],{"type":29,"value":116},"Don't use this as a substitute for architectural review. If your costs are driven by a flawed design (wrong database tier, oversized data transfer, etc.), that needs a different conversation.",{"type":23,"tag":118,"props":119,"children":120},"hr",{},[],{"type":23,"tag":42,"props":122,"children":124},{"id":123},"the-checklist",[125],{"type":29,"value":126},"The checklist",{"type":23,"tag":128,"props":129,"children":131},"h3",{"id":130},"_1-get-a-cost-baseline-by-service",[132],{"type":29,"value":133},"1. Get a cost baseline by service",{"type":23,"tag":54,"props":135,"children":136},{},[137,148,158],{"type":23,"tag":58,"props":138,"children":139},{},[140,146],{"type":23,"tag":141,"props":142,"children":143},"strong",{},[144],{"type":29,"value":145},"Why it matters:",{"type":29,"value":147}," You can't prioritise without knowing where the money actually goes. Most teams are surprised — the top-three services usually account for 70–80% of total spend.",{"type":23,"tag":58,"props":149,"children":150},{},[151,156],{"type":23,"tag":141,"props":152,"children":153},{},[154],{"type":29,"value":155},"What to check:",{"type":29,"value":157}," Go to AWS Cost Explorer → Group by Service → last 3 months. Export or screenshot. Note which services are growing.",{"type":23,"tag":58,"props":159,"children":160},{},[161,166],{"type":23,"tag":141,"props":162,"children":163},{},[164],{"type":29,"value":165},"Common miss:",{"type":29,"value":167}," Looking at the total and skipping the service breakdown. The total number is almost useless without knowing what's driving it.",{"type":23,"tag":118,"props":169,"children":170},{},[],{"type":23,"tag":128,"props":172,"children":174},{"id":173},"_2-check-for-idle-or-orphaned-resources",[175],{"type":29,"value":176},"2. Check for idle or orphaned resources",{"type":23,"tag":54,"props":178,"children":179},{},[180,189,233],{"type":23,"tag":58,"props":181,"children":182},{},[183,187],{"type":23,"tag":141,"props":184,"children":185},{},[186],{"type":29,"value":145},{"type":29,"value":188}," Every account accumulates dead weight: stopped EC2 instances that were \"paused temporarily\", unattached EBS volumes, old snapshots, forgotten Load Balancers. These cost money every month for no reason.",{"type":23,"tag":58,"props":190,"children":191},{},[192,196],{"type":23,"tag":141,"props":193,"children":194},{},[195],{"type":29,"value":155},{"type":23,"tag":54,"props":197,"children":198},{},[199,204,218,223,228],{"type":23,"tag":58,"props":200,"children":201},{},[202],{"type":29,"value":203},"EC2 instances with \u003C 5% CPU for 2+ weeks (use CloudWatch or Cost Explorer rightsizing recommendations)",{"type":23,"tag":58,"props":205,"children":206},{},[207,209,216],{"type":29,"value":208},"Unattached EBS volumes (EC2 → Volumes → filter by ",{"type":23,"tag":210,"props":211,"children":213},"code",{"className":212},[],[214],{"type":29,"value":215},"available",{"type":29,"value":217},")",{"type":23,"tag":58,"props":219,"children":220},{},[221],{"type":29,"value":222},"Snapshots older than 90 days with no attached instance",{"type":23,"tag":58,"props":224,"children":225},{},[226],{"type":29,"value":227},"Load Balancers with zero active connections",{"type":23,"tag":58,"props":229,"children":230},{},[231],{"type":29,"value":232},"RDS instances in stopped state (AWS restarts them after 7 days anyway — if they keep stopping, consider deleting)",{"type":23,"tag":58,"props":234,"children":235},{},[236,240],{"type":23,"tag":141,"props":237,"children":238},{},[239],{"type":29,"value":165},{"type":29,"value":241}," Forgetting about EBS snapshots. They accumulate silently and can add up to hundreds of dollars/month for teams that do daily automated snapshots without a retention policy.",{"type":23,"tag":118,"props":243,"children":244},{},[],{"type":23,"tag":128,"props":246,"children":248},{"id":247},"_3-evaluate-compute-sizing",[249],{"type":29,"value":250},"3. Evaluate compute sizing",{"type":23,"tag":54,"props":252,"children":253},{},[254,263,293],{"type":23,"tag":58,"props":255,"children":256},{},[257,261],{"type":23,"tag":141,"props":258,"children":259},{},[260],{"type":29,"value":145},{"type":29,"value":262}," EC2 over-provisioning is the single most common source of avoidable cost in small accounts. Teams size for worst-case traffic and never revisit.",{"type":23,"tag":58,"props":264,"children":265},{},[266,270],{"type":23,"tag":141,"props":267,"children":268},{},[269],{"type":29,"value":155},{"type":23,"tag":54,"props":271,"children":272},{},[273,278,283,288],{"type":23,"tag":58,"props":274,"children":275},{},[276],{"type":29,"value":277},"CloudWatch CPU and memory metrics for all running EC2 instances",{"type":23,"tag":58,"props":279,"children":280},{},[281],{"type":29,"value":282},"Look for instances consistently below 20% CPU — they're candidates for downsizing",{"type":23,"tag":58,"props":284,"children":285},{},[286],{"type":29,"value":287},"Check whether any instances could move to a newer generation (e.g., m5 → m7g gives 20–40% performance-per-dollar improvement)",{"type":23,"tag":58,"props":289,"children":290},{},[291],{"type":29,"value":292},"For ECS/Fargate workloads: check task CPU/memory allocation vs actual usage",{"type":23,"tag":58,"props":294,"children":295},{},[296,300,302,308,310,316],{"type":23,"tag":141,"props":297,"children":298},{},[299],{"type":29,"value":165},{"type":29,"value":301}," Rightsizing RDS. It's easier to over-provision a database \"to be safe\" and forget about it. Look at CloudWatch ",{"type":23,"tag":210,"props":303,"children":305},{"className":304},[],[306],{"type":29,"value":307},"DatabaseConnections",{"type":29,"value":309}," and ",{"type":23,"tag":210,"props":311,"children":313},{"className":312},[],[314],{"type":29,"value":315},"CPUUtilization",{"type":29,"value":317}," — a db.r5.2xlarge running at 5% is wasted money.",{"type":23,"tag":118,"props":319,"children":320},{},[],{"type":23,"tag":128,"props":322,"children":324},{"id":323},"_4-look-at-data-transfer-and-nat-gateway-costs",[325],{"type":29,"value":326},"4. Look at data transfer and NAT Gateway costs",{"type":23,"tag":54,"props":328,"children":329},{},[330,339,377],{"type":23,"tag":58,"props":331,"children":332},{},[333,337],{"type":23,"tag":141,"props":334,"children":335},{},[336],{"type":29,"value":145},{"type":29,"value":338}," Data transfer and NAT Gateway charges are invisible until they're not. I've seen accounts where NAT Gateway charges were higher than EC2.",{"type":23,"tag":58,"props":340,"children":341},{},[342,346],{"type":23,"tag":141,"props":343,"children":344},{},[345],{"type":29,"value":155},{"type":23,"tag":54,"props":347,"children":348},{},[349,367,372],{"type":23,"tag":58,"props":350,"children":351},{},[352,354,360,361],{"type":29,"value":353},"Cost Explorer → Group by Usage Type → filter for ",{"type":23,"tag":210,"props":355,"children":357},{"className":356},[],[358],{"type":29,"value":359},"DataTransfer",{"type":29,"value":309},{"type":23,"tag":210,"props":362,"children":364},{"className":363},[],[365],{"type":29,"value":366},"NatGateway",{"type":23,"tag":58,"props":368,"children":369},{},[370],{"type":29,"value":371},"If NAT Gateway is significant, find out what's making outbound calls. Often it's agents, SDKs, or monitoring tools running in private subnets making external API calls continuously.",{"type":23,"tag":58,"props":373,"children":374},{},[375],{"type":29,"value":376},"Check inter-AZ data transfer: traffic between availability zones is not free. Some architectures create unnecessary cross-AZ hops.",{"type":23,"tag":58,"props":378,"children":379},{},[380,384],{"type":23,"tag":141,"props":381,"children":382},{},[383],{"type":29,"value":165},{"type":29,"value":385}," Assuming data transfer is just S3 or CloudFront. Most unexpected transfer costs come from EC2 and internal service traffic.",{"type":23,"tag":118,"props":387,"children":388},{},[],{"type":23,"tag":128,"props":390,"children":392},{"id":391},"_5-review-s3-storage-and-request-costs",[393],{"type":29,"value":394},"5. Review S3 storage and request costs",{"type":23,"tag":54,"props":396,"children":397},{},[398,407,461],{"type":23,"tag":58,"props":399,"children":400},{},[401,405],{"type":23,"tag":141,"props":402,"children":403},{},[404],{"type":29,"value":145},{"type":29,"value":406}," S3 is cheap per GB, but it adds up fast for teams doing large numbers of requests or storing infrequently-accessed data in Standard storage class.",{"type":23,"tag":58,"props":408,"children":409},{},[410,414],{"type":23,"tag":141,"props":411,"children":412},{},[413],{"type":29,"value":155},{"type":23,"tag":54,"props":415,"children":416},{},[417,430,435,440],{"type":23,"tag":58,"props":418,"children":419},{},[420,422,428],{"type":29,"value":421},"Which buckets have the most data (use S3 Storage Lens or ",{"type":23,"tag":210,"props":423,"children":425},{"className":424},[],[426],{"type":29,"value":427},"aws s3api list-objects-v2",{"type":29,"value":429}," with summary)",{"type":23,"tag":58,"props":431,"children":432},{},[433],{"type":29,"value":434},"Are there buckets storing old logs, backups, or artifacts with no lifecycle policy?",{"type":23,"tag":58,"props":436,"children":437},{},[438],{"type":29,"value":439},"Is anything in S3 Standard that's clearly cold (logs older than 30 days, deployment artifacts, backups)?",{"type":23,"tag":58,"props":441,"children":442},{},[443,445,451,453,459],{"type":29,"value":444},"Check S3 request costs in Cost Explorer — ",{"type":23,"tag":210,"props":446,"children":448},{"className":447},[],[449],{"type":29,"value":450},"PUT",{"type":29,"value":452},", ",{"type":23,"tag":210,"props":454,"children":456},{"className":455},[],[457],{"type":29,"value":458},"GET",{"type":29,"value":460}," request charges can be surprisingly high for data pipeline workloads",{"type":23,"tag":58,"props":462,"children":463},{},[464,468],{"type":23,"tag":141,"props":465,"children":466},{},[467],{"type":29,"value":165},{"type":29,"value":469}," Application logs or CI/CD artifacts being stored indefinitely. A lifecycle policy expiring objects after 30–90 days is usually safe and meaningfully reduces costs over time.",{"type":23,"tag":118,"props":471,"children":472},{},[],{"type":23,"tag":128,"props":474,"children":476},{"id":475},"_6-evaluate-commitment-options-if-spend-is-predictable",[477],{"type":29,"value":478},"6. Evaluate commitment options if spend is predictable",{"type":23,"tag":54,"props":480,"children":481},{},[482,491,516],{"type":23,"tag":58,"props":483,"children":484},{},[485,489],{"type":23,"tag":141,"props":486,"children":487},{},[488],{"type":29,"value":145},{"type":29,"value":490}," If your EC2 or Fargate spend is reasonably predictable, Savings Plans can reduce compute costs by 20–40% with minimal effort.",{"type":23,"tag":58,"props":492,"children":493},{},[494,498],{"type":23,"tag":141,"props":495,"children":496},{},[497],{"type":29,"value":155},{"type":23,"tag":54,"props":499,"children":500},{},[501,506,511],{"type":23,"tag":58,"props":502,"children":503},{},[504],{"type":29,"value":505},"Go to Cost Explorer → Savings Plans → Coverage report. Low coverage with consistent usage is a clear opportunity.",{"type":23,"tag":58,"props":507,"children":508},{},[509],{"type":29,"value":510},"Compute Savings Plans are the most flexible option for small teams — they apply across EC2, Fargate, and Lambda automatically.",{"type":23,"tag":58,"props":512,"children":513},{},[514],{"type":29,"value":515},"Start with 1-year no-upfront. Commit only what you're confident you'll keep running.",{"type":23,"tag":58,"props":517,"children":518},{},[519,523],{"type":23,"tag":141,"props":520,"children":521},{},[522],{"type":29,"value":165},{"type":29,"value":524}," Confusing Savings Plans with Reserved Instances. For small teams with some architectural flexibility, Compute Savings Plans are almost always the better starting point.",{"type":23,"tag":118,"props":526,"children":527},{},[],{"type":23,"tag":128,"props":529,"children":531},{"id":530},"_7-set-up-a-budget-alert-if-you-dont-have-one",[532],{"type":29,"value":533},"7. Set up a budget alert if you don't have one",{"type":23,"tag":54,"props":535,"children":536},{},[537,546,571],{"type":23,"tag":58,"props":538,"children":539},{},[540,544],{"type":23,"tag":141,"props":541,"children":542},{},[543],{"type":29,"value":145},{"type":29,"value":545}," The review you're doing now only captures what's already happened. You need a signal when spend starts drifting.",{"type":23,"tag":58,"props":547,"children":548},{},[549,553],{"type":23,"tag":141,"props":550,"children":551},{},[552],{"type":29,"value":155},{"type":23,"tag":54,"props":554,"children":555},{},[556,561,566],{"type":23,"tag":58,"props":557,"children":558},{},[559],{"type":29,"value":560},"AWS Budgets → create a monthly cost budget at 100% of your expected spend, with an alert at 80%.",{"type":23,"tag":58,"props":562,"children":563},{},[564],{"type":29,"value":565},"Add an alert at 120% as an emergency signal.",{"type":23,"tag":58,"props":567,"children":568},{},[569],{"type":29,"value":570},"Make sure the alert goes somewhere someone will actually read it (SNS → Slack, not just email).",{"type":23,"tag":58,"props":572,"children":573},{},[574,578],{"type":23,"tag":141,"props":575,"children":576},{},[577],{"type":29,"value":165},{"type":29,"value":579}," Creating a budget alert that emails a shared mailbox nobody monitors. Wire it to a Slack channel that someone owns.",{"type":23,"tag":118,"props":581,"children":582},{},[],{"type":23,"tag":42,"props":584,"children":586},{"id":585},"what-not-to-overcomplicate",[587],{"type":29,"value":588},"What not to overcomplicate",{"type":23,"tag":31,"props":590,"children":591},{},[592],{"type":29,"value":593},"A few traps I see teams fall into during cost reviews:",{"type":23,"tag":31,"props":595,"children":596},{},[597,602],{"type":23,"tag":141,"props":598,"children":599},{},[600],{"type":29,"value":601},"Tagging everything before doing anything else.",{"type":29,"value":603}," Tagging is useful for ongoing visibility, but it's a months-long project for established accounts. Don't let it block the immediate savings. Fix the idle resources and oversized instances first.",{"type":23,"tag":31,"props":605,"children":606},{},[607,612],{"type":23,"tag":141,"props":608,"children":609},{},[610],{"type":29,"value":611},"Optimising the wrong thing.",{"type":29,"value":613}," If you're spending $500/month on EBS snapshots and $8,000/month on EC2, don't spend three days optimising snapshot retention before looking at compute.",{"type":23,"tag":31,"props":615,"children":616},{},[617,622],{"type":23,"tag":141,"props":618,"children":619},{},[620],{"type":29,"value":621},"Buying commitments before understanding the baseline.",{"type":29,"value":623}," Reserved Instances and Savings Plans make sense once you understand what's stable. Buying them on an account you don't fully understand yet is premature — you might commit to resources you're about to change.",{"type":23,"tag":31,"props":625,"children":626},{},[627,632],{"type":23,"tag":141,"props":628,"children":629},{},[630],{"type":29,"value":631},"Turning this into a platform project.",{"type":29,"value":633}," You don't need a cost allocation taxonomy, a FinOps tool, or a chargeback model to reduce your bill. Do the review, make the changes, set the alerts. That's it.",{"type":23,"tag":118,"props":635,"children":636},{},[],{"type":23,"tag":42,"props":638,"children":640},{"id":639},"closing",[641],{"type":29,"value":642},"Closing",{"type":23,"tag":31,"props":644,"children":645},{},[646],{"type":29,"value":647},"If you work through this checklist honestly, most small teams find 15–30% in waste within the first pass — primarily from idle resources, over-provisioned compute, and missing lifecycle policies.",{"type":23,"tag":31,"props":649,"children":650},{},[651],{"type":29,"value":652},"The goal isn't a perfect bill. It's a sensible one.",{"type":23,"tag":31,"props":654,"children":655},{},[656],{"type":29,"value":657},"If you get through this and the costs still don't make sense, or you've inherited an account with no clear ownership, that's usually when it's worth bringing in an outside perspective. Not to run a FinOps programme — just to spend a few days finding what the internal team doesn't have time to dig into.",{"type":23,"tag":31,"props":659,"children":660},{},[661,663,670],{"type":29,"value":662},"If that sounds like your situation, ",{"type":23,"tag":664,"props":665,"children":667},"a",{"href":666},"/en/services/ongoing-cloud-support",[668],{"type":29,"value":669},"a free cloud review with AstralDeploy",{"type":29,"value":671}," is built exactly for that.",{"title":7,"searchDepth":673,"depth":673,"links":674},2,[675,676,677,687,688],{"id":44,"depth":673,"text":47},{"id":80,"depth":673,"text":83},{"id":123,"depth":673,"text":126,"children":678},[679,681,682,683,684,685,686],{"id":130,"depth":680,"text":133},3,{"id":173,"depth":680,"text":176},{"id":247,"depth":680,"text":250},{"id":323,"depth":680,"text":326},{"id":391,"depth":680,"text":394},{"id":475,"depth":680,"text":478},{"id":530,"depth":680,"text":533},{"id":585,"depth":673,"text":588},{"id":639,"depth":673,"text":642},"markdown","content:en:blog:aws-cost-review-small-teams.md","content","en/blog/aws-cost-review-small-teams.md","en/blog/aws-cost-review-small-teams","md",1777568345145]