<?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: Aakash Choudhary</title>
    <description>The latest articles on DEV Community by Aakash Choudhary (@aakashio).</description>
    <link>https://dev.to/aakashio</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%2F3264269%2F6aab3cc8-5e59-4d30-b52d-ffb94af1100e.png</url>
      <title>DEV Community: Aakash Choudhary</title>
      <link>https://dev.to/aakashio</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/aakashio"/>
    <language>en</language>
    <item>
      <title>I accidentally deployed into PRODUCTION</title>
      <dc:creator>Aakash Choudhary</dc:creator>
      <pubDate>Fri, 10 Apr 2026 04:57:44 +0000</pubDate>
      <link>https://dev.to/aakashio/i-accidentally-deployed-into-production-5b6a</link>
      <guid>https://dev.to/aakashio/i-accidentally-deployed-into-production-5b6a</guid>
      <description>&lt;p&gt;Oops. I pulled a classic "test in production" maneuver... except it wasn’t supposed to be a test.&lt;/p&gt;

&lt;p&gt;I’ve been quietly hacking away on a side project. Last week, during a late-night dev session, my tired brain accidentally pushed our raw, internal build straight to the live domain. &lt;/p&gt;

&lt;p&gt;Before I could even fix it, a handful of you eagle-eyed folks somehow found it. My tiny setup was definitely &lt;em&gt;not&lt;/em&gt; ready for the sudden traffic. If you caught the "accidental launch" and got hit with some spicy downtime or dropped connections—my bad! Honestly, I'm just amazed you spotted it so fast.&lt;/p&gt;

&lt;p&gt;So, since the cat is officially out of the bag... what exactly broke my tiny server? 👀&lt;/p&gt;

&lt;h3&gt;
  
  
  Enter: sketchmyinfra.com
&lt;/h3&gt;

&lt;p&gt;As a DevOps engineer, I &lt;em&gt;hate&lt;/em&gt; dragging, dropping, and trying to perfectly align little boxes just to make an architecture diagram. &lt;/p&gt;

&lt;p&gt;So, I'm building a lightweight tool that lets DevOps engineers, Cloud Architects, and Developers generate clean, up-to-date architecture diagrams &lt;strong&gt;directly from plain text&lt;/strong&gt;. &lt;/p&gt;

&lt;p&gt;Since a few of you already peeked behind the curtain, I decided to stop hiding and just officially open up the Live Demo. 🚀&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🛠️ Where things stand right now:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;It’s a Work in Progress:&lt;/strong&gt; It's basically just me hacking this together, so expect a few bugs, rough edges, and missing pieces.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;AWS First:&lt;/strong&gt; Right now, I'm baking in full, integrated support for AWS infrastructure diagrams.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;The Roadmap:&lt;/strong&gt; Scaling the logic to support other cloud environments down the road.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Go ahead and give it a spin: &lt;strong&gt;&lt;a href="https://sketchmyinfra.com" rel="noopener noreferrer"&gt;sketchmyinfra.com&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;(Please try to break it gently this time, the servers are still small!)&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;I have some massive extensions for this in the works, but right now, your feedback is my fuel. Drop your thoughts, bug reports, or feature requests in the comments! 👇&lt;/p&gt;

</description>
      <category>ai</category>
      <category>devops</category>
      <category>aws</category>
      <category>lowcode</category>
    </item>
    <item>
      <title>Your Architecture Diagram Is Lying To You</title>
      <dc:creator>Aakash Choudhary</dc:creator>
      <pubDate>Wed, 08 Apr 2026 09:02:33 +0000</pubDate>
      <link>https://dev.to/aakashio/your-architecture-diagram-is-lying-to-you-224k</link>
      <guid>https://dev.to/aakashio/your-architecture-diagram-is-lying-to-you-224k</guid>
      <description>&lt;h2&gt;
  
  
  The 30-Minute Lie
&lt;/h2&gt;

&lt;p&gt;Last month, I spent 30 minutes in Lucidchart before a design review.&lt;/p&gt;

&lt;p&gt;I dragged every box. Connected every arrow. Labeled every subnet, every security group, every load balancer. It looked beautiful.&lt;/p&gt;

&lt;p&gt;By the next sprint, half of it was wrong.&lt;/p&gt;

&lt;p&gt;A new service had been added. The auth flow had moved to a different VPC. Someone swapped Redis for DynamoDB. Nobody updated the diagram. Why would they? It lived in a tool nobody opened unless there was a meeting.&lt;/p&gt;

&lt;p&gt;That diagram — the one I spent 30 minutes on — became a lie.&lt;/p&gt;

&lt;p&gt;And here's the thing: &lt;strong&gt;this happens in every team I've worked with.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  We Solved This Problem Everywhere Else
&lt;/h2&gt;

&lt;p&gt;Think about what DevOps has automated in the last decade:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Infrastructure&lt;/strong&gt; → Terraform, Pulumi, CloudFormation&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Configuration&lt;/strong&gt; → Ansible, Chef, Puppet&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Deployments&lt;/strong&gt; → ArgoCD, Flux, GitHub Actions&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Monitoring&lt;/strong&gt; → Prometheus rules as code, Grafana dashboards as JSON&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Security policies&lt;/strong&gt; → OPA, Sentinel&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Documentation&lt;/strong&gt; → Markdown in the repo, generated API docs&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We version control everything. We code-review everything. We automate everything.&lt;/p&gt;

&lt;p&gt;Except the one thing every engineer asks for in their first week:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Do we have an architecture diagram?"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;And the answer is always the same: &lt;em&gt;"There's one in Confluence, but it's probably outdated."&lt;/em&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Why Diagrams Resist Automation
&lt;/h2&gt;

&lt;p&gt;I've thought about this a lot. Here's why diagrams have stayed manual while everything else moved to code:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. The tools are built for designers, not engineers
&lt;/h3&gt;

&lt;p&gt;Lucidchart, Draw.io, Miro — they optimize for visual fidelity and drag-and-drop. None of them treat diagrams as artifacts that should live next to code.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. PlantUML and Mermaid exist, but they have a learning curve
&lt;/h3&gt;

&lt;p&gt;Yes, you &lt;em&gt;can&lt;/em&gt; write diagrams in code today. But the syntax is unfamiliar, the AWS/GCP icon libraries are clunky, and most engineers give up after their first attempt.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. There's no source of truth
&lt;/h3&gt;

&lt;p&gt;Your Terraform describes what &lt;em&gt;exists&lt;/em&gt;. Your diagram describes what someone &lt;em&gt;thought&lt;/em&gt; existed three months ago. They drift, and there's no reconciliation.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Diagrams die in PR review
&lt;/h3&gt;

&lt;p&gt;You can't review a &lt;code&gt;.png&lt;/code&gt; in a pull request. You can't diff two versions of a Lucidchart export. So diagrams stay outside the review process — and outside, they rot.&lt;/p&gt;




&lt;h2&gt;
  
  
  What Would "Diagrams as Code" Actually Look Like?
&lt;/h2&gt;

&lt;p&gt;If we applied the same principles to diagrams that we apply to infrastructure, here's what changes:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&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;Open Lucidchart&lt;/td&gt;
&lt;td&gt;Type a description&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Drag boxes for 30 minutes&lt;/td&gt;
&lt;td&gt;Generate in 5 seconds&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Export to PNG&lt;/td&gt;
&lt;td&gt;Commit the source to git&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Forget to update&lt;/td&gt;
&lt;td&gt;Diff in pull requests&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;One source of truth in someone's head&lt;/td&gt;
&lt;td&gt;One source of truth in the repo&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The diagram becomes a &lt;strong&gt;build artifact&lt;/strong&gt;, not a manual task.&lt;/p&gt;

&lt;p&gt;You describe your system in plain English. A tool turns that description into a clean, accurate diagram. The description lives in your repo. It gets reviewed in PRs. When the system changes, the description changes with it.&lt;/p&gt;

&lt;p&gt;The diagram stops being a lie.&lt;/p&gt;




&lt;h2&gt;
  
  
  What I'm Building
&lt;/h2&gt;

&lt;p&gt;This is the problem I'm trying to solve with &lt;strong&gt;SketchMyInfra&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The idea is simple: type what you're building, get an accurate architecture diagram in seconds. No drag-and-drop. No icon libraries to learn. No more 30-minute Lucidchart sessions before design reviews.&lt;/p&gt;

&lt;p&gt;I'm building it in public — backend is in progress, frontend waitlist is live. If this resonates with you, I'd love to hear:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Have you experienced the diagram-rot problem?&lt;/strong&gt; How does your team deal with it today?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;What would make a tool like this actually useful&lt;/strong&gt; to you in your workflow?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;What's the worst outdated diagram you've ever inherited?&lt;/strong&gt; (We've all got one.)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Drop your thoughts in the comments. And if you want to follow along or join the beta when it ships, you can sign up at &lt;a href="https://sketchmyinfra.com" rel="noopener noreferrer"&gt;sketchmyinfra.com&lt;/a&gt;.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;I'll be writing about the architecture, the AI prompt engineering, and the deployment as I build. Follow along if you're into build-in-public stories.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>devops</category>
      <category>architecture</category>
      <category>buildinpublic</category>
      <category>infrastructureascode</category>
    </item>
    <item>
      <title>[Boost]</title>
      <dc:creator>Aakash Choudhary</dc:creator>
      <pubDate>Wed, 28 Jan 2026 18:50:22 +0000</pubDate>
      <link>https://dev.to/aakashio/-ei2</link>
      <guid>https://dev.to/aakashio/-ei2</guid>
      <description>&lt;div class="ltag__link"&gt;
  &lt;a href="/aakashio" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__pic"&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.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3264269%2F6aab3cc8-5e59-4d30-b52d-ffb94af1100e.png" alt="aakashio"&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="https://dev.to/aakashio/github-actions-has-a-cleanup-problem-so-i-built-a-tool-46hh" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;GitHub Actions Has a Cleanup Problem — So I Built a Tool&lt;/h2&gt;
      &lt;h3&gt;Aakash Choudhary ・ Jan 28&lt;/h3&gt;
      &lt;div class="ltag__link__taglist"&gt;
        &lt;span class="ltag__link__tag"&gt;#github&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#githubactions&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#cli&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#python&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;


</description>
      <category>github</category>
      <category>githubactions</category>
      <category>cli</category>
      <category>python</category>
    </item>
    <item>
      <title>GitHub Actions Has a Cleanup Problem — So I Built a Tool</title>
      <dc:creator>Aakash Choudhary</dc:creator>
      <pubDate>Wed, 28 Jan 2026 18:48:20 +0000</pubDate>
      <link>https://dev.to/aakashio/github-actions-has-a-cleanup-problem-so-i-built-a-tool-46hh</link>
      <guid>https://dev.to/aakashio/github-actions-has-a-cleanup-problem-so-i-built-a-tool-46hh</guid>
      <description>&lt;h1&gt;
  
  
  gh-prune 🧹
&lt;/h1&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;           __                                                                 
          /  |                                                                
  ______  $$ |____            ______    ______   __    __  _______    ______  
 /      \ $$      \  ______  /      \  /      \ /  |  /  |/       \  /      \ 
/$$$$$$  |$$$$$$$  |/      |/$$$$$$  |/$$$$$$  |$$ |  $$ |$$$$$$$  |/$$$$$$  |
$$ |  $$ |$$ |  $$ |$$$$$$/ $$ |  $$ |$$ |  $$/ $$ |  $$ |$$ |  $$ |$$    $$ |
$$ \__$$ |$$ |  $$ |        $$ |__$$ |$$ |      $$ \__$$ |$$ |  $$ |$$$$$$$$/ 
$$    $$ |$$ |  $$ |        $$    $$/ $$ |      $$    $$/ $$ |  $$ |$$       |
 $$$$$$$ |$$/   $$/         $$$$$$$/  $$/        $$$$$$/  $$/   $$/  $$$$$$$/ 
/  \__$$ |                  $$ |                                              
$$    $$/                   $$ |                                              
 $$$$$$/                    $$/                                               
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Keep your GitHub Actions clean. No more ghost workflows.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The Problem
&lt;/h2&gt;

&lt;p&gt;If you use GitHub Actions regularly, you’ve probably noticed something odd:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; You delete a workflow file (&lt;code&gt;.github/workflows/old-flow.yml&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;But the workflow still appears in the Actions tab.&lt;/strong&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Then comes the painful part:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Clicking through runs one by one.&lt;/li&gt;
&lt;li&gt;Manually deleting history.&lt;/li&gt;
&lt;li&gt;Realizing there’s no native bulk cleanup button.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;As a DevOps engineer, this felt like unnecessary friction. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;gh-prune&lt;/strong&gt; solves this.&lt;/p&gt;




&lt;h2&gt;
  
  
  What is gh-prune?
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;gh-prune&lt;/code&gt; is a Python-based CLI tool built on top of the GitHub CLI. It is designed to inspect your repository, identify workflow runs, and help you bulk-delete old or unwanted history to properly clean up the Actions UI.&lt;/p&gt;

&lt;h3&gt;
  
  
  Key Features
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;🔍 &lt;strong&gt;Inspect&lt;/strong&gt; GitHub Actions workflows.&lt;/li&gt;
&lt;li&gt;📋 &lt;strong&gt;List&lt;/strong&gt; workflow runs clearly.&lt;/li&gt;
&lt;li&gt;🗑️ &lt;strong&gt;Bulk Delete&lt;/strong&gt; old or unwanted runs.&lt;/li&gt;
&lt;li&gt;✨ &lt;strong&gt;Clean&lt;/strong&gt; the Actions UI of "deleted" workflows that persist in history.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Prerequisites
&lt;/h2&gt;

&lt;p&gt;Because &lt;code&gt;gh-prune&lt;/code&gt; leverages the official GitHub CLI for authentication and API interaction, you must have it installed and authenticated.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; &lt;strong&gt;Install GitHub CLI:&lt;/strong&gt; &lt;a href="https://github.com/ifaakash/gh-prune" rel="noopener noreferrer"&gt;Installation Guide&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Authenticate:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;gh auth login
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Installation
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;gh-prune&lt;/code&gt; is available on PyPI. You can install it via pip:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;gh-prune
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>github</category>
      <category>githubactions</category>
      <category>cli</category>
      <category>python</category>
    </item>
    <item>
      <title>How I Fixed the “CannotPullContainer” When Running .NET on ECS Fargate (And Made My Docker Image Multi-Platform with Buildx)</title>
      <dc:creator>Aakash Choudhary</dc:creator>
      <pubDate>Thu, 07 Aug 2025 08:39:21 +0000</pubDate>
      <link>https://dev.to/aakashio/how-i-fixed-the-cannotpullcontainer-when-running-net-on-ecs-fargate-and-made-my-docker-image-7lg</link>
      <guid>https://dev.to/aakashio/how-i-fixed-the-cannotpullcontainer-when-running-net-on-ecs-fargate-and-made-my-docker-image-7lg</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.amazonaws.com%2Fuploads%2Farticles%2Fwd3c75p7ufvsv7bceh47.png" 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.amazonaws.com%2Fuploads%2Farticles%2Fwd3c75p7ufvsv7bceh47.png" alt=" " width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I deployed my .NET app to ECS Fargate, and Docker hit me with a platform error I didn't even know existed."&lt;/p&gt;

&lt;p&gt;In this post, I am sharing my personal experience to debug this issue, a deep dive into docker dependency on the OS architectures, on which it's been running on , and a fix that every DevOps engineer should know.&lt;/p&gt;

&lt;h2&gt;
  
  
  Summary
&lt;/h2&gt;

&lt;p&gt;If you've hit the error:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;CannotPullContainerError: pull image manifest has been retried 7 time(s): image manifest. does not container description matching platform 'linux/amd64'
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You're likely trying to run a Docker image built for one architecture (say, &lt;strong&gt;ARM64&lt;/strong&gt;) on a platform that only supports another (like &lt;strong&gt;AMD64&lt;/strong&gt; or Windows). Here's how I ran into this error while deploying a .NET Core app on AWS Fargate, and how I fixed it by building a multi-platform Docker image.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Night of Murder
&lt;/h2&gt;

&lt;p&gt;I was casually deploying a .NET Core application to my ECS Fargate cluster, sipping coffee… when suddenly "CannotPullContainerError" struck.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;"pull image manifest has been retried 7 time(s): image manifest does not contain descriptor matching platform 'linux/amd64'"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;My first reaction? &lt;/strong&gt;&lt;br&gt;
"Well, this night just is going to be long"&lt;/p&gt;
&lt;h2&gt;
  
  
  Debugging the Beast
&lt;/h2&gt;

&lt;p&gt;The clue was hiding in plain sight: 'linux/amd64' in the error message.&lt;/p&gt;

&lt;p&gt;It was yelling at me:&lt;/p&gt;

&lt;p&gt;&lt;em&gt;"Hey buddy! I'm trying to run your image, but I can't find the right OS/kernel architecture to match it!"&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;That's when i focused on architecture point&lt;/p&gt;
&lt;h2&gt;
  
  
  The Dockerfile I Used
&lt;/h2&gt;

&lt;p&gt;Here's the super basic Dockerfile I used to containerize the app:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build
WORKDIR /builds
COPY . ./
RUN dotnet publish -c Release -o output

FROM mcr.microsoft.com/dotnet/aspnet:8.0 AS runtime
WORKDIR /app
# copy all the build files form the build stage
COPY --from=build /builds/output ./
EXPOSE 8190
ENTRYPOINT ["dotnet", "poc-dockerised-application.dll"]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Looks good, right? But here's where I messed up…&lt;/p&gt;

&lt;h2&gt;
  
  
  Platform ≠ Platform
&lt;/h2&gt;

&lt;p&gt;The base image mcr.microsoft.com/dotnet/sdk:8.0 is not automatically built for all platforms.&lt;/p&gt;

&lt;p&gt;In my case, I was running this on a Windows-based system or trying to deploy on a Fargate host expecting a specific architecture (linux/amd64), while the image may have been for arm64.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to Check Docker Image Architectures
&lt;/h2&gt;

&lt;p&gt;Use this command to inspect what platforms an image supports:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;docker buildx imagetools inspect mcr.microsoft.com/dotnet/sdk:8.0&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;You'll see output listing supported platforms like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;linux/amd64
linux/arm64
windows/amd64
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If your platform isn't listed. Well, tough luck. Docker won't run it.&lt;/p&gt;

&lt;h2&gt;
  
  
  But What Even Is a Platform in Docker?
&lt;/h2&gt;

&lt;p&gt;A Docker "&lt;strong&gt;platform&lt;/strong&gt;" is basically the combo of:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;OS (like Linux or Windows)&lt;br&gt;
CPU architecture (like amd64 or arm64)&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Think of it as the compatibility handshake between your image and the machine it runs on. If the handshake fails → boom, the error I got.&lt;/p&gt;
&lt;h2&gt;
  
  
  How to Check Your Own Machine's Architecture
&lt;/h2&gt;

&lt;p&gt;Run:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;uname -m&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Example outputs:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;x86_64 = amd64
aarch64 = arm64
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  The Fix: Build a Multi-Platform Docker Image
&lt;/h2&gt;

&lt;p&gt;Once I realized the architecture mismatch, I knew I had two options:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Use an image that matches the platform (e.g., linux/amd64)&lt;/li&gt;
&lt;li&gt;Or better yet, build a multi-platform image that works everywhere&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Here's how I did it with Docker Buildx:
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;docker buildx build --platform linux/amd64,linux/arm64 -t my-dotnet-app:multi .&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Now, your image is a universal soldier now!&lt;/p&gt;

&lt;h2&gt;
  
  
  Key Takeaways
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Docker images are &lt;strong&gt;platform-specific&lt;/strong&gt; unless explicitly built otherwise&lt;/li&gt;
&lt;li&gt;ECS Fargate uses &lt;strong&gt;linux/amd64&lt;/strong&gt; unless you provision ARM-specific infra&lt;/li&gt;
&lt;li&gt;Always check what &lt;strong&gt;platforms your base image supports&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Use docker &lt;strong&gt;buildx&lt;/strong&gt; to build for multiple platforms in one go&lt;/li&gt;
&lt;li&gt;Architecture mismatches are sneaky - but easy to fix when you know where to look&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Follow for More
&lt;/h2&gt;

&lt;p&gt;If this helped or sparked an idea, drop a comment, or reach out!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/ifaakash/whats-my-ip-lambda" rel="noopener noreferrer"&gt;Github Repo&lt;/a&gt;&lt;br&gt;
&lt;a href="http://aakashc.work" rel="noopener noreferrer"&gt;My Portfolio&lt;/a&gt;&lt;br&gt;
&lt;a href="https://medium.com/r/?url=https%3A%2F%2Fwww.linkedin.com%2Fin%2Faakashch2%2F" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt;&lt;/p&gt;

</description>
      <category>docker</category>
      <category>aws</category>
      <category>ecs</category>
      <category>serverless</category>
    </item>
    <item>
      <title>Architecture of AWS Lambda</title>
      <dc:creator>Aakash Choudhary</dc:creator>
      <pubDate>Wed, 16 Jul 2025 10:56:58 +0000</pubDate>
      <link>https://dev.to/aakashio/architecture-of-aws-lambda-2nmd</link>
      <guid>https://dev.to/aakashio/architecture-of-aws-lambda-2nmd</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%2Fcdn-images-1.medium.com%2Fmax%2F1600%2F1%2Aw_Xh1taTjO0ztIl8SuvLAw.png%2520align%3D" 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%2Fcdn-images-1.medium.com%2Fmax%2F1600%2F1%2Aw_Xh1taTjO0ztIl8SuvLAw.png%2520align%3D" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Note: If you’re not a medium member, &lt;a href="https://medium.com/@aakashc.dev/architecture-of-aws-lambda-017d5ff633a6?sk=b08a3ce12f2f84de84bb41af9aa17a3f" rel="noopener noreferrer"&gt;CLICK H&lt;/a&gt;&lt;a href="https://medium.com/@aakashc.dev/architecture-of-aws-lambda-017d5ff633a6?sk=b08a3ce12f2f84de84bb41af9aa17a3f" rel="noopener noreferrer"&gt;ERE&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://medium.com/@aakashc.dev/architecture-of-aws-lambda-017d5ff633a6?sk=b08a3ce12f2f84de84bb41af9aa17a3f" rel="noopener noreferrer"&gt;&lt;strong&gt;AWS L&lt;/strong&gt;&lt;/a&gt;&lt;strong&gt;ambda = Serverless&lt;/strong&gt; &lt;a href="https://medium.com/@aakashc.dev/architecture-of-aws-lambda-017d5ff633a6?sk=b08a3ce12f2f84de84bb41af9aa17a3f" rel="noopener noreferrer"&gt;&lt;strong&gt;Functions-&lt;/strong&gt;&lt;/a&gt;&lt;strong&gt;as-a-Service (FaaS)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;You write the code &lt;a href="https://medium.com/@aakashc.dev/architecture-of-aws-lambda-017d5ff633a6?sk=b08a3ce12f2f84de84bb41af9aa17a3f" rel="noopener noreferrer"&gt;→ Lambda&lt;/a&gt; runs it when an event happens → You don’t tou&lt;a href="https://medium.com/@aakashc.dev/architecture-of-aws-lambda-017d5ff633a6?sk=b08a3ce12f2f84de84bb41af9aa17a3f" rel="noopener noreferrer"&gt;ch a singl&lt;/a&gt;e server.&lt;/p&gt;

&lt;p&gt;It’s called &lt;strong&gt;&lt;em&gt;FaaS&lt;/em&gt;&lt;/strong&gt; because you’re essentially running just your function &lt;em&gt;as&lt;/em&gt; &lt;a href="https://medium.com/@aakashc.dev/architecture-of-aws-lambda-017d5ff633a6?sk=b08a3ce12f2f84de84bb41af9aa17a3f" rel="noopener noreferrer"&gt;&lt;em&gt;a service&lt;/em&gt;&lt;/a&gt;. No need to spin up EC2s or build any Infrastructure( like setting up networking and a new EC2 instance to deploy and run your application). Its like running a simple Python script that just works — &lt;strong&gt;&lt;em&gt;zero setup&lt;/em&gt;&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;You write code → Lambda executes it in response to an event → No need to&lt;/em&gt;&lt;/strong&gt; &lt;a href="https://medium.com/@aakashc.dev/architecture-of-aws-lambda-017d5ff633a6?sk=b08a3ce12f2f84de84bb41af9aa17a3f" rel="noopener noreferrer"&gt;&lt;strong&gt;&lt;em&gt;provision&lt;/em&gt;&lt;/strong&gt;&lt;/a&gt; &lt;strong&gt;&lt;em&gt;or manage servers.&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;FaaS because this helps you to run your function as a service. You dont n&lt;a href="https://medium.com/@aakashc.dev/architecture-of-aws-lambda-017d5ff633a6?sk=b08a3ce12f2f84de84bb41af9aa17a3f" rel="noopener noreferrer"&gt;eed to set&lt;/a&gt;up the infra to run you application( lets take simple python application as example for now).&lt;/p&gt;

&lt;p&gt;Feature of Lambda&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Trigger-based execution&lt;/strong&gt;: Events (like S3 upload, API &lt;a href="https://medium.com/@aakashc.dev/architecture-of-aws-lambda-017d5ff633a6?sk=b08a3ce12f2f84de84bb41af9aa17a3f" rel="noopener noreferrer"&gt;Gateway H&lt;/a&gt;TTP call et&lt;a href="https://medium.com/@aakashc.dev/architecture-of-aws-lambda-017d5ff633a6?sk=b08a3ce12f2f84de84bb41af9aa17a3f" rel="noopener noreferrer"&gt;c.) trigge&lt;/a&gt;r the function.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Stateless&lt;/strong&gt;: No persistent local state — use services like S3, DynamoDB, RD&lt;a href="https://medium.com/@aakashc.dev/architecture-of-aws-lambda-017d5ff633a6?sk=b08a3ce12f2f84de84bb41af9aa17a3f" rel="noopener noreferrer"&gt;S external&lt;/a&gt;ly.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Auto-scaling&lt;/strong&gt;: AWS handles concurrency and scaling behind the scenes ( com&lt;a href="https://medium.com/@aakashc.dev/architecture-of-aws-lambda-017d5ff633a6?sk=b08a3ce12f2f84de84bb41af9aa17a3f" rel="noopener noreferrer"&gt;ment for s&lt;/a&gt;eperate medium article for in-depth analysis of concurrency)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Short-lived tasks&lt;/strong&gt;: &lt;em&gt;Max 15 mins&lt;/em&gt; per invocation.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Cost-efficient&lt;/strong&gt;: Pay onl&lt;a href="https://medium.com/@aakashc.dev/architecture-of-aws-lambda-017d5ff633a6?sk=b08a3ce12f2f84de84bb41af9aa17a3f" rel="noopener noreferrer"&gt;y for exec&lt;/a&gt;ution time and resources used.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Where &lt;a href="https://medium.com/@aakashc.dev/architecture-of-aws-lambda-017d5ff633a6?sk=b08a3ce12f2f84de84bb41af9aa17a3f" rel="noopener noreferrer"&gt;Does Lambd&lt;/a&gt;a Actually Run?
&lt;/h3&gt;

&lt;p&gt;Internally, Lambda uses:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Firecracker&lt;/strong&gt; &lt;a href="https://medium.com/@aakashc.dev/architecture-of-aws-lambda-017d5ff633a6?sk=b08a3ce12f2f84de84bb41af9aa17a3f" rel="noopener noreferrer"&gt;&lt;strong&gt;MicroVMs&lt;/strong&gt; (&lt;/a&gt;AWS-built VMM tech for &lt;a href="https://medium.com/@aakashc.dev/architecture-of-aws-lambda-017d5ff633a6?sk=b08a3ce12f2f84de84bb41af9aa17a3f" rel="noopener noreferrer"&gt;secure, li&lt;/a&gt;ghtweight VMs) [ p&lt;a href="https://medium.com/@aakashc.dev/architecture-of-aws-lambda-017d5ff633a6?sk=b08a3ce12f2f84de84bb41af9aa17a3f" rel="noopener noreferrer"&gt;lease drop&lt;/a&gt; in comment if you want a separate article about Firecracker MicroVM’s ]&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Think of it as “a mini VM spun up in milliseconds” and isolated securely&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://medium.com/@aakashc.dev/architecture-of-aws-lambda-017d5ff633a6?sk=b08a3ce12f2f84de84bb41af9aa17a3f" rel="noopener noreferrer"&gt;It runs&lt;/a&gt; &lt;strong&gt;in the region&lt;/strong&gt; where your Lambda is deployed&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Backed by physical &lt;a href="https://medium.com/@aakashc.dev/architecture-of-aws-lambda-017d5ff633a6?sk=b08a3ce12f2f84de84bb41af9aa17a3f" rel="noopener noreferrer"&gt;AWS EC2 i&lt;/a&gt;nfrastructure, but you don’t manage any of th&lt;a href="https://medium.com/@aakashc.dev/architecture-of-aws-lambda-017d5ff633a6?sk=b08a3ce12f2f84de84bb41af9aa17a3f" rel="noopener noreferrer"&gt;at&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  &lt;a href="https://medium.com/@aakashc.dev/architecture-of-aws-lambda-017d5ff633a6?sk=b08a3ce12f2f84de84bb41af9aa17a3f" rel="noopener noreferrer"&gt;From&lt;/a&gt; Hardware to Lambda
&lt;/h3&gt;

&lt;h3&gt;
  
  
  Step 1: Physical Hardware
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;It all starts with &lt;a href="https://medium.com/@aakashc.dev/architecture-of-aws-lambda-017d5ff633a6?sk=b08a3ce12f2f84de84bb41af9aa17a3f" rel="noopener noreferrer"&gt;physcial h&lt;/a&gt;ardware Machine &lt;a href="https://medium.com/@aakashc.dev/architecture-of-aws-lambda-017d5ff633a6?sk=b08a3ce12f2f84de84bb41af9aa17a3f" rel="noopener noreferrer"&gt;which are&lt;/a&gt; present at any dat&lt;a href="https://medium.com/@aakashc.dev/architecture-of-aws-lambda-017d5ff633a6?sk=b08a3ce12f2f84de84bb41af9aa17a3f" rel="noopener noreferrer"&gt;a centre.&lt;/a&gt; So, AWS has racks of physical servers — metal beasts.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Step 2: Firecracker
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Firecracker is AWS’s &lt;em&gt;lightweight hypervisor&lt;/em&gt; (open-&lt;a href="https://medium.com/@aakashc.dev/architecture-of-aws-lambda-017d5ff633a6?sk=b08a3ce12f2f84de84bb41af9aa17a3f" rel="noopener noreferrer"&gt;source, su&lt;/a&gt;per fast).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://medium.com/@aakashc.dev/architecture-of-aws-lambda-017d5ff633a6?sk=b08a3ce12f2f84de84bb41af9aa17a3f" rel="noopener noreferrer"&gt;It takes&lt;/a&gt; that big piece of metal and breaks it into &lt;strong&gt;microVMs&lt;/strong&gt; (micro Virtu&lt;a href="https://medium.com/@aakashc.dev/architecture-of-aws-lambda-017d5ff633a6?sk=b08a3ce12f2f84de84bb41af9aa17a3f" rel="noopener noreferrer"&gt;al Machine&lt;/a&gt;s), each &lt;strong&gt;isolated&lt;/strong&gt;, &lt;strong&gt;secure&lt;/strong&gt;, and &lt;strong&gt;fast-booting&lt;/strong&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;It’s not a full VM like EC2; it’s tiny, boots in ~125ms or less.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Step &lt;a href="https://medium.com/@aakashc.dev/architecture-of-aws-lambda-017d5ff633a6?sk=b08a3ce12f2f84de84bb41af9aa17a3f" rel="noopener noreferrer"&gt;3: Lambda&lt;/a&gt; Containers inside MicroVMs
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Inside each microVM, your &lt;strong&gt;La&lt;/strong&gt;&lt;a href="https://medium.com/@aakashc.dev/architecture-of-aws-lambda-017d5ff633a6?sk=b08a3ce12f2f84de84bb41af9aa17a3f" rel="noopener noreferrer"&gt;&lt;strong&gt;mbda code&lt;/strong&gt;&lt;/a&gt; &lt;strong&gt;runs in a container&lt;/strong&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Container d&lt;a href="https://medium.com/@aakashc.dev/architecture-of-aws-lambda-017d5ff633a6?sk=b08a3ce12f2f84de84bb41af9aa17a3f" rel="noopener noreferrer"&gt;oestn’t me&lt;/a&gt;an a docker container. Its more like a container run&lt;a href="https://medium.com/@aakashc.dev/architecture-of-aws-lambda-017d5ff633a6?sk=b08a3ce12f2f84de84bb41af9aa17a3f" rel="noopener noreferrer"&gt;time envir&lt;/a&gt;onment with minimal OS.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Does Lambda Reuse Containers?
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Yes!&lt;/strong&gt; This might be possible.&lt;/p&gt;

&lt;p&gt;AWS uses a c&lt;a href="https://medium.com/@aakashc.dev/architecture-of-aws-lambda-017d5ff633a6?sk=b08a3ce12f2f84de84bb41af9aa17a3f" rel="noopener noreferrer"&gt;oncept cal&lt;/a&gt;led &lt;strong&gt;“container reuse”&lt;/strong&gt; &lt;a href="https://medium.com/@aakashc.dev/architecture-of-aws-lambda-017d5ff633a6?sk=b08a3ce12f2f84de84bb41af9aa17a3f" rel="noopener noreferrer"&gt;or &lt;strong&gt;warm c&lt;/strong&gt;&lt;/a&gt;&lt;strong&gt;ontainers&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;If you &lt;a href="https://medium.com/@aakashc.dev/architecture-of-aws-lambda-017d5ff633a6?sk=b08a3ce12f2f84de84bb41af9aa17a3f" rel="noopener noreferrer"&gt;invoke a&lt;/a&gt; Lambda function and then another invocation comes shortly &lt;a href="https://medium.com/@aakashc.dev/architecture-of-aws-lambda-017d5ff633a6?sk=b08a3ce12f2f84de84bb41af9aa17a3f" rel="noopener noreferrer"&gt;after…the&lt;/a&gt;n, AWS &lt;strong&gt;may&lt;/strong&gt; route it to the &lt;strong&gt;same&lt;/strong&gt; container (inside the same microVM)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;But remember — it’s &lt;em&gt;possible&lt;/em&gt;, not guaranteed. It depends on factors like &lt;a href="https://medium.com/@aakashc.dev/architecture-of-aws-lambda-017d5ff633a6?sk=b08a3ce12f2f84de84bb41af9aa17a3f" rel="noopener noreferrer"&gt;traffic pa&lt;/a&gt;ttern, memory size, and whether AWS decides to keep that container warm.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>aws</category>
      <category>lambda</category>
      <category>serverless</category>
    </item>
    <item>
      <title>The Classic Way to Access EC2 in Private Subnets (That Still Works Today)</title>
      <dc:creator>Aakash Choudhary</dc:creator>
      <pubDate>Wed, 16 Jul 2025 10:50:40 +0000</pubDate>
      <link>https://dev.to/aakashio/the-classic-way-to-access-ec2-in-private-subnets-that-still-works-today-h43</link>
      <guid>https://dev.to/aakashio/the-classic-way-to-access-ec2-in-private-subnets-that-still-works-today-h43</guid>
      <description>&lt;p&gt;You know that moment when you're trying to SSH into an EC2 in a private subnet, and AWS just silently judges you because... there's no public IP?&lt;/p&gt;

&lt;p&gt;So what’s the fix? We sneak in through a side door( by setting up another &lt;em&gt;EC2 instance in a public subnet&lt;/em&gt; ). This one does have a public IP, and acts like your inside man.&lt;br&gt;
That’s the Bastion Host, the jump server of your VPC.&lt;/p&gt;

&lt;p&gt;But here’s the thing:&lt;br&gt;
Have you ever paused to wonder how this setup actually works? How one EC2 lets you magically hop into another( which even doen’t existed over the internet )?&lt;/p&gt;

&lt;p&gt;In this article, I’ll walk you through how Bastion Hosts work, the architecture, the why, and the “ohhh” moment.&lt;/p&gt;

&lt;p&gt;Let’s take a &lt;strong&gt;quick 3-minute&lt;/strong&gt; trip into the jumpy world of Bastion Hosts.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is Bastion Host?
&lt;/h2&gt;

&lt;p&gt;A bastion host, also known as jump server, is like a middleman between you and the private EC2 instance. A bastion host is indirectly a EC2 instance( server ) to which you can SSH , and this jump server is allowed to connect with the EC2 in private subnet.&lt;/p&gt;

&lt;p&gt;Summarizing, Bastion host is a server which acts as a link between the EC2 in private subnet and you.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why do we need Bastion Host?
&lt;/h2&gt;

&lt;p&gt;Lets say, I have an EC2 instance in public subnet. This have a public IP attached to it. To connect with this instance, i can easily SSH into the VM via its public IP. What if this EC2 is in private subnet and it don’t have any public IP associated to it.&lt;/p&gt;

&lt;p&gt;At this point, we have two solutions, to proceed with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;    Connect to EC2 in private subnet via Bastion Host&lt;/li&gt;
&lt;li&gt;    Connect to EC2 in private subnet via Session Manager( using VPC endpoint )&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Architecture of Bastion host
&lt;/h2&gt;

&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.amazonaws.com%2Fuploads%2Farticles%2Fgypdjxswimu0zymew2sz.png" 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.amazonaws.com%2Fuploads%2Farticles%2Fgypdjxswimu0zymew2sz.png" alt="How EC2 in private subnet access the internet?" width="800" height="698"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Lets break down the architecture of Bastion host. A Bastion host generally contains an EC2 instance in public subnet and one EC2 instance in private subnet. The goal is to connect with EC2 instance in private subnet.&lt;/p&gt;

&lt;p&gt;We SSH to EC2 in public subnet( via the public IP of the public EC2 instance ). This EC2 instance has allowed outbound to go inside the EC2 instance in private subnet( target instance ).&lt;/p&gt;

&lt;p&gt;We can either configure port-forwarding from the public EC2 instance to private EC2 instance, or we can just run the SSH command in public EC2 instance mentioning the SSH command with private IP address of the private EC2 instance.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;All the network inside the VPC is communicated between AWS services( like from subnet to NAT Gateway ) using the private IP address attached to the aws resources.&lt;/code&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Working model of Bastion host
&lt;/h2&gt;

&lt;p&gt;Lets have a scenario where i have a ec2 deployed in public subnet, and one ec2 in private subnet. I want to connect with EC2 in private subnet but there is no direct way to connect with it.&lt;/p&gt;

&lt;p&gt;We will be going through a classic two-tier network architecture in AWS, where the Bastion Host acts as a controlled gateway to access EC2 instances residing in a private subnet.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Below are the components involved in the working of Bastion host:&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  User (Admin/Developer)
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;    Initiates an SSH connection from a local machine.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Public Subnet&lt;/strong&gt;&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Contains an EC2 instance (the Bastion Host) with a public IP address.
Connected to the Internet Gateway, enabling SSH from the external world.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Private Subnet&lt;/strong&gt;&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Contains an EC2 instance with no public IP, isolated from direct internet access.
Cannot be accessed directly from the internet for security purposes.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Internet Gateway&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;    Attached to the VPC.&lt;/li&gt;
&lt;li&gt;    Allows the public subnet’s EC2 (Bastion Host) to receive SSH traffic from the internet.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;NAT Gateway (Optional)&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;    Present in the public subnet.&lt;/li&gt;
&lt;li&gt;    Allows outbound internet access for the private EC2 (to download packages, reach external services, etc.)&lt;/li&gt;
&lt;li&gt;    Route to NAT Gateway from private subnet is only required if outbound internet access is needed.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  How It All Connects
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;    The user SSHs into the Bastion Host in the public subnet.&lt;/li&gt;
&lt;li&gt;    From the Bastion Host, the user SSHs into the private EC2 instance.&lt;/li&gt;
&lt;li&gt;    The private EC2 instance can remain isolated from the internet unless it needs internet access via the NAT Gateway.&lt;/li&gt;
&lt;/ul&gt;

&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.amazonaws.com%2Fuploads%2Farticles%2F92sm6702zrg55yu7x1s2.png" 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.amazonaws.com%2Fuploads%2Farticles%2F92sm6702zrg55yu7x1s2.png" alt=" " width="800" height="512"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Security Group Rules for public and private EC2
&lt;/h2&gt;

&lt;p&gt;We need to have different configuration for the target server and the bastion host.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Security Group of Bastion Host:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;    Allows inbound SSH (port 22) only from trusted IPs (your local machine).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Security Group of Private EC2:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;    Allows inbound SSH only from the Bastion Host’s security group or private IP.&lt;/li&gt;
&lt;li&gt;    No Public IP for private EC2:&lt;/li&gt;
&lt;li&gt;    Ensures it cannot be reached directly from the internet.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Follow for More
&lt;/h2&gt;

&lt;p&gt;If this helped or sparked an idea, drop a comment, a clap, or reach out!&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;    &lt;a href="https://github.com/ifaakash/whats-my-ip-lambda" rel="noopener noreferrer"&gt;Github Repo&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;    &lt;a href="http://aakashc.work/" rel="noopener noreferrer"&gt;My Portfolio&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;    &lt;a href="https://www.linkedin.com/in/aakashch2/" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>aws</category>
      <category>networking</category>
    </item>
    <item>
      <title>How Does Networking Work in AWS?</title>
      <dc:creator>Aakash Choudhary</dc:creator>
      <pubDate>Sat, 05 Jul 2025 10:34:33 +0000</pubDate>
      <link>https://dev.to/aakashio/how-does-networking-work-in-aws-2870</link>
      <guid>https://dev.to/aakashio/how-does-networking-work-in-aws-2870</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.amazonaws.com%2Fuploads%2Farticles%2Fe5y4pexielth8fidf39h.png" 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.amazonaws.com%2Fuploads%2Farticles%2Fe5y4pexielth8fidf39h.png" alt="Flow of traffic request in VPC" width="800" height="307"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;There have been times when I tried downloading something inside my EC2 instance and kept hitting a “timeout”. No errors, just silence. I had no idea what was wrong. That’s when I realized, this wasn’t a software bug. It was a networking blind spot. I tried to debug this, and came across that many people stuck in this at some point.&lt;/p&gt;

&lt;p&gt;Thats why, i thought to breakdown the architecture behind the networking of AWS in VPC. What are public and private subnet? How can an application in private subnet is able to access the internet! How two different VPC communciate with each other?&lt;/p&gt;

&lt;p&gt;Stick with me for 4min to explore about this below.&lt;/p&gt;




&lt;h2&gt;
  
  
  What is VPC?
&lt;/h2&gt;

&lt;p&gt;A VPC (Virtual Private Cloud) is like your own private club on AWS. You host or deploy your applications here — and the best part? It’s isolated from everyone else’s setup!&lt;br&gt;
Let’s say I’m deploying a Node.js app in my VPC, and you my friend, are doing the same in your VPC. We can both run the same app, but with completely different network configurations, IP ranges, and access rules.&lt;/p&gt;
&lt;h2&gt;
  
  
  How Do You Connect to Resources in a VPC?
&lt;/h2&gt;

&lt;p&gt;Now wait!! If this is a “&lt;strong&gt;private&lt;/strong&gt;” cloud, then how do we actually access it?&lt;/p&gt;

&lt;p&gt;Great question. Like any private club, you need a valid identity to get in. Yes, we need to be validated to access this VPC resources. That’s where &lt;strong&gt;IAM (Identity and Access Management)&lt;/strong&gt; comes in.&lt;/p&gt;
&lt;h2&gt;
  
  
  Why IAM?
&lt;/h2&gt;

&lt;p&gt;Yes, why does IAM comes into networking part?&lt;/p&gt;

&lt;p&gt;Let’s break it down:&lt;/p&gt;

&lt;p&gt;I’m on my local laptop, trying to connect to an EC2 instance running in a VPC (say, Vx). AWS exposes &lt;strong&gt;public API endpoints&lt;/strong&gt; for most services, like EC2, RDS, SSM, etc.&lt;/p&gt;

&lt;p&gt;When I use the AWS CLI to interact with these services, I send a request to AWS’s public APIs. But AWS won’t just let anyone in.&lt;/p&gt;

&lt;p&gt;So, I authenticate using my &lt;strong&gt;IAM Access Key&lt;/strong&gt; and &lt;strong&gt;Secret Key&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;This verifies:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;    Who I am&lt;/li&gt;
&lt;li&gt;    What I can access&lt;/li&gt;
&lt;li&gt;    Which actions I’m allowed to &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;code&gt;Now we know the use of IAM. Its used to validate who can access what, and in what cloud( VPC, and even breaking down to who can perform what operation on what service)&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Okay, So We Know VPC and why IAM is used… But&lt;/strong&gt;&lt;/p&gt;

&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.amazonaws.com%2Fuploads%2Farticles%2Fc8d8abw4i7l0mr5rmrzf.png" 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.amazonaws.com%2Fuploads%2Farticles%2Fc8d8abw4i7l0mr5rmrzf.png" alt="Types of Subnet" width="800" height="313"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  What’s a Subnet?
&lt;/h2&gt;

&lt;p&gt;Now, there may be cases where i have a &lt;strong&gt;frontend application&lt;/strong&gt; on my &lt;strong&gt;private cloud&lt;/strong&gt;, which is static. I want to show it to the world!! right?&lt;/p&gt;

&lt;p&gt;What i need to do is to keep this in some place, where its accessible to world. For the world to access it, it need to have some &lt;strong&gt;internet connectivity&lt;/strong&gt;.&lt;/p&gt;
&lt;h2&gt;
  
  
  Internet Gateway
&lt;/h2&gt;

&lt;p&gt;IGW is a component which is used to &lt;strong&gt;connect to internet&lt;/strong&gt;( consider this as the internet provider for this cloud).&lt;/p&gt;

&lt;p&gt;Whoooo!! What &lt;strong&gt;if i have a database&lt;/strong&gt;, and i &lt;strong&gt;dont want to expose&lt;/strong&gt; it to the world?&lt;/p&gt;

&lt;p&gt;Yess, great question! So, now, to break this down, we have &lt;strong&gt;two types of Subnet&lt;/strong&gt;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt; Public Subnet&lt;/li&gt;
&lt;li&gt; Private Subnet&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  Public Subnet Example
&lt;/h2&gt;

&lt;p&gt;Let’s say I’ve got a frontend app that’s static (like a React site). I want the world to access it.&lt;/p&gt;

&lt;p&gt;To do that, I’ll place it in a &lt;strong&gt;public subnet&lt;/strong&gt;, a subnet that’s connected to an &lt;strong&gt;Internet Gateway&lt;/strong&gt; (IGW). Think of IGW as your WiFi provider, giving internet access to your subnet.&lt;/p&gt;

&lt;p&gt;If it’s connected to IGW via route tables, then that subnet can send/receive traffic from the internet.&lt;/p&gt;
&lt;h2&gt;
  
  
  Private Subnet Example
&lt;/h2&gt;

&lt;p&gt;Now, let’s say I have a database. I don’t want people from the &lt;em&gt;outside world to peek&lt;/em&gt; into it. So, I put it in a &lt;strong&gt;private subnet&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Private subnets have &lt;strong&gt;no direct route to an Internet Gateway&lt;/strong&gt;. So they’re hidden, kind of like the secret basement of your VPC club.&lt;/p&gt;

&lt;p&gt;But… &lt;strong&gt;sometimes, your DB or EC2 in a private subnet needs to initiate outbound connections&lt;/strong&gt; (say, to fetch updates or call an API).&lt;/p&gt;

&lt;p&gt;So what do they do?&lt;/p&gt;

&lt;p&gt;&lt;code&gt;They ask their friendly neighbor (a **_public subnet_**) for help, specifically via a **_NAT Gateway_**.&lt;/code&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  What is NAT Gateway?
&lt;/h2&gt;

&lt;p&gt;The NAT Gateway lives in a public subnet and &lt;strong&gt;helps private subnet&lt;/strong&gt; resources reach out to the &lt;strong&gt;&lt;em&gt;internet&lt;/em&gt;&lt;/strong&gt;, but only outbound.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;Think of it like a door that lets you exit, but no one from the internet can enter.&lt;/code&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Inbound vs Outbound
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;    &lt;strong&gt;Outbound&lt;/strong&gt;: You can call the internet (like fetching data from an API)&lt;/li&gt;
&lt;li&gt;    &lt;strong&gt;Inbound&lt;/strong&gt;: The internet can reach you (this is blocked for private subnets unless you do something special)&lt;/li&gt;
&lt;/ul&gt;

&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.amazonaws.com%2Fuploads%2Farticles%2F1h1sstli9gj5c6cbly5h.png" 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.amazonaws.com%2Fuploads%2Farticles%2F1h1sstli9gj5c6cbly5h.png" alt="Architecture of Networking" width="800" height="293"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Breaking Down Subnet Architecture
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;    A &lt;strong&gt;VPC&lt;/strong&gt; is assigned a CIDR block, like &lt;code&gt;172.31.0.0/16&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;    This CIDR block defines the total range of IPs you can use in that network&lt;/li&gt;
&lt;li&gt;    &lt;strong&gt;Subnets&lt;/strong&gt; are chunks of this CIDR block. Like slicing a pizza into small slices so that each friend gets one!&lt;/li&gt;
&lt;li&gt;    Resources like EC2 instances are deployed into subnets and assigned an IP.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  How Does a Subnet Know Where to Send Traffic?
&lt;/h2&gt;

&lt;p&gt;That’s where Route Tables come in.&lt;/p&gt;

&lt;p&gt;A Route Table defines rules like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;_Destination_→ 0.0.0.0/0

_Target_ → igw-044a2729e12072922 (this means: “send internet traffic to the Internet Gateway”)

_Destination_ → 172.31.0.0/16

_Target_ → local (this means: “for internal traffic within the VPC”)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Each subnet is associated with a route table. The routes tell the traffic, If you’re going to the internet, take this road/route.&lt;/p&gt;

&lt;h2&gt;
  
  
  So What Did We Just Cover?
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;    &lt;strong&gt;VPC&lt;/strong&gt;: Your private slice of the AWS cloud&lt;/li&gt;
&lt;li&gt;    &lt;strong&gt;Subnet&lt;/strong&gt;: Smaller rooms inside your VPC (public or private)&lt;/li&gt;
&lt;li&gt;    &lt;strong&gt;Internet Gateway&lt;/strong&gt;: The official internet provider for your VPC&lt;/li&gt;
&lt;li&gt;    &lt;strong&gt;NAT Gateway&lt;/strong&gt;: Middleman that helps private subnets talk to the internet&lt;/li&gt;
&lt;li&gt;    &lt;strong&gt;Route Tables&lt;/strong&gt;: Route for the traffic&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Follow for More
&lt;/h2&gt;

&lt;p&gt;If this helped or sparked an idea, drop a comment, a clap, or reach out!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/ifaakash" rel="noopener noreferrer"&gt;  Github Repo&lt;/a&gt;&lt;br&gt;
&lt;a href="https://www.aakashc.work/" rel="noopener noreferrer"&gt;    My Portfolio&lt;/a&gt;&lt;br&gt;
    &lt;a href="https://www.linkedin.com/in/aakashch2/" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Thank you for being a part of the community
&lt;/h2&gt;

&lt;p&gt;Before you go:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Be sure to clap and follow the writer ️👏️️
Follow us: X | LinkedIn | YouTube | Newsletter | Podcast | Twitch
Start your own free AI-powered blog on Differ 🚀
For more content, visit plainenglish.io + stackademic.com
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

</description>
      <category>aws</category>
      <category>networking</category>
      <category>vpc</category>
    </item>
    <item>
      <title>How to Build a Scalable Multi-Region Terraform Repo with Modules</title>
      <dc:creator>Aakash Choudhary</dc:creator>
      <pubDate>Thu, 26 Jun 2025 04:53:43 +0000</pubDate>
      <link>https://dev.to/aakashio/how-to-build-a-scalable-multi-region-terraform-repo-with-modules-48fd</link>
      <guid>https://dev.to/aakashio/how-to-build-a-scalable-multi-region-terraform-repo-with-modules-48fd</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.amazonaws.com%2Fuploads%2Farticles%2Fr9mbnapctaixzel5kz9d.png" 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.amazonaws.com%2Fuploads%2Farticles%2Fr9mbnapctaixzel5kz9d.png" alt="Flow of values from variables.tf from root main.tf to resouce block" width="800" height="527"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Have you ever faced a situation where you needed to deploy identical infrastructure resources across multiple regions in a cloud provider like AWS or Azure?&lt;/p&gt;

&lt;p&gt;The best solution to this is &lt;strong&gt;&lt;em&gt;multi-region&lt;/em&gt;&lt;/strong&gt; Terraform setups. In this blog, we'll walk through how to structure a Terraform repository to handle resources like S3 buckets, IAM roles, etc., across two or more regions, with reusability, scalability, and simplicity.&lt;/p&gt;

&lt;h2&gt;
  
  
  What we want?
&lt;/h2&gt;

&lt;p&gt;We'll create a Terraform repository template where:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Infrastructure can be replicated across multiple regions.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The module logic is centralized and reusable.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Region-specific customizations are managed cleanly.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We'll walk through an example of provisioning an S3 bucket in two AWS regions: &lt;code&gt;us-west-1&lt;/code&gt; and &lt;code&gt;us-west-2&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Folder Structure
&lt;/h2&gt;

&lt;p&gt;Here's the directory layout we'll be working with:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;├── terraform/
│   ├── backend/
│   │   ├── us-west-1/
│   │   │   └── backend.tfvars
│   │   └── us-west-2/
│   │       └── backend.tfvars
│   ├── modules/
│   │   └── s3/
│   │       ├── main.tf
│   │       ├── variables.tf
│   │       └── output.tf
│   └── regions/
│       ├── us-west-1/
│       │   ├── main.tf
│       │   ├── variables.tf
│       │   ├── provider.tf
│       │   └── output.tf
│       └── us-west-2/
│           ├── main.tf
│           ├── variables.tf
│           ├── provider.tf
│           └── output.tf
├── .gitignore
└── README.md
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  How to create re-usable terraform repository?
&lt;/h2&gt;

&lt;p&gt;Let’s say we need to create an S3 bucket. Instead of writing this code for each region, we’ll write it once in a reusable module.&lt;/p&gt;

&lt;p&gt;So in the &lt;code&gt;modules/s3/variables.tf&lt;/code&gt;, the resource looks like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;resource "aws_s3_bucket" "bucket" {
  bucket        = var.bucket_name
  tags          = var.tags
  force_destroy = true
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This module expects two input values, so we define them in &lt;code&gt;modules/s3/variables.tf&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;variable "bucket_name" {
  type        = string
  description = "Name for the S3 bucket"
}

variable "tags" {
  type        = map(string)
  description = "Tags for the resources to track cost for resources deployed"
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;em&gt;Conclusion: This module doesn’t contain any hardcoded values, which makes it reusable.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Using the Module per Region
&lt;/h2&gt;

&lt;p&gt;Now, let’s use this module for each region without making changes to the module itself.&lt;/p&gt;

&lt;p&gt;In &lt;code&gt;regions/us-west-1/main.tf&lt;/code&gt;, we use the module like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;module "s3" {
  source      = "../../modules/s3"
  bucket_name = var.bucket_name
  tags        = var.tags
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Where do bucket_name and tags come from?
&lt;/h2&gt;

&lt;p&gt;This module expects two input values, so we define them in modules/s3/variables.tf:&lt;/p&gt;

&lt;p&gt;We define them in that region’s variables.tf:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;variable "root_var_bucket_name" {
  type        = string
  description = "Name for the S3 bucket"
}

variable "root_var_tags" {
  type        = map(string)
  description = "Tags for the resources to track cost for resources deployed"
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can define the actual values in your automation pipeline or in a .tfvars file.&lt;/p&gt;

&lt;p&gt;For backend setup, the file backend/us-west-1/backend.tfvars could look like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;bucket         = "my-terraform-state"
key            = "us-west-1/terraform.tfstate"
region         = "us-west-1"
dynamodb_table = "terraform-lock-table"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  What to do if i need to make any configuration change, but to any particular region?
&lt;/h2&gt;

&lt;p&gt;Now imagine that you need to change the S3 bucket name — but only for us-west-1.&lt;/p&gt;

&lt;p&gt;You don't need to touch the module or duplicate the code. Just go to:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;terraform/regions/us-west-1/variables.tf&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;And update the value for bucket_name. When you run Terraform for that specific region, the module will automatically pick up the new value.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;cd terraform/regions/us-west-1
terraform init -backend-config=../../backend/us-west-1/backend.tfvars
terraform plan -var="bucket_name=my-west-bucket" -var="tags={Environment=\"dev\"}"
terraform apply
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It doesn’t affect the setup in us-west-2 at all&lt;/p&gt;

&lt;h2&gt;
  
  
  Best Practices
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Avoid hardcoding values inside modules — always pass variables.&lt;/li&gt;
&lt;li&gt;Separate state per region to avoid conflicts.&lt;/li&gt;
&lt;li&gt;Use identical variable names across regions to standardize configuration.&lt;/li&gt;
&lt;li&gt;Centralize shared logic but isolate region-specific values.&lt;/li&gt;
&lt;li&gt;Add CI/CD automation for managing multiple environments smoothly.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Summary
&lt;/h2&gt;

&lt;p&gt;This structure makes it easy to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Replicate infrastructure across regions&lt;/li&gt;
&lt;li&gt;Reuse modules without code duplication&lt;/li&gt;
&lt;li&gt;Make changes to individual regions independently&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The same approach works not only for S3 buckets, but also &lt;strong&gt;IAM&lt;/strong&gt; roles, &lt;strong&gt;DynamoDB&lt;/strong&gt;, &lt;strong&gt;VPCs&lt;/strong&gt;, and even across clouds like &lt;strong&gt;Azure&lt;/strong&gt; or &lt;strong&gt;GCP&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Need more examples or want the full working repo on GitHub? Let me know in the comments! &lt;/p&gt;

</description>
      <category>terraform</category>
      <category>aws</category>
      <category>devops</category>
      <category>azure</category>
    </item>
    <item>
      <title>What’s My IP — Build a Serverless API Using Lambda + API Gateway (with Terraform)</title>
      <dc:creator>Aakash Choudhary</dc:creator>
      <pubDate>Wed, 25 Jun 2025 10:49:00 +0000</pubDate>
      <link>https://dev.to/aakashio/whats-my-ip-build-a-serverless-api-using-lambda-api-gateway-with-terraform-51bg</link>
      <guid>https://dev.to/aakashio/whats-my-ip-build-a-serverless-api-using-lambda-api-gateway-with-terraform-51bg</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.amazonaws.com%2Fuploads%2Farticles%2Fjh1s9nw5kii8lnpiuyzu.png" 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.amazonaws.com%2Fuploads%2Farticles%2Fjh1s9nw5kii8lnpiuyzu.png" alt="Image description" width="720" height="444"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Want to integrate AWS Lambda to an API endpoint? This project will walk you through the exact steps needed to attach Lambda with API Gateway to returning the caller’s public IP using a simple Python Lambda.&lt;/p&gt;

&lt;h2&gt;
  
  
  What We’ll Build
&lt;/h2&gt;

&lt;p&gt;In this article, we have a lightweight Python function running inside AWS Lambda. The function gets triggered when a user hits an API Gateway (HTTP API) URL. Once called, it grabs the user’s public IP and current timestamp and sends that back in the response.&lt;/p&gt;

&lt;p&gt;Example of URL provided by API Gateway:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;curl https://&amp;lt;your-api&amp;gt;.execute-api.&amp;lt;region&amp;gt;.amazonaws.com/&amp;lt;stage&amp;gt;/&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Output on browser upon hitting URL:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{
  "timestamp": "2025-06-20T17:45:12.841111",
  "ip_address": "103.xx.x.xx"
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  What’s happening behind the scenes ( Overview of request)
&lt;/h2&gt;

&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.amazonaws.com%2Fuploads%2Farticles%2F8mxl885y1ttflrjtgrnr.png" 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.amazonaws.com%2Fuploads%2Farticles%2F8mxl885y1ttflrjtgrnr.png" alt="Image description" width="720" height="331"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;As a USER, you will be hitting a URL( that is provided by API Gateway ). Upon hitting the URL, the request will flow from API Gateway to AWS Lambda, which will invoke the python application.&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;You (the user) hit the URL provided by API Gateway.
API Gateway forwards the request to Lambda.
Lambda runs the Python code and sends back a response with your IP and the current timestamp.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;The python application will take “event” metadata from the API Gateway and use that to return the sourceIP. The timestamp is returned using the datetime() function.&lt;/p&gt;

&lt;h2&gt;
  
  
  Python Application
&lt;/h2&gt;

&lt;p&gt;Here’s the Python function we’re using&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
import json
import datetime

def lambda_handler(event, context):
    # Fetch the IP from the API Gateway event
    ip_address = event['requestContext']['http']['sourceIp']

    # Get the current timestamp
    timestamp = datetime.datetime.utcnow().isoformat()
    response = {
            'timestamp': timestamp,
            'ip_address': ip_address
        }
        return {
            'statusCode': 200,
            'headers': { 'Content-Type': 'application/json' },
            'body': json.dumps(response)
        }
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  “&lt;strong&gt;event&lt;/strong&gt;” Metadata from API Gateway
&lt;/h2&gt;

&lt;p&gt;I believe the only component worth exploring here is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ip_address = event['requestContext']['http']['sourceIp']
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;“&lt;strong&gt;event&lt;/strong&gt;” is returned by API Gateway and contain some metadata that can be consumed by Lambda. This include the sourceIP field as well, that we will be using to display output on hitting URL.&lt;/p&gt;

&lt;h2&gt;
  
  
  Metadata in the event context of API Gateway
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{
  "requestContext": {
    "accountId": "123456789012",
    "apiId": "a1b2c3d4",
    "http": {
      "method": "GET",
      "path": "/",
      "protocol": "HTTP/1.1",
      "sourceIp": "203.0.113.42",
      "userAgent": "curl/7.64.1"
    },
    "requestId": "abc123",
    "routeKey": "GET /",
    "stage": "$default",
    "time": "20/Jun/2025:10:45:00 +0000",
    "timeEpoch": 1718877900000
  }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Why we don’t need any layer for this Python Lambda?
&lt;/h2&gt;

&lt;p&gt;The packages that we are using ( json , datetime ), are part of Python’s standard library, and AWS Lambda already includes the entire standard library for whatever runtime we’re using (like python3.12, python3.11, etc.).&lt;/p&gt;

&lt;h2&gt;
  
  
  Tech Stack
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;    Python 3.12&lt;/li&gt;
&lt;li&gt;    AWS Lambda&lt;/li&gt;
&lt;li&gt;    API Gateway (HTTP API)&lt;/li&gt;
&lt;li&gt;    Terraform&lt;/li&gt;
&lt;li&gt;    CloudWatch (for logging/debugging)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Project Structure
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;.&lt;br&gt;
├── terraform/&lt;br&gt;
│   ├── modules/&lt;br&gt;
│   │   ├── iam/&lt;br&gt;
│   │   │   ├── main.tf&lt;br&gt;
│   │   │   └── outputs.tf&lt;br&gt;
│   │   ├── lambda/&lt;br&gt;
│   │   │   ├── main.tf&lt;br&gt;
│   │   │   ├── variables.tf&lt;br&gt;
│   │   │   └── outputs.tf&lt;br&gt;
│   │   └── apigw/&lt;br&gt;
│   │       ├── main.tf&lt;br&gt;
│   │       ├── variables.tf&lt;br&gt;
│   │       └── outputs.tf&lt;br&gt;
│   ├── main.tf&lt;br&gt;
│   ├── outputs.tf&lt;br&gt;
│   └── provider.tf&lt;br&gt;
├── app.py&lt;br&gt;
├── .gitignore&lt;br&gt;
└── README.md&lt;/strong&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  CODE REPOSITORY ( follow the URL for Github Repository)
&lt;/h2&gt;

&lt;p&gt;Follow the below github repository for the terraform code&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/ifaakash/whats-my-ip-lambda" rel="noopener noreferrer"&gt;https://github.com/ifaakash/whats-my-ip-lambda&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Terraform Code Highlight
&lt;/h2&gt;

&lt;p&gt;From terraform POV, we will need to create the components listed below:&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;`aws_lambda_function` → Lambda function configuration
`aws_apigatewayv2_api` → API for the end user
`aws_lambda_permission` → Ensure API GW have permission to invoke Lambda
`aws_apigatewayv2_integration` → Attach API GW with Lambda function
`aws_api_gatewayv2_route` → Define route for API GW to invoke Lambda
`aws_api_gatewayv2_stage` → Used to handle API GW in multi env( dev, stg, prod )
`aws_iam_role` and policy for Lambda execution
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;h2&gt;
  
  
  Why create the IAM Role?
&lt;/h2&gt;

&lt;p&gt;Without IAM role, the lambda function will not be able to perform operation like writing logs to cloudwatch, read from S3 bucket etc. So, we need IAM role to allot permission to AWS Lambda.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# IAM Role for AWS Lambda to assume
resource "aws_iam_role" "lambda_exec_role" {
  name = "lambda_exec_role"
  assume_role_policy = jsonencode({
    Version = "2012-10-17",
    Statement = [{
      Action = "sts:AssumeRole",
      Effect = "Allow",
      Principal = {
        Service = "lambda.amazonaws.com"
      }
    }]
  })
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
# Required permission for AWS lambda to perform action on other resources
resource "aws_iam_policy" "permissions" {
  name        = "lambda_permissions"
  description = "Required IAM permission for AWS Lambda Execution"
  policy = jsonencode(
    {
      "Version" : "2012-10-17",
      "Statement" : [
        {
          "Effect" : "Allow",
          "Action" : [
            "logs:CreateLogGroup",
            "logs:CreateLogStream",
            "logs:PutLogEvents"
          ],
          "Resource" : "*"
        }
      ]
    }
  )
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;resource "aws_iam_role_policy_attachment" "lambda_policy_attachment" {
  role       = aws_iam_role.lambda_exec_role.name
  policy_arn = aws_iam_policy.permissions.arn
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Permission for AWS Lambda
&lt;/h2&gt;

&lt;p&gt;This will allow the API Gateway to invoke the lambda function, when the user hit the API URL.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;resource "aws_lambda_permission" "allow_apigw" {
  statement_id  = "AllowAPIGatewayInvoke"
  action        = "lambda:InvokeFunction"
  principal     = "apigateway.amazonaws.com"
  function_name = var.lambda_name
}

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Lambda function Configuration
&lt;/h2&gt;

&lt;p&gt;This block defines the python application that need to be used by AWS Lambda and the HASH code for the application to detect changes to the ZIP file.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;resource "aws_lambda_function" "lambda" {
  function_name    = var.function_name
  role             = var.lambda_exec_role_arn
  description      = var.description
  filename         = var.filename # &amp;lt;zip_file_name&amp;gt;
  runtime          = var.runtime_env
  package_type     = var.package_type
  handler          = var.handler # &amp;lt;python_file_name.lambda_function_name&amp;gt;
  source_code_hash = filebase64sha256(var.filename)
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Deploying It
&lt;/h2&gt;

&lt;p&gt;→ Initialize using terraform init&lt;/p&gt;

&lt;p&gt;→ Plan the changes using terraform plan&lt;/p&gt;

&lt;p&gt;→ Apply the changes using terraform apply&lt;/p&gt;

&lt;p&gt;→ Grab the endpoint from API Gateway&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;output "api_url" {
  value = "${aws_apigatewayv2_api.http_api.api_endpoint}/${aws_apigatewayv2_stage.dev.name}/"
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Test the API
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;curl https://&amp;lt;api-id&amp;gt;.execute-api.us-west-1.amazonaws.com/dev/&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Make sure the route is GET /, not /dev or /ping unless explicitly defined.&lt;/p&gt;

&lt;h2&gt;
  
  
  Cleaning Up
&lt;/h2&gt;

&lt;p&gt;To destroy all resources&lt;/p&gt;

&lt;p&gt;&lt;code&gt;terraform destroy&lt;/code&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Follow for More
&lt;/h2&gt;

&lt;p&gt;If this helped or sparked an idea, drop a comment, a clap, or reach out!&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[Github Repo](https://github.com/ifaakash)
[My Portfolio](https://hey-its-aakash.lovable.app/)
[LinkedIn](https://www.linkedin.com/in/aakashch2/)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

</description>
      <category>terraform</category>
      <category>serverless</category>
      <category>aws</category>
      <category>devops</category>
    </item>
    <item>
      <title>Manually created cloud Infrastructure?</title>
      <dc:creator>Aakash Choudhary</dc:creator>
      <pubDate>Fri, 13 Jun 2025 19:28:42 +0000</pubDate>
      <link>https://dev.to/aakashio/manually-created-cloud-infrastructure-2o03</link>
      <guid>https://dev.to/aakashio/manually-created-cloud-infrastructure-2o03</guid>
      <description>&lt;p&gt;I recently faced this scenario where there were a bunch of cloud resources built manually, with no version control or automation in place. Rebuilding everything from scratch wasn't an option. So, I used the feature of terraform import&lt;/p&gt;

&lt;p&gt;Below is a medium article which I thought of sharing with the community, which focuses on:&lt;/p&gt;

&lt;p&gt;--&amp;gt; When to use terraform import&lt;/p&gt;

&lt;p&gt;--&amp;gt; A step-by-step walkthrough&lt;/p&gt;

&lt;p&gt;--&amp;gt; How to regain control over wild infra&lt;/p&gt;

&lt;p&gt;Check it out here &lt;/p&gt;

&lt;p&gt;&lt;a href="https://medium.com/@aakashc.dev/how-to-import-an-existing-cloud-infra-using-terraform-ff52a785a8f7" rel="noopener noreferrer"&gt;https://medium.com/@aakashc.dev/how-to-import-an-existing-cloud-infra-using-terraform-ff52a785a8f7&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Please share your thought on this.&lt;/p&gt;

</description>
      <category>terraform</category>
      <category>infrastructureascode</category>
      <category>cloudskills</category>
    </item>
  </channel>
</rss>
