<?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: Abhishek Gupta</title>
    <description>The latest articles on DEV Community by Abhishek Gupta (@abhishek_gupta_pinpo).</description>
    <link>https://dev.to/abhishek_gupta_pinpo</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.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3888783%2Fddd00119-fad5-440b-8a81-734215d9c447.png</url>
      <title>DEV Community: Abhishek Gupta</title>
      <link>https://dev.to/abhishek_gupta_pinpo</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/abhishek_gupta_pinpo"/>
    <language>en</language>
    <item>
      <title>FinOps at design time: I found $3,840/month in avoidable spend before writing a line of Terraform</title>
      <dc:creator>Abhishek Gupta</dc:creator>
      <pubDate>Mon, 20 Apr 2026 10:51:00 +0000</pubDate>
      <link>https://dev.to/abhishek_gupta_pinpo/finops-at-design-time-i-found-3840month-in-avoidable-spend-before-writing-a-line-of-terraform-oip</link>
      <guid>https://dev.to/abhishek_gupta_pinpo/finops-at-design-time-i-found-3840month-in-avoidable-spend-before-writing-a-line-of-terraform-oip</guid>
      <description>&lt;p&gt;FinOps is almost entirely retrospective. AWS Cost Explorer tells you what happened last billing cycle. Trusted Advisor tells you which resources are underutilised right now. Cost anomaly alerts fire after the anomaly has already run for hours.&lt;/p&gt;

&lt;p&gt;Every tool in the standard FinOps stack analyses infrastructure that already exists. Which means by the time any of them are useful, the structural decisions that determine 80% of your architecture's lifetime cost have already been made, deployed, and are now expensive to reverse.&lt;/p&gt;

&lt;p&gt;I have been an AWS solutions architect for nine years. The pattern is consistent, and I have been complicit in it: design the architecture, write the IaC, deploy, and then discover the cost. The Pricing Calculator gives you a static estimate that assumes steady-state traffic and correct configuration. Neither assumption holds under a real workload.&lt;/p&gt;

&lt;p&gt;This post is about a session where I broke that pattern - and caught $3,840 per month in avoidable spend before a single resource was provisioned.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The architecture&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Event processing pipeline for a Series B SaaS product. Customer activity events ingested via API, processed asynchronously, stored for downstream analytics. Expected baseline: 1,200 RPS, with a 6× spike on campaign days.&lt;br&gt;
Canvas topology in pinpole:&lt;/p&gt;

&lt;p&gt;Route 53 → API Gateway → Lambda (ingest) → SQS → Lambda (processor) → DynamoDB&lt;/p&gt;

&lt;p&gt;Lambda configured at 512 MB, reserved concurrency 200. DynamoDB in on-demand capacity mode. The AWS Pricing Calculator estimate at steady-state baseline: ~$4,100/month.&lt;/p&gt;

&lt;p&gt;Under a Constant simulation at 1,200 RPS, everything looked healthy. Cost settled at $4,230/month - close to the Pricing Calculator number, which felt like a good sign.&lt;/p&gt;

&lt;p&gt;Old workflow would have stopped there. Steady state is fine, cost is in range, proceed to deploy. pinpole's workflow does not stop there.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Finding 1: DynamoDB on-demand at spike load&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I ran a Spike pattern at 7,200 RPS - the 6× campaign day load. The AI recommendations panel updated within seconds.&lt;/p&gt;

&lt;p&gt;The finding: DynamoDB on-demand at 7,200 RPS ingest, with 1.4× write amplification to a secondary index, was going to produce approximately $2,890/month in DynamoDB write costs alone on campaign days. Provisioned capacity with auto-scaling - minimum 1,500 WCU, maximum 12,000 WCU, target utilisation 70% - would bring that to approximately $740/month.&lt;br&gt;
The Pricing Calculator estimate had modelled DynamoDB at steady-state write volume. It had not accounted for the spike multiplier. The difference: $2,150/month per month from one configuration decision.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Finding 2: Lambda memory allocation&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The AI recommendation engine flagged that both Lambda functions at 512 MB were likely operating in a region of the memory/cost curve where increasing memory allocation reduces total compute cost despite the higher per-GB-second rate. The reason: execution duration drops non-linearly when CPU increases, because Lambda allocates CPU proportionally to memory.&lt;br&gt;
I accepted the recommendation to 1,024 MB, reran the simulation. Projected Lambda cost dropped. The configuration that performs better under load also costs less to run - that counterintuitive result does not surface in any static calculator.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Finding 3: No distribution layer in front of API Gateway&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Under spike load, API Gateway was absorbing the full request volume directly. Adding CloudFront to the canvas and rerunning showed that cacheable responses no longer hit the origin - API Gateway RPS at the ingest layer dropped meaningfully at peak, and the monthly API Gateway cost reduction offset the CloudFront cost.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The result&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Before&lt;/th&gt;
&lt;th&gt;After&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;DynamoDB (campaign day)&lt;/td&gt;
&lt;td&gt;$2,890/mo&lt;/td&gt;
&lt;td&gt;$740/mo&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Lambda (both functions)&lt;/td&gt;
&lt;td&gt;Baseline&lt;/td&gt;
&lt;td&gt;Reduced&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;API Gateway + CloudFront&lt;/td&gt;
&lt;td&gt;$X&lt;/td&gt;
&lt;td&gt;$X − delta&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Total identified saving&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;$3,840/mo&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;All three findings identified before a deployment pipeline was touched. The post-deployment validation on the optimised configuration came in at $30 under the simulation projection.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The broader point&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The dollar figure matters less than the mechanism. These are not obscure optimisations. DynamoDB capacity mode, Lambda memory right-sizing, and distribution layer decisions exist in almost every event-driven AWS architecture. They are routinely not caught until the first billing cycle - not because engineers are negligent, but because the tools required to catch them have historically required deployed infrastructure.&lt;/p&gt;

&lt;p&gt;That constraint is removable. The feedback loop that FinOps typically operates in - deploy, observe, optimise, redeploy - now has a step zero.&lt;br&gt;
Full post with simulation methodology, execution history, and the design-time FinOps checklist I now run on every new service →&lt;/p&gt;

&lt;p&gt;14-day Pro trial, no credit card. Free tier available at &lt;a href="https://dev.tourl"&gt;app.pinpole.cloud&lt;/a&gt;&lt;/p&gt;

</description>
      <category>aws</category>
      <category>finops</category>
      <category>cloudarchitecture</category>
      <category>devops</category>
    </item>
  </channel>
</rss>
