<?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: Jerzy Kopaczewski</title>
    <description>The latest articles on DEV Community by Jerzy Kopaczewski (@jerzy_kopaczewski_ef8ede6).</description>
    <link>https://dev.to/jerzy_kopaczewski_ef8ede6</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%2F3896095%2F7ce8d2c9-5f82-4eb0-aec9-b359f600db09.jpg</url>
      <title>DEV Community: Jerzy Kopaczewski</title>
      <link>https://dev.to/jerzy_kopaczewski_ef8ede6</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/jerzy_kopaczewski_ef8ede6"/>
    <language>en</language>
    <item>
      <title>7 Hard Lessons From 50+ AWS Cloud Migrations</title>
      <dc:creator>Jerzy Kopaczewski</dc:creator>
      <pubDate>Sat, 01 Aug 2026 09:40:10 +0000</pubDate>
      <link>https://dev.to/jerzy_kopaczewski_ef8ede6/7-hard-lessons-from-50-aws-cloud-migrations-o1f</link>
      <guid>https://dev.to/jerzy_kopaczewski_ef8ede6/7-hard-lessons-from-50-aws-cloud-migrations-o1f</guid>
      <description>&lt;p&gt;Every AWS migration starts with the same optimism: "We'll move everything in 6 weeks, save 40% on infra, and never think about servers again."&lt;/p&gt;

&lt;p&gt;Then reality hits.&lt;/p&gt;

&lt;p&gt;I've delivered 50+ AWS migrations over the past 5 years - from 3-person startups on Heroku to 200-person companies running bare metal in colocation. The technology isn't what trips people up. It's the decisions made (or not made) in the first two weeks that determine whether a migration finishes on time or drags on for months.&lt;/p&gt;

&lt;p&gt;Here are the patterns I keep seeing.&lt;/p&gt;

&lt;p&gt;&amp;nbsp;&lt;/p&gt;

&lt;h2&gt;
  
  
  1. You don't have a migration strategy. You have a vague plan to "move stuff."
&lt;/h2&gt;

&lt;p&gt;AWS defines 7 migration strategies (the 7Rs): Retire, Retain, Rehost, Relocate, Replatform, Refactor, Repurchase. Most teams I work with initially want to "just move to AWS" without deciding which strategy applies to which workload.&lt;/p&gt;

&lt;p&gt;The result: everything gets treated as lift-and-shift (rehost), even applications that should be retired or replaced with SaaS. Three months later you're running the same inefficient architecture on EC2 instead of your old servers, paying more, and wondering what went wrong.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What works:&lt;/strong&gt; Spend 3-5 days classifying every workload into a strategy before touching any infrastructure. In a typical 20-app portfolio, I usually see:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;3-4 applications that should be retired (nobody uses them)&lt;/li&gt;
&lt;li&gt;5-7 that can be rehosted (internal tools, legacy systems with short remaining lifespan)&lt;/li&gt;
&lt;li&gt;5-8 that benefit from replatforming (swap self-hosted DB for RDS, cron for Lambda)&lt;/li&gt;
&lt;li&gt;2-3 that genuinely need re-architecting (your core product)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This classification saves months of work on things that shouldn't exist in the first place.&lt;/p&gt;

&lt;p&gt;&amp;nbsp;&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Data transfer costs are invisible until the first bill arrives
&lt;/h2&gt;

&lt;p&gt;Here's the conversation I have on almost every project:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Why is our AWS bill $3,000/month higher than the estimate?"&lt;br&gt;
"Your applications talk to services still running on-premise. Every API call crosses the internet. That's egress at $0.09/GB."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Cross-AZ traffic ($0.01/GB each direction), NAT Gateway processing ($0.045/GB), and egress to the internet - these costs don't show up in the AWS pricing calculator because they depend on traffic patterns you haven't measured yet.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What works:&lt;/strong&gt; During your PoC phase, run actual traffic through the target architecture for 1-2 weeks. Measure real egress. Then multiply by 12. If the number surprises you, architect around it:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;VPC endpoints for S3 and DynamoDB (eliminates NAT Gateway charges for AWS service traffic)&lt;/li&gt;
&lt;li&gt;Keep services that talk to each other frequently in the same AZ&lt;/li&gt;
&lt;li&gt;If you're communicating with on-premise systems, calculate whether AWS Direct Connect ($200-500/month) pays for itself vs. internet egress&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I wrote a &lt;a href="https://devopsity.com/blog/aws-cloud-migration-costs-and-process-step-by-step/" rel="noopener noreferrer"&gt;detailed cost breakdown for each AWS component&lt;/a&gt; if you want to model this before starting.&lt;/p&gt;

&lt;p&gt;&amp;nbsp;&lt;/p&gt;

&lt;h2&gt;
  
  
  3. "We'll fix security later" is the most expensive sentence in cloud
&lt;/h2&gt;

&lt;p&gt;I've seen teams deploy production workloads with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Security groups open to 0.0.0.0/0 on all ports&lt;/li&gt;
&lt;li&gt;IAM policies with &lt;code&gt;"Effect": "Allow", "Action": "*", "Resource": "*"&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Unencrypted RDS instances storing PII&lt;/li&gt;
&lt;li&gt;No CloudTrail, no GuardDuty, no audit trail&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;They always plan to "tighten it up after migration." They never do - until an auditor or a breach forces the issue. Retrofitting security is 3-5x more expensive than building it correctly from day one, because by then you have applications depending on the misconfiguration.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What works:&lt;/strong&gt; Define your security baseline before migrating the first workload:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight hcl"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Terraform - enforce encryption on all RDS instances&lt;/span&gt;
&lt;span class="nx"&gt;resource&lt;/span&gt; &lt;span class="s2"&gt;"aws_db_instance"&lt;/span&gt; &lt;span class="s2"&gt;"main"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c1"&gt;# ...&lt;/span&gt;
  &lt;span class="nx"&gt;storage_encrypted&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
  &lt;span class="nx"&gt;kms_key_id&lt;/span&gt;        &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;aws_kms_key&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;rds&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;arn&lt;/span&gt;

  &lt;span class="c1"&gt;# Never do this in production:&lt;/span&gt;
  &lt;span class="c1"&gt;# publicly_accessible = true&lt;/span&gt;
  &lt;span class="nx"&gt;publicly_accessible&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Enable CloudTrail, GuardDuty, and Security Hub on day one. They cost almost nothing compared to the alternative.&lt;/p&gt;

&lt;p&gt;&amp;nbsp;&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Big-bang migrations always fail in the same way
&lt;/h2&gt;

&lt;p&gt;Team decides to migrate everything over a single weekend. Friday evening: "Here we go." Saturday 3 AM: the database migration hangs at 73%. Sunday: half the team is debugging DNS while the other half discovers that the payment service depends on an internal API that hasn't been migrated yet. Monday: rollback.&lt;/p&gt;

&lt;p&gt;I've watched this happen three times. The problem isn't technical competence - it's blast radius. When everything moves at once, a single failure cascades through dependencies you didn't map.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What works:&lt;/strong&gt; Migrate in waves:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Wave 0:&lt;/strong&gt; Non-critical internal tools (low risk, builds team confidence)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Wave 1:&lt;/strong&gt; Stateless services (API gateways, frontend)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Wave 2:&lt;/strong&gt; Stateful services (databases, queues)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Wave 3:&lt;/strong&gt; Core business logic (payment, auth)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Each wave has a defined rollback plan. Each wave reveals patterns you'll reuse in the next. The total calendar time is longer, but the actual time-to-completion is shorter because you're not spending weekends recovering from cascading failures.&lt;/p&gt;

&lt;p&gt;&amp;nbsp;&lt;/p&gt;

&lt;h2&gt;
  
  
  5. You're treating AWS like a data centre
&lt;/h2&gt;

&lt;p&gt;The classic anti-pattern: team migrates to AWS, deploys everything on oversized EC2 instances that run 24/7, never configures auto-scaling, and ends up paying more than on-premise.&lt;/p&gt;

&lt;p&gt;Congratulations - you've built a very expensive data centre with a nicer console.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What works:&lt;/strong&gt; &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Right-size from day one.&lt;/strong&gt; Start with the smallest instance that passes your load tests, not the largest that "feels safe."&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Schedule non-production environments.&lt;/strong&gt; Dev and staging don't need to run at 3 AM. Shutting them down outside business hours saves 65%.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Use Savings Plans for baseline load.&lt;/strong&gt; If you know you'll always need at least 10 vCPUs of Fargate, buy a Compute Savings Plan for that baseline. You'll save 30-40% vs. on-demand.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Auto-scale everything.&lt;/strong&gt; ECS services, EC2 Auto Scaling Groups, RDS read replicas. If it can scale, it should.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&amp;nbsp;&lt;/p&gt;

&lt;h2&gt;
  
  
  6. The PoC that wasn't
&lt;/h2&gt;

&lt;p&gt;Some teams skip the Proof of Concept and go straight from assessment to building production infrastructure. Their reasoning: "We know what architecture we want, why prototype it first?"&lt;/p&gt;

&lt;p&gt;Then they discover in month 3 that:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Aurora's connection limit doesn't work with their connection pooling approach&lt;/li&gt;
&lt;li&gt;Cross-region latency breaks their real-time collaboration feature&lt;/li&gt;
&lt;li&gt;The CI/CD pipeline takes 45 minutes because they chose the wrong build instance type&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A 1-2 week PoC with your key workload would have surfaced all of these for the cost of a few hundred dollars in AWS charges.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What works:&lt;/strong&gt; Build a throwaway prototype of your most complex workload. Not a production-ready environment - a minimal version that exercises the critical path: compute, database, networking, deployment. Measure performance. Measure cost. Then throw it away and build the real thing informed by actual data.&lt;/p&gt;

&lt;p&gt;&amp;nbsp;&lt;/p&gt;

&lt;h2&gt;
  
  
  7. Nobody owns the cloud after migration
&lt;/h2&gt;

&lt;p&gt;The migration team delivers, high-fives all around, and... who maintains this now?&lt;/p&gt;

&lt;p&gt;If the answer is "we'll figure it out," you'll figure it out at 2 AM when the first production incident hits and nobody knows how to read CloudWatch dashboards or interpret ECS task failures.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What works:&lt;/strong&gt; Define the operating model before migration:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Who gets paged when something breaks?&lt;/li&gt;
&lt;li&gt;Who approves infrastructure changes?&lt;/li&gt;
&lt;li&gt;Who reviews the AWS bill monthly?&lt;/li&gt;
&lt;li&gt;Where are the runbooks for common failures?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The migration is a project. What comes after is an operating model. Plan for both.&lt;/p&gt;




&lt;h2&gt;
  
  
  The pattern underneath all of these
&lt;/h2&gt;

&lt;p&gt;Every one of these mistakes comes from the same root cause: optimising for speed of starting over speed of finishing.&lt;/p&gt;

&lt;p&gt;Teams that spend 1-2 weeks on assessment and PoC before writing any Terraform finish faster than teams that start building on day one. Counter-intuitive, but consistently true across every migration I've delivered.&lt;/p&gt;

&lt;p&gt;If you're planning an AWS migration and want to avoid these patterns, I wrote a &lt;a href="https://devopsity.com/blog/aws-cloud-migration-costs-and-process-step-by-step/" rel="noopener noreferrer"&gt;comprehensive guide covering the 7R strategies, AWS migration tools, real cost breakdowns and the full 6-phase process&lt;/a&gt; based on what actually works in practice.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;I'm Jerzy, founder at &lt;a href="https://devopsity.com" rel="noopener noreferrer"&gt;Devopsity&lt;/a&gt; - we help companies migrate to AWS and build cloud-native infrastructure. If you're stuck mid-migration or evaluating whether to start one, I'm happy to chat.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>aws</category>
      <category>devops</category>
      <category>cloud</category>
      <category>migration</category>
    </item>
    <item>
      <title>I compared the real cost of running LLMs on AWS - here's when each option makes sense</title>
      <dc:creator>Jerzy Kopaczewski</dc:creator>
      <pubDate>Mon, 20 Jul 2026 09:58:11 +0000</pubDate>
      <link>https://dev.to/jerzy_kopaczewski_ef8ede6/i-compared-the-real-cost-of-running-llms-on-aws-heres-when-each-option-makes-sense-4o61</link>
      <guid>https://dev.to/jerzy_kopaczewski_ef8ede6/i-compared-the-real-cost-of-running-llms-on-aws-heres-when-each-option-makes-sense-4o61</guid>
      <description>&lt;p&gt;AWS gives you three ways to run LLM inference in production. I've deployed all three for clients and the decision always comes down to the same variables: volume, team size, and how much you value your weekends.&lt;/p&gt;

&lt;p&gt;Here's the short version.&lt;/p&gt;

&lt;h2&gt;
  
  
  The three paths
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Bedrock&lt;/strong&gt; — Fully managed, pay-per-token. You call an API, you get tokens back. No GPUs, no cold starts, no 3am pages about OOM pods.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;SageMaker Endpoints&lt;/strong&gt; - Semi-managed. You bring your model (or a fine-tuned one), deploy it on dedicated instances, and handle autoscaling. Pay per hour whether you're serving requests or not.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Self-hosted on EKS&lt;/strong&gt; — Full control. vLLM or TGI on GPU spot instances with Karpenter. Cheapest per token at scale, most operational overhead.&lt;/p&gt;

&lt;h2&gt;
  
  
  The cost crossover that matters
&lt;/h2&gt;

&lt;p&gt;This is the table I keep coming back to with every client:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Volume&lt;/th&gt;
&lt;th&gt;Bedrock (Haiku)&lt;/th&gt;
&lt;th&gt;SageMaker (g5.xlarge)&lt;/th&gt;
&lt;th&gt;EKS (g5.xlarge spot)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1K req/day&lt;/td&gt;
&lt;td&gt;~$36/mo ✓&lt;/td&gt;
&lt;td&gt;~$1,015/mo&lt;/td&gt;
&lt;td&gt;~$674/mo&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;50K req/day&lt;/td&gt;
&lt;td&gt;~$1,800/mo&lt;/td&gt;
&lt;td&gt;~$1,015/mo&lt;/td&gt;
&lt;td&gt;~$674/mo ✓&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;500K req/day&lt;/td&gt;
&lt;td&gt;~$18,000/mo&lt;/td&gt;
&lt;td&gt;~$6,090/mo&lt;/td&gt;
&lt;td&gt;~$2,022/mo ✓&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The crossover point where self-hosting beats Bedrock: &lt;strong&gt;10,000–20,000 requests/day&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Below that, Bedrock wins on simplicity alone. Above it, you're leaving serious money on the table.&lt;/p&gt;

&lt;h2&gt;
  
  
  The hidden cost nobody models upfront
&lt;/h2&gt;

&lt;p&gt;Teams prototype on Bedrock (smart move — it's the fastest path to production). But the cost curve isn't linear. At 10K requests/day it's cheap. At 50K it's "we need to talk to finance." At 500K it's a rearchitecture project.&lt;/p&gt;

&lt;p&gt;The mistake is not choosing Bedrock at low volume. The mistake is not planning the exit path before you need it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Quick decision framework
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;You should pick...&lt;/th&gt;
&lt;th&gt;When...&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Bedrock&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;No ML infra team, &amp;lt;50K req/day, need frontier models (Claude, Llama)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;SageMaker&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Fine-tuned models, predictable traffic, need dedicated VPC&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;EKS self-hosted&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&amp;gt;100K req/day, open-source models, dedicated platform team&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  What I actually recommend
&lt;/h2&gt;

&lt;p&gt;Use a hybrid. Most production systems I've deployed use:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Bedrock&lt;/strong&gt; for complex reasoning and customer-facing chat (low volume, high quality)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Self-hosted vLLM on EKS&lt;/strong&gt; for classification, extraction, and embeddings (high volume, cost-sensitive)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Route by task complexity. Best of both worlds.&lt;/p&gt;

&lt;h2&gt;
  
  
  The full breakdown
&lt;/h2&gt;

&lt;p&gt;I wrote a detailed guide covering:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;July 2026 pricing tables for all three options&lt;/li&gt;
&lt;li&gt;Latency benchmarks (TTFT p50/p99)&lt;/li&gt;
&lt;li&gt;Karpenter NodePool manifests for GPU spot instances&lt;/li&gt;
&lt;li&gt;vLLM Kubernetes deployment YAML&lt;/li&gt;
&lt;li&gt;SageMaker autoscaling configuration&lt;/li&gt;
&lt;li&gt;Bedrock Guardrails for regulated workloads&lt;/li&gt;
&lt;li&gt;eu-west-2 data residency considerations for UK organisations&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;👉 &lt;strong&gt;&lt;a href="https://devopsity.com/blog/running-llm-inference-on-aws-bedrock-vs-sagemaker-vs-self-hosted-eks/" rel="noopener noreferrer"&gt;Full article: AWS Bedrock vs SageMaker vs Self-Hosted EKS — LLM Inference Cost, Latency &amp;amp; Architecture Compared&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;




&lt;p&gt;What's your setup? Are you running managed, self-hosted, or a mix? I'd be curious to hear where the cost crossover landed for your workloads.&lt;/p&gt;

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