<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Vlad Z</title>
    <description>The latest articles on DEV Community by Vlad Z (@vlad_z_16b6320e21f32bee0d).</description>
    <link>https://dev.to/vlad_z_16b6320e21f32bee0d</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4050207%2Feb6548cb-0bde-4cc3-9158-728f3ae9d8c0.jpg</url>
      <title>DEV Community: Vlad Z</title>
      <link>https://dev.to/vlad_z_16b6320e21f32bee0d</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/vlad_z_16b6320e21f32bee0d"/>
    <language>en</language>
    <item>
      <title>A $16,500 GCP bill nobody could explain. Logging was $3,800</title>
      <dc:creator>Vlad Z</dc:creator>
      <pubDate>Fri, 16 Oct 2026 21:24:37 +0000</pubDate>
      <link>https://dev.to/vlad_z_16b6320e21f32bee0d/a-16500-gcp-bill-nobody-could-explain-logging-was-3800-42p9</link>
      <guid>https://dev.to/vlad_z_16b6320e21f32bee0d/a-16500-gcp-bill-nobody-could-explain-logging-was-3800-42p9</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fshi7tf2tp2oht0jeob60.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fshi7tf2tp2oht0jeob60.jpg" alt=" " width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The GCP account I remember most clearly had a billing problem nobody could locate&lt;/p&gt;

&lt;p&gt;Medium-sized SaaS company. Four GCP projects. Total monthly spend: $16,500. Their internal estimate for what the infrastructure should cost: $10,000 to $12,000&lt;/p&gt;

&lt;p&gt;Six months of "we should look into that" conversations. Nobody had time. The gap between what it should cost and what it was costing kept sitting there, not getting addressed&lt;/p&gt;

&lt;p&gt;I started with the billing export to BigQuery, which is the right way to diagnose GCP spend. It gives you full granularity - project, service, resource label, SKU. Far more detail than the billing console alone&lt;/p&gt;

&lt;p&gt;The anomaly appeared in the first 30 minutes&lt;/p&gt;

&lt;p&gt;Cloud Logging. $3,800 a month&lt;/p&gt;

&lt;p&gt;For their workload that was immediately suspicious. I pulled the log volume breakdown by project&lt;/p&gt;

&lt;p&gt;One project was generating 2.4TB of logs a month&lt;/p&gt;

&lt;p&gt;Their entire production environment across the other three projects generated 180GB a month combined&lt;/p&gt;

&lt;p&gt;I found the source. A GKE application running in a non-production project that had been set up for load testing eight months ago. The load test had run. The environment had been left running. And the application was logging at a level designed for load testing - high verbosity, every request, every response, every internal state change&lt;/p&gt;

&lt;p&gt;Running continuously for eight months&lt;/p&gt;

&lt;p&gt;Nobody had looked at non-production billing because it was assumed to be low&lt;/p&gt;

&lt;p&gt;We deleted the environment. Not just the logging - the whole project. It had been generating $4,200 a month in total: logging plus the GKE nodes running the application&lt;/p&gt;

&lt;p&gt;The fix took 20 minutes once we found it&lt;/p&gt;

&lt;p&gt;The finding took 30 minutes of looking at the right data&lt;/p&gt;

&lt;p&gt;Eight months, $33,600&lt;/p&gt;

&lt;p&gt;Because a load test environment got left running and nobody was watching the bill by project&lt;/p&gt;

</description>
      <category>gcp</category>
      <category>backend</category>
      <category>devops</category>
      <category>finops</category>
    </item>
    <item>
      <title>BigQuery is the easiest way to burn a budget by accident</title>
      <dc:creator>Vlad Z</dc:creator>
      <pubDate>Wed, 14 Oct 2026 09:17:23 +0000</pubDate>
      <link>https://dev.to/vlad_z_16b6320e21f32bee0d/bigquery-is-the-easiest-way-to-burn-a-budget-by-accident-2e77</link>
      <guid>https://dev.to/vlad_z_16b6320e21f32bee0d/bigquery-is-the-easiest-way-to-burn-a-budget-by-accident-2e77</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F241lb7gvwkc2vulk1b7a.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F241lb7gvwkc2vulk1b7a.jpg" alt=" " width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;BigQuery is one of the most powerful tools in GCP and one of the easiest ways to accidentally generate a very large bill&lt;/p&gt;

&lt;p&gt;The power is real. You can query terabytes of data in seconds. The cost implication of that power is also real when queries aren't written carefully&lt;/p&gt;

&lt;p&gt;BigQuery has two pricing models. On-demand charges per TB of data processed. Capacity pricing charges for reserved slots regardless of queries run&lt;/p&gt;

&lt;p&gt;For most teams starting out, on-demand is what they're using. And on-demand pricing punishes full table scans&lt;/p&gt;

&lt;p&gt;A query that selects every column from a 500GB table processes 500GB of data and charges you accordingly. A query that selects only the three columns you actually need from a partitioned table that filters to the relevant date range might process 2GB of data&lt;/p&gt;

&lt;p&gt;Same result. Very different cost&lt;/p&gt;

&lt;p&gt;This is the BigQuery optimization that matters most: query efficiency&lt;/p&gt;

&lt;p&gt;Use column selection instead of SELECT *. Always. The cost difference on large tables is not marginal&lt;/p&gt;

&lt;p&gt;Partition your tables and use partition filters in your queries. BigQuery will only scan the relevant partitions. A date-partitioned table queried with a date filter processes only the data in those dates&lt;/p&gt;

&lt;p&gt;Cluster your tables on the columns most frequently used in WHERE clauses and JOINs. Clustering reduces the data scanned for filtered queries&lt;/p&gt;

&lt;p&gt;The second optimization: control who can run what&lt;/p&gt;

&lt;p&gt;Uncontrolled BigQuery access means analysts running expensive exploratory queries against production data at full scale. Query costs that belong to individual analyses ending up on the company bill with no visibility into what generated them&lt;/p&gt;

&lt;p&gt;Column-level access controls, project-level quotas on bytes processed, and requiring query review for tables above a certain size - these are organizational controls but they have direct cost implications&lt;/p&gt;

&lt;p&gt;BigQuery's built-in INFORMATION_SCHEMA views let you see exactly which queries are processing the most data and which users are generating the most cost&lt;/p&gt;

&lt;p&gt;Look at that data. It will tell you where to focus&lt;/p&gt;

</description>
      <category>devops</category>
      <category>finops</category>
      <category>gcp</category>
      <category>cloud</category>
    </item>
    <item>
      <title>GKE is where GCP bills get complicated fast</title>
      <dc:creator>Vlad Z</dc:creator>
      <pubDate>Tue, 13 Oct 2026 15:54:46 +0000</pubDate>
      <link>https://dev.to/vlad_z_16b6320e21f32bee0d/gke-is-where-gcp-bills-get-complicated-fast-40j9</link>
      <guid>https://dev.to/vlad_z_16b6320e21f32bee0d/gke-is-where-gcp-bills-get-complicated-fast-40j9</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fims29zuoo6u6y0nzkd5d.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fims29zuoo6u6y0nzkd5d.jpg" alt=" " width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;GKE is where GCP accounts get complicated fast&lt;/p&gt;

&lt;p&gt;Kubernetes is powerful. It's also genuinely possible to spend a lot of money running it inefficiently, and the complexity of the system makes it hard to see where the inefficiency is&lt;/p&gt;

&lt;p&gt;The first question when looking at a GKE cluster: Autopilot or Standard mode?&lt;/p&gt;

&lt;p&gt;Standard mode gives you full control over the nodes, the node pools, the machine types, everything. You're responsible for cluster infrastructure. You pay for the nodes whether they're being used or not. The optimization burden is on you&lt;/p&gt;

&lt;p&gt;Autopilot mode manages the infrastructure for you. You pay for the resources your pods actually request and use. GCP handles node provisioning, scaling, and maintenance. You lose some customization but you gain a billing model that's much harder to waste with&lt;/p&gt;

&lt;p&gt;For most small to medium teams that aren't running specialized workloads: Autopilot is worth serious consideration&lt;/p&gt;

&lt;p&gt;Not because it's always cheaper. Because the cost model aligns with usage in a way Standard doesn't. In Standard mode, under-utilized nodes still bill. In Autopilot, unused capacity doesn't&lt;/p&gt;

&lt;p&gt;The right recommendation depends on what you're running&lt;/p&gt;

&lt;p&gt;For Standard mode clusters where you want to optimize:&lt;/p&gt;

&lt;p&gt;Node pool right-sizing is the first thing. Look at actual CPU and memory utilization across nodes. Are you running n2-standard-8 nodes at 20 percent utilization? You have options&lt;/p&gt;

&lt;p&gt;Cluster Autoscaler should be configured to scale down aggressively when demand drops. The default settings are conservative. Explicitly configure scale-down behavior&lt;/p&gt;

&lt;p&gt;Pod resource requests need to reflect actual usage. If pods request 2 CPU and use 0.3 CPU, the scheduler cannot bin-pack efficiently. The node looks "full" to the scheduler while actually running at low utilization&lt;/p&gt;

&lt;p&gt;Accurate resource requests let the cluster pack pods efficiently, which means fewer nodes, which means lower cost&lt;/p&gt;

&lt;p&gt;GKE has a built-in resource usage dashboard. Almost nobody looks at it. The teams that do consistently find optimization opportunities the teams that don't will never see&lt;/p&gt;

</description>
      <category>gcp</category>
      <category>finops</category>
      <category>devops</category>
      <category>gke</category>
    </item>
    <item>
      <title>Google Cloud Storage has the same problem as S3: Standard forever</title>
      <dc:creator>Vlad Z</dc:creator>
      <pubDate>Sun, 11 Oct 2026 13:11:50 +0000</pubDate>
      <link>https://dev.to/vlad_z_16b6320e21f32bee0d/google-cloud-storage-has-the-same-problem-as-s3-standard-forever-34o5</link>
      <guid>https://dev.to/vlad_z_16b6320e21f32bee0d/google-cloud-storage-has-the-same-problem-as-s3-standard-forever-34o5</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F4aoo48h1ya8apjh589xz.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F4aoo48h1ya8apjh589xz.jpg" alt=" " width="800" height="1422"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;GCP Cloud Storage has the same problem S3 has&lt;/p&gt;

&lt;p&gt;Everything goes into Standard class. It's the default. It's what people know. And it's the most expensive option for data you don't access frequently&lt;/p&gt;

&lt;p&gt;The four classes in Cloud Storage:&lt;/p&gt;

&lt;p&gt;Standard: for data accessed frequently. Highest price per GB, no retrieval fees&lt;/p&gt;

&lt;p&gt;Nearline: for data accessed less than once a month. About 50 percent cheaper than Standard, small retrieval fee&lt;/p&gt;

&lt;p&gt;Coldline: for data accessed less than once a quarter. About 75 percent cheaper than Standard, higher retrieval fee&lt;/p&gt;

&lt;p&gt;Archive: for data accessed less than once a year. About 95 percent cheaper than Standard, highest retrieval fee, minimum storage duration of a year&lt;/p&gt;

&lt;p&gt;The retrieval fees are the caveat everyone needs to understand before changing storage classes. Moving data to Archive class and then reading it constantly is not cheaper. You need to know your access patterns&lt;/p&gt;

&lt;p&gt;For data you don't know the access patterns on: Object Lifecycle Management&lt;/p&gt;

&lt;p&gt;You define rules and GCP handles the transitions automatically. After 30 days without access, move to Nearline. After 90 days, Coldline. After 365 days, Archive or delete&lt;/p&gt;

&lt;p&gt;For data with unpredictable access patterns: Autoclass&lt;/p&gt;

&lt;p&gt;Similar to AWS Intelligent-Tiering. Objects are automatically moved between Standard and Nearline based on access patterns. Small management fee per object. No retrieval fees from Autoclass transitions&lt;/p&gt;

&lt;p&gt;In most GCP accounts with significant storage spend, the combination of lifecycle policies on predictable data and Autoclass on unpredictable data reduces storage costs 30 to 60 percent&lt;/p&gt;

&lt;p&gt;The data doesn't change. The cost of keeping it does&lt;/p&gt;

</description>
      <category>aws</category>
      <category>gcp</category>
      <category>devops</category>
      <category>finops</category>
    </item>
    <item>
      <title>The GCP discount AWS has no equivalent for</title>
      <dc:creator>Vlad Z</dc:creator>
      <pubDate>Fri, 09 Oct 2026 22:47:26 +0000</pubDate>
      <link>https://dev.to/vlad_z_16b6320e21f32bee0d/the-gcp-discount-aws-has-no-equivalent-for-4n07</link>
      <guid>https://dev.to/vlad_z_16b6320e21f32bee0d/the-gcp-discount-aws-has-no-equivalent-for-4n07</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fsz9c30b7c81159ztae8w.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fsz9c30b7c81159ztae8w.jpg" alt=" " width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;GCP has a discount mechanism that AWS doesn't have an equivalent for&lt;/p&gt;

&lt;p&gt;Sustained Use Discounts apply automatically when you run Compute Engine instances for more than 25 percent of a month. The longer the instance runs, the bigger the discount. Run it the entire month and you get up to 30 percent off automatically, with no commitment and no upfront payment&lt;/p&gt;

&lt;p&gt;This is genuinely good. It means GCP rewards you for running stable workloads without requiring you to predict the future&lt;/p&gt;

&lt;p&gt;But there's a better option on top of it for workloads you're confident about&lt;/p&gt;

&lt;p&gt;Committed Use Discounts&lt;/p&gt;

&lt;p&gt;One year commitment: 37 percent off. Three year commitment: 55 percent off. Applied at the vCPU and memory level rather than specific instance types, which gives you more flexibility than AWS reserved instances if you change machine types&lt;/p&gt;

&lt;p&gt;The mistake teams make with CUDs is the same one they make with AWS reserved instances: committing before they've rightsized&lt;/p&gt;

&lt;p&gt;If your instances are 40 percent larger than they need to be and you commit to that size for three years, you've locked in a discounted price on waste&lt;/p&gt;

&lt;p&gt;The right sequence on GCP:&lt;/p&gt;

&lt;p&gt;Rightsize your compute first. Use the Recommender in the GCP console - it analyzes actual utilization and suggests appropriate machine types. Take those recommendations seriously, test them, implement them&lt;/p&gt;

&lt;p&gt;Then look at what's left. What are you running that's stable, correctly sized, and not going away? That's your commitment baseline&lt;/p&gt;

&lt;p&gt;Commit to that baseline with CUDs. Let the variable workload stay on the automatic Sustained Use Discounts&lt;/p&gt;

&lt;p&gt;The combination of rightsizing plus CUDs on GCP typically saves 45 to 60 percent compared to running on-demand unoptimized instances&lt;/p&gt;

&lt;p&gt;The savings are there. The order matters&lt;/p&gt;

</description>
      <category>aws</category>
      <category>gcp</category>
      <category>finops</category>
      <category>devops</category>
    </item>
    <item>
      <title>The AWS savings nobody can touch: legacy systems</title>
      <dc:creator>Vlad Z</dc:creator>
      <pubDate>Thu, 08 Oct 2026 21:48:34 +0000</pubDate>
      <link>https://dev.to/vlad_z_16b6320e21f32bee0d/the-aws-savings-nobody-can-touch-legacy-systems-2h2j</link>
      <guid>https://dev.to/vlad_z_16b6320e21f32bee0d/the-aws-savings-nobody-can-touch-legacy-systems-2h2j</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fvpp5y1x52rgdnxyphxn7.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fvpp5y1x52rgdnxyphxn7.jpg" alt=" " width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The second category of AWS caveats is the legacy problem&lt;/p&gt;

&lt;p&gt;And legacy doesn't just mean old&lt;/p&gt;

&lt;p&gt;It means: built by people who are no longer here, in ways that are no longer documented, for reasons that are no longer clear, and that everything else has since been built on top of&lt;/p&gt;

&lt;p&gt;I've seen EC2 instances running since 2017 that nobody will touch. Not because they're critical in a way anyone can articulate. Because they're connected to enough other things that removing them feels like pulling a thread that might unravel something important&lt;/p&gt;

&lt;p&gt;The fear is not irrational. It's based on past experience. Someone removed something once and something else broke. Now nothing gets removed&lt;/p&gt;

&lt;p&gt;The cost of that conservatism is real. Every month. Indefinitely&lt;/p&gt;

&lt;p&gt;Here's how I navigate legacy in AWS accounts&lt;/p&gt;

&lt;p&gt;First: observe before acting. Look at network traffic, API calls, CloudWatch metrics. Does anything talk to this resource? Is anything depending on it in a measurable way? Often the answer is no. The fear was about unknown dependencies and the monitoring shows there are none&lt;/p&gt;

&lt;p&gt;Second: tag it with intention. If you can't remove it yet, tag it with a date and a note. "Reviewed 2024-Q1. No observed dependencies. Candidate for removal." That tag is a commitment to revisit. It also means the next person who looks at this has context instead of starting from scratch&lt;/p&gt;

&lt;p&gt;Third: isolate before removing. If the resource is in a VPC, you can often restrict its network access before removing it. Leave it running but disconnected. Wait 30 days. If nothing complains, the dependency was a ghost&lt;/p&gt;

&lt;p&gt;Legacy systems in AWS are expensive partly because of what they cost to run and partly because of what they cost to think about&lt;/p&gt;

&lt;p&gt;Every hour an engineer spends being careful around an undocumented legacy resource is an hour not spent building something&lt;/p&gt;

&lt;p&gt;The documentation debt has a bill too. It just doesn't show up in Cost Explorer&lt;/p&gt;

</description>
      <category>architecture</category>
      <category>aws</category>
      <category>infrastructure</category>
    </item>
    <item>
      <title>AWS optimization always looks cleaner from the outside</title>
      <dc:creator>Vlad Z</dc:creator>
      <pubDate>Wed, 07 Oct 2026 21:31:35 +0000</pubDate>
      <link>https://dev.to/vlad_z_16b6320e21f32bee0d/aws-optimization-always-looks-cleaner-from-the-outside-5hml</link>
      <guid>https://dev.to/vlad_z_16b6320e21f32bee0d/aws-optimization-always-looks-cleaner-from-the-outside-5hml</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fpo2bb0emud5023eqa62t.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fpo2bb0emud5023eqa62t.jpg" alt=" " width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;AWS optimization always looks cleaner from the outside than it is from the inside&lt;/p&gt;

&lt;p&gt;Here are the things that slow down or stop work that looks straightforward on paper&lt;/p&gt;

&lt;p&gt;IAM and permission boundaries&lt;/p&gt;

&lt;p&gt;In organizations with mature security posture, the engineer doing the optimization work often doesn't have permission to make the changes. They can see the problem. They can define the solution. They cannot execute it without going through an access request process that takes days&lt;/p&gt;

&lt;p&gt;In multi-account organizations this gets more complex. The permissions structure in AWS Organizations means that even with appropriate access in one account, cross-account actions require separate setup. A simple "move this workload to a different account" involves IAM roles, resource policies, and organizational SCPs that all need to align&lt;/p&gt;

&lt;p&gt;Plan for permission lead time. It's often longer than the technical work&lt;/p&gt;

&lt;p&gt;Reserved instance and Savings Plans complexity in organizations&lt;/p&gt;

&lt;p&gt;If your AWS accounts are under an organization with consolidated billing, reserved instances and Savings Plans purchased in one account can be shared across the organization. This is good. It also means that the optimization decision in one team's account affects the economics of another team's account&lt;/p&gt;

&lt;p&gt;Before purchasing any commitment-based discounts in an organizational context, understand who controls the payer account, how reservations are currently allocated, and whether there's an existing RI management process&lt;/p&gt;

&lt;p&gt;Buying reservations without this context can create conflicts with existing commitments or miss opportunities to consolidate under better terms&lt;/p&gt;

&lt;p&gt;Compliance and data residency constraints&lt;/p&gt;

&lt;p&gt;Optimization often involves moving data or workloads. Moving a database to a cheaper region, for example&lt;/p&gt;

&lt;p&gt;If the data has residency requirements - GDPR, financial regulations, healthcare data requirements - those constrain where it can go. Sometimes the cheaper option is simply not available for compliant data&lt;/p&gt;

&lt;p&gt;Know your constraints before you design the solution. The cost of discovering a compliance blocker mid-migration is higher than the cost of asking the question upfront&lt;/p&gt;

</description>
      <category>aws</category>
      <category>gcp</category>
      <category>finops</category>
      <category>devops</category>
    </item>
    <item>
      <title>A $22,000 GPU bill with a very quiet night shift</title>
      <dc:creator>Vlad Z</dc:creator>
      <pubDate>Tue, 06 Oct 2026 21:12:33 +0000</pubDate>
      <link>https://dev.to/vlad_z_16b6320e21f32bee0d/a-22000-gpu-bill-with-a-very-quiet-night-shift-5c81</link>
      <guid>https://dev.to/vlad_z_16b6320e21f32bee0d/a-22000-gpu-bill-with-a-very-quiet-night-shift-5c81</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fh0srgkhh7vziy1up3r82.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fh0srgkhh7vziy1up3r82.jpg" alt=" " width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The one I think about most is the account where the infrastructure was correct and the cost was still wrong&lt;/p&gt;

&lt;p&gt;ML startup. Eight engineers. Production inference API with real traffic&lt;/p&gt;

&lt;p&gt;Their AWS bill was $22,000 a month. Mostly GPU compute for inference&lt;/p&gt;

&lt;p&gt;I went in expecting to find over-provisioned instances. I found the opposite. The instance types were appropriate for the workload. Utilization was reasonable. Nothing obviously wasteful&lt;/p&gt;

&lt;p&gt;What I found instead was the scheduling&lt;/p&gt;

&lt;p&gt;Their inference traffic followed a completely predictable pattern. 90 percent of requests came between 9am and 11pm US Eastern time. The overnight period was nearly silent. A few health checks. Background jobs. No real user traffic&lt;/p&gt;

&lt;p&gt;The GPU instances ran 24 hours a day&lt;/p&gt;

&lt;p&gt;At full capacity. Full price. Through eight hours of near-zero utilization every single night&lt;/p&gt;

&lt;p&gt;We implemented a scale-down schedule. At 11pm Eastern, scale the inference cluster down to a minimal warm state - enough to handle the background jobs and respond to the health checks. At 8am Eastern, scale back up before the traffic arrives&lt;/p&gt;

&lt;p&gt;The change took two days to implement and test safely&lt;/p&gt;

&lt;p&gt;Monthly savings: $4,800&lt;/p&gt;

&lt;p&gt;Not from changing the architecture. Not from changing the model. Not from changing anything about how the product worked&lt;/p&gt;

&lt;p&gt;From matching the cost to the actual demand pattern instead of running at peak capacity all the time because that felt safer&lt;/p&gt;

&lt;p&gt;The infrastructure was fine&lt;/p&gt;

&lt;p&gt;The schedule was wrong&lt;/p&gt;

&lt;p&gt;Sometimes that's all it is&lt;/p&gt;

</description>
      <category>ai</category>
      <category>gpu</category>
      <category>finops</category>
      <category>devops</category>
    </item>
    <item>
      <title>An $18,000 AWS bill that should have been $12,000</title>
      <dc:creator>Vlad Z</dc:creator>
      <pubDate>Mon, 05 Oct 2026 20:38:59 +0000</pubDate>
      <link>https://dev.to/vlad_z_16b6320e21f32bee0d/an-18000-aws-bill-that-should-have-been-12000-4o15</link>
      <guid>https://dev.to/vlad_z_16b6320e21f32bee0d/an-18000-aws-bill-that-should-have-been-12000-4o15</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fphgt35gsi5gy520czblz.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fphgt35gsi5gy520czblz.jpg" alt=" " width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The second account I want to talk about was a different kind of problem&lt;/p&gt;

&lt;p&gt;Not wasteful. Efficient, actually. A well-run engineering team who had done their homework. Good tagging. Reasonable instance sizes. Clean account structure&lt;/p&gt;

&lt;p&gt;Their bill was still too high and they couldn't figure out why&lt;/p&gt;

&lt;p&gt;$18,000 a month. For their workload it should have been closer to $12,000&lt;/p&gt;

&lt;p&gt;I spent longer in the initial review on this one. The obvious things weren't obvious here&lt;/p&gt;

&lt;p&gt;It took me two hours to find it&lt;/p&gt;

&lt;p&gt;OpenSearch&lt;/p&gt;

&lt;p&gt;They were running a production OpenSearch cluster for application logging and search. Reasonable. The cluster was sized at three data nodes of r6g.2xlarge each. That's a serious cluster. About $2,200 a month just for those nodes&lt;/p&gt;

&lt;p&gt;I looked at the index patterns. They were retaining 14 months of log data in the hot tier. Fully indexed. Fully searchable. At all times&lt;/p&gt;

&lt;p&gt;I looked at the search queries. 98 percent of all queries were against data from the last 7 days. The other 2 percent were against data from the last 30 days. Nobody had searched data older than 30 days in the history of the cluster&lt;/p&gt;

&lt;p&gt;They were paying to keep 14 months of data in fast hot storage so that 2 percent of queries could touch data from 30 days ago&lt;/p&gt;

&lt;p&gt;We implemented Index Lifecycle Management. Hot tier for 7 days, warm tier for 30, cold tier after that with significantly cheaper storage. Reduced the node count on the cluster after the data distribution changed&lt;/p&gt;

&lt;p&gt;New OpenSearch cost: $800 a month&lt;/p&gt;

&lt;p&gt;$1,400 a month saved. No change to search functionality. Not a single query that previously worked stopped working&lt;/p&gt;

&lt;p&gt;The data was the same. The cost of keeping it was not&lt;/p&gt;

&lt;p&gt;This is the thing about well-run accounts. The easy wins are already gone. What's left is understanding the system deeply enough to find where expensive decisions were made with good intentions and incomplete information&lt;/p&gt;

&lt;p&gt;That's still findable. It just takes longer&lt;/p&gt;

</description>
      <category>cloud</category>
      <category>infrastructure</category>
      <category>aws</category>
      <category>finops</category>
    </item>
    <item>
      <title>The CloudWatch fix was the easy part. $9,300 was still missing</title>
      <dc:creator>Vlad Z</dc:creator>
      <pubDate>Sun, 04 Oct 2026 19:57:03 +0000</pubDate>
      <link>https://dev.to/vlad_z_16b6320e21f32bee0d/the-cloudwatch-fix-was-the-easy-part-9300-was-still-missing-4o7b</link>
      <guid>https://dev.to/vlad_z_16b6320e21f32bee0d/the-cloudwatch-fix-was-the-easy-part-9300-was-still-missing-4o7b</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fuwrzcir7784080qjmxf5.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fuwrzcir7784080qjmxf5.jpg" alt=" " width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;After the CloudWatch fix we kept going&lt;/p&gt;

&lt;p&gt;$11,400 a month. $340 on CloudWatch now. $9,300 still unaccounted for&lt;/p&gt;

&lt;p&gt;RDS was next. $2,800 a month across four database instances&lt;/p&gt;

&lt;p&gt;I looked at the instance types first. All four were db.r5.2xlarge. 8 vCPUs, 64GB memory each&lt;/p&gt;

&lt;p&gt;Then I looked at the utilization metrics. Average CPU across all four: 12 percent. Peak CPU in the last 30 days: 34 percent. Memory utilization: consistently under 25 percent&lt;/p&gt;

&lt;p&gt;Four databases running at a fraction of their capacity, 24 hours a day, 7 days a week&lt;/p&gt;

&lt;p&gt;I asked the founder why they were that size. The answer: an engineer had sized them for expected growth at Series A. Series A was planned for 18 months ago. The growth hadn't come yet. The databases had been running at that size for over a year&lt;/p&gt;

&lt;p&gt;We moved two of the four to db.r5.large - one quarter the size, which was still 4x more than current peak utilization required. We scheduled a maintenance window, ran the resize, monitored for 72 hours&lt;/p&gt;

&lt;p&gt;No issues&lt;/p&gt;

&lt;p&gt;RDS bill the following month: $1,100&lt;/p&gt;

&lt;p&gt;We were 6 days into the engagement&lt;/p&gt;

&lt;p&gt;CloudWatch plus RDS: $3,360 saved per month from two changes&lt;/p&gt;

&lt;p&gt;The rest of the work took another three weeks. EC2 rightsizing, S3 lifecycle policies, removing a handful of completely unused services&lt;/p&gt;

&lt;p&gt;Total reduction: $6,800 a month&lt;/p&gt;

&lt;p&gt;From $11,400 to $4,600. The product had the same 800 users. The infrastructure had the same capability. The bill was 60 percent lower&lt;/p&gt;

&lt;p&gt;The money was always there to be found&lt;/p&gt;

&lt;p&gt;It just needed someone to look&lt;/p&gt;

</description>
      <category>aws</category>
      <category>gcp</category>
      <category>finops</category>
      <category>devops</category>
    </item>
    <item>
      <title>An $11,400 AWS bill, and CloudWatch Logs was $2,100 of it</title>
      <dc:creator>Vlad Z</dc:creator>
      <pubDate>Sat, 03 Oct 2026 18:17:24 +0000</pubDate>
      <link>https://dev.to/vlad_z_16b6320e21f32bee0d/an-11400-aws-bill-and-cloudwatch-logs-was-2100-of-it-37aj</link>
      <guid>https://dev.to/vlad_z_16b6320e21f32bee0d/an-11400-aws-bill-and-cloudwatch-logs-was-2100-of-it-37aj</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fun5543evzxhd00z8lcp1.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fun5543evzxhd00z8lcp1.jpg" alt=" " width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I got access to the account on a Tuesday morning&lt;/p&gt;

&lt;p&gt;The founder had sent over credentials the night before with a message that said roughly: I think we're overpaying but I don't know where&lt;/p&gt;

&lt;p&gt;Total monthly spend: $11,400&lt;/p&gt;

&lt;p&gt;Their product had about 800 active users. For 800 users that number felt wrong immediately&lt;/p&gt;

&lt;p&gt;First 15 minutes: just looking. Not touching anything. Building a mental map of what's here and roughly why&lt;/p&gt;

&lt;p&gt;CloudWatch Logs was $2,100 a month. For an account this size that's the first red flag&lt;/p&gt;

&lt;p&gt;I pulled the log groups. Forty-three of them. Most of them with no retention policy set, which means logs accumulate forever. Several of them receiving data from services that no longer existed. Three of them receiving data at a rate that made no sense for their stated purpose&lt;/p&gt;

&lt;p&gt;One log group was ingesting 180GB of data a month from a service that was logging at debug level in production&lt;/p&gt;

&lt;p&gt;Not info level. Debug level. Every function call, every variable state, every internal operation. All of it being shipped to CloudWatch and stored indefinitely at full price&lt;/p&gt;

&lt;p&gt;That one log group was $900 a month&lt;/p&gt;

&lt;p&gt;The service had been deployed eight months ago. Debug logging had been turned on during initial development and never turned off. Nobody had looked at the CloudWatch bill specifically. It was just part of the total that nobody questioned because the total was growing gradually&lt;/p&gt;

&lt;p&gt;We set retention policies on all 43 log groups. Turned off debug logging on the offending service. Deleted the log groups receiving data from services that no longer existed&lt;/p&gt;

&lt;p&gt;CloudWatch bill the following month: $340&lt;/p&gt;

&lt;p&gt;$1,760 saved. One afternoon of work&lt;/p&gt;

&lt;p&gt;And we hadn't touched anything else yet&lt;/p&gt;

</description>
      <category>devops</category>
      <category>finops</category>
      <category>cloud</category>
      <category>aws</category>
    </item>
    <item>
      <title>Data transfer is the AWS line item everyone underestimates</title>
      <dc:creator>Vlad Z</dc:creator>
      <pubDate>Thu, 01 Oct 2026 21:17:54 +0000</pubDate>
      <link>https://dev.to/vlad_z_16b6320e21f32bee0d/data-transfer-is-the-aws-line-item-everyone-underestimates-5aak</link>
      <guid>https://dev.to/vlad_z_16b6320e21f32bee0d/data-transfer-is-the-aws-line-item-everyone-underestimates-5aak</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fps3tos5x5qbhbzmecntb.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fps3tos5x5qbhbzmecntb.jpg" alt=" " width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Data transfer costs are the most consistently underestimated line item in AWS&lt;/p&gt;

&lt;p&gt;They're not the biggest cost in most accounts. But they're the one that grows the fastest as systems scale, the one nobody was thinking about when the architecture was designed, and the one that's hardest to reduce without touching the architecture itself&lt;/p&gt;

&lt;p&gt;That's what makes it hard high-impact&lt;/p&gt;

&lt;p&gt;The charges come from several directions&lt;/p&gt;

&lt;p&gt;Traffic leaving AWS to the internet is charged per GB. Traffic between regions is charged per GB in both directions. Traffic between availability zones within the same region is charged per GB. Only traffic within the same AZ between the same service type is free&lt;/p&gt;

&lt;p&gt;In a microservices architecture where services are spread across AZs, every API call can generate billable transfer. Not much per call. At thousands of calls per second it adds up to a significant monthly line item that wasn't in anyone's cost model&lt;/p&gt;

&lt;p&gt;The diagnosis starts with the data transfer line in your bill broken down by usage type. Most people have never looked at this breakdown. It usually contains at least one surprise&lt;/p&gt;

&lt;p&gt;The fixes depend on what you find&lt;/p&gt;

&lt;p&gt;Services talking across AZs: consolidate them or use a service mesh that routes traffic locally. Services unnecessarily calling APIs in other regions: move the data closer or cache aggressively. Internet egress higher than expected: check if data is being transferred to clients in an uncompressed format, check if assets are being served directly from S3 instead of through CloudFront&lt;/p&gt;

&lt;p&gt;CloudFront is worth a specific mention. Serving content through CloudFront instead of directly from origin reduces egress costs because AWS prices CloudFront egress lower than direct S3 or EC2 egress, and CDN caching reduces the total volume of data transferred from origin&lt;/p&gt;

&lt;p&gt;The architecture changes required to fix data transfer problems are real work&lt;/p&gt;

&lt;p&gt;But the savings compound with every point of traffic growth&lt;/p&gt;

&lt;p&gt;The team that fixes this today pays less at 2x traffic, 5x traffic, 10x traffic&lt;/p&gt;

&lt;p&gt;The team that doesn't pays more every month, forever&lt;/p&gt;

</description>
      <category>architecture</category>
      <category>aws</category>
      <category>infrastructure</category>
    </item>
  </channel>
</rss>
