<?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: saheed</title>
    <description>The latest articles on DEV Community by saheed (@saheed_ea3f3e90be19db2eac).</description>
    <link>https://dev.to/saheed_ea3f3e90be19db2eac</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%2F3564446%2F428535b3-dd9e-4b74-9635-1086a8b0f210.png</url>
      <title>DEV Community: saheed</title>
      <link>https://dev.to/saheed_ea3f3e90be19db2eac</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/saheed_ea3f3e90be19db2eac"/>
    <language>en</language>
    <item>
      <title> Deploying Your First Server with Terraform: A Beginner's Guide</title>
      <dc:creator>saheed</dc:creator>
      <pubDate>Tue, 17 Mar 2026 20:37:32 +0000</pubDate>
      <link>https://dev.to/saheed_ea3f3e90be19db2eac/deploying-your-first-server-with-terraform-a-beginners-guide-3kn6</link>
      <guid>https://dev.to/saheed_ea3f3e90be19db2eac/deploying-your-first-server-with-terraform-a-beginners-guide-3kn6</guid>
      <description>&lt;p&gt;&lt;strong&gt;INTRODUCTION&lt;/strong&gt;&lt;br&gt;
Welcome to Day 3 of my 30-Day Terraform Challenge! In the "ancient" days of software, deploying a server was a manual, fragile process involving physical hardware and manual commands Today, we use Infrastructure as Code (IaC) to automate this entire process using a simple, declarative language if you are just starting out, this guide walks you through the exact steps I took to launch my first virtual server on AWS.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Compute Resource: aws_instance&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;In the Terraform world, a virtual server is defined using the aws_instance resource. To get my server running, I had to provide two critical arguments:&lt;/p&gt;

&lt;p&gt;AMI (Amazon Machine Image): This is the OS snapshot for the server. I used an Ubuntu 20.04 image&lt;/p&gt;

&lt;p&gt;Instance Type: I chose t2.micro, which is perfect for learning because it falls under the AWS Free Tier&lt;/p&gt;

&lt;p&gt;One important lesson I learned is that AMI IDs are region-specific&lt;br&gt;
If I move my deployment from us-east-2 to us-west-2, I have to update that ID, or the deployment will fail&lt;/p&gt;

&lt;p&gt;The first step in any Terraform project is to define your Provider, which tells Terraform which cloud platform you are using For this challenge, I am using AWS&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight terraform"&gt;&lt;code&gt;&lt;span class="k"&gt;provider&lt;/span&gt; 
&lt;span class="s2"&gt;"aws"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;region&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"us-east-2"&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Note: I chose us-east-2 (Ohio), but remember that resources like AMI IDs are region-specific&lt;/p&gt;

&lt;p&gt;By default, AWS is a "walled garden" that denies all incoming traffic&lt;br&gt;
To see our web server in action, we must create an aws_security_group to open specific ports&lt;/p&gt;

&lt;p&gt;Port 80 (HTTP): To allow users to view our website&lt;/p&gt;

&lt;p&gt;Port 22 (SSH): To allow us to securely log into the server for maintenance&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Terraform Lifecycle in Action&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;With the code ready, I followed the standard Terraform workflow to bring the server to life&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;terraform init&lt;/strong&gt;: This prepares the directory and downloads the AWS provider plugin&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;terraform plan&lt;/strong&gt;: A "sanity check" dry run. My plan showed 2 resources to add (the instance and the security group)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;terraform apply&lt;/strong&gt;: This executes the changes. After typing yes, Terraform provisioned the server in about 40 seconds&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;terraform destroy&lt;/strong&gt;: Once I was done testing, I ran this to cleanly remove all resources and avoid unnecessary AWS costs&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;CONCLUSION&lt;/strong&gt;&lt;br&gt;
The most important lesson today was understanding Terraform's declarative nature I don't tell AWS how to build a server; I just describe what I want the server to look like Terraform builds a dependency graph and handles the heavy lifting of figuring out the most efficient way to make it happen I am thrilled to continue this journey alongside the AWS AI/ML UserGroup Kenya, Meru HashiCorp User Group, and EveOps communities.&lt;/p&gt;

</description>
      <category>aws</category>
      <category>beginners</category>
      <category>terraform</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Step-by-Step Guide to Setting Up Terraform, AWS CLI, and Your AWS Environment</title>
      <dc:creator>saheed</dc:creator>
      <pubDate>Tue, 17 Mar 2026 07:35:49 +0000</pubDate>
      <link>https://dev.to/saheed_ea3f3e90be19db2eac/step-by-step-guide-to-setting-up-terraform-aws-cli-and-your-aws-environment-5dj</link>
      <guid>https://dev.to/saheed_ea3f3e90be19db2eac/step-by-step-guide-to-setting-up-terraform-aws-cli-and-your-aws-environment-5dj</guid>
      <description>&lt;h2&gt;
  
  
  &lt;strong&gt;INTRODUCTION&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Building a production-grade infrastructure starts with a rock-solid environment. Below is the exact walkthrough of how I configured my system, the commands I used, and the logic behind my decisions.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Preparing the AWS "House"&lt;/strong&gt;&lt;br&gt;
The first step is ensuring Terraform has the right permissions to act on your behalf. As noted in the sources, you should never use your root account for daily operations.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;IAM User Creation&lt;/strong&gt;: I navigated to the IAM Console and created a new user with Programmatic Access.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Permissions&lt;/strong&gt;: I attached the AdministratorAccess Managed Policy&lt;br&gt;
While broad, this is recommended for learning environments to ensure Terraform isn't blocked when trying to create complex networking resources like VPCs or NAT Gateways.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Security&lt;/strong&gt;: I immediately saved my Access Key ID and Secret Access Key Once you leave that screen, AWS will never show the secret key again.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Installing the Tooling&lt;/strong&gt;&lt;br&gt;
 &lt;strong&gt;Terraform Installation&lt;/strong&gt;: Since I am working on a MacBook Air (Darwin arm64), I used Homebrew to install Terraform&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;brew tap hashicorp/tap
brew &lt;span class="nb"&gt;install &lt;/span&gt;hashicorp/tap/terraform
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Verification&lt;/strong&gt;: I ran a quick check to ensure everything was installed correctly.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;My Version: Terraform v1.14.7&lt;br&gt;
Provider: AWS Provider v6.36.0&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Configuring the Environment&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Terraform needs to know who is running the commands. I configured my credentials as environment variables to keep them out of my source code.&lt;br&gt;
Decision: I chose to deploy in the &lt;strong&gt;&lt;code&gt;us-east-1&lt;/code&gt;&lt;/strong&gt; region This is a standard choice as it is often the first to receive new AWS features&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Executing the Terraform Lifecycle&lt;/strong&gt;&lt;br&gt;
With the environment ready, I implemented a foundational networking stack (VPC, subnets, and gateways). I followed the core workflow commands defined in the sources. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step A: terraform init&lt;/strong&gt; This initialized the backend and downloaded the AWS Provider v6.36.0 this step is idempotent, meaning I can run it safely multiple times if I add new providers later&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step B: terraform plan&lt;/strong&gt; This is the "sanity check" My plan (seen in the screenshots) confirmed exactly what would happen: 18 resources to add, 0 to change, 0 to destroy. It detailed the creation of a VPC with a CIDR block of 10.0.0.0/16 and tags like demo_vpc&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step C: terraform apply&lt;/strong&gt; This command executed the plan&lt;/p&gt;

&lt;p&gt;Result: The terminal confirmed: "Apply complete! Resources: 18 added"&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step D: terraform destroy&lt;/strong&gt; To avoid unnecessary costs from resources like the NAT Gateway and Elastic IP, I immediately tested the cleanup process. Terraform correctly identified all 18 resources and tore them down in the reverse order of their dependencies.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;CONCLUSION&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Terraform is incredibly efficient. It doesn't just build one thing at a time; it maps dependencies and builds everything it can simultaneously.&lt;/p&gt;

</description>
      <category>aws</category>
      <category>devops</category>
      <category>terraform</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>What is Infrastructure as Code and Why It's Transforming DevOps</title>
      <dc:creator>saheed</dc:creator>
      <pubDate>Mon, 16 Mar 2026 21:01:03 +0000</pubDate>
      <link>https://dev.to/saheed_ea3f3e90be19db2eac/what-is-infrastructure-as-code-and-why-its-transforming-devops-3hea</link>
      <guid>https://dev.to/saheed_ea3f3e90be19db2eac/what-is-infrastructure-as-code-and-why-its-transforming-devops-3hea</guid>
      <description>&lt;p&gt;&lt;strong&gt;INTRODUCTION&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A long time ago, in a datacenter far, far away, an ancient group of beings known as “sysadmins” used to deploy infrastructure manually Every server, database, and network cable was managed by hand, a dark age of fear characterized by downtime, accidental misconfiguration, and slow, fragile deployments.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What is IaC and the Problem It Solves?&lt;/strong&gt;&lt;br&gt;
The core idea behind IaC is that you treat all aspects of operations as software Instead of clicking around a web console, you write and execute code to define, deploy, update, and destroy your infrastructure. &lt;/p&gt;

&lt;p&gt;This solves several critical problems that plagued traditional manual provisioning:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Configuration Drift&lt;/strong&gt;: Manual releases often lead to "snowflake servers," where every machine has a subtly different configuration from all the others, making bugs nearly impossible to reproduce&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Bus Factor&lt;/strong&gt;: If your infrastructure exists only in one person's head, your business is at risk if they leave or go on vacation IaC acts as living documentation that anyone can read&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Manual Error&lt;/strong&gt;: Humans are prone to mistakes during repetitive tasks. IaC enables automation, making deployments significantly faster, safer, and more consistent&lt;/p&gt;

&lt;p&gt;By defining infrastructure as code, we gain the ability to use software engineering best practices like version control, code reviews, and automated testing on our hardware setup.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Declarative vs. Imperative: The Shift in Thinking&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;One of the most important concepts to grasp is the difference between these two approaches:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Imperative (Procedural)&lt;/strong&gt;: Tools like Ansible or Chef encourage a style where you specify the step-by-step commands to achieve a state&lt;br&gt;
The problem is that if you tell a procedural script to "add 5 servers" and run it twice, you might end up with 10 total servers when you only wanted 5, because the code doesn't fully capture the current state of the world&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Declarative&lt;/strong&gt;: Tools like Terraform focus on the desired end state&lt;br&gt;
You simply declare, "I want 5 servers." Terraform handles the heavy lifting of figuring out what is currently deployed and makes the necessary API calls to match your request&lt;br&gt;
If you update your code to 10 servers, Terraform realizes 5 already exist and only provisions the 5 new ones&lt;/p&gt;

&lt;p&gt;This declarative nature ensures your code is always a 1:1 representation of reality, making it much easier to reason about and maintain over time.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why Terraform is Worth Learning&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Among the many IaC tools available, Terraform has emerged as a leader for several reasons:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Cloud Agnostic:&lt;/strong&gt; It works with all popular cloud providers (AWS, Azure, GCP) and even platforms like Kubernetes, allowing you to manage your entire stack with a single language. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Simple Language&lt;/strong&gt;: It uses HashiCorp Configuration Language (HCL), which is designed to be human-readable and much easier to learn than general-purpose programming languages like Java or Python.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Masterless and Agentless&lt;/strong&gt;: You don't need to manage extra infrastructure or install software on your servers for Terraform to work; it communicates directly with cloud APIs via a single binary on your computer. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Explosive Community Growth&lt;/strong&gt;: Terraform's community is massive and active, meaning there are thousands of reusable modules and plugins available to help you get started quickly.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Conclusion&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Software isn't "done" when the code works on your laptop; it’s only done when it is delivered to the user. By adopting Terraform and IaC, you move away from the "fear and uncertainty" of manual configurations toward a world where infrastructure is stable, documented, and automated If you're ready to stop "shaving yaks" and start building production-grade systems, Terraform is the best place to start.&lt;/p&gt;

</description>
      <category>architecture</category>
      <category>automation</category>
      <category>cloud</category>
      <category>devops</category>
    </item>
    <item>
      <title>Stop risking security with long-lived keys. Upgrade your CLI, adopt aws login, and enjoy a cleaner, safer, and more efficient workflow the way AWS intended in 2025.</title>
      <dc:creator>saheed</dc:creator>
      <pubDate>Sun, 30 Nov 2025 16:05:19 +0000</pubDate>
      <link>https://dev.to/saheed_ea3f3e90be19db2eac/stop-risking-security-with-long-lived-keys-upgrade-your-cli-adopt-aws-login-and-enjoy-a-cleaner-5eb9</link>
      <guid>https://dev.to/saheed_ea3f3e90be19db2eac/stop-risking-security-with-long-lived-keys-upgrade-your-cli-adopt-aws-login-and-enjoy-a-cleaner-5eb9</guid>
      <description>&lt;p&gt;

&lt;/p&gt;
&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/saheed_ea3f3e90be19db2eac/aws-just-changed-how-we-log-in-to-the-cli-and-many-engineers-might-not-know-this-yet-4h5f" class="crayons-story__hidden-navigation-link"&gt;AWS just changed how we log in to the CLI — By Saheed Ipaye&lt;/a&gt;


  &lt;div class="crayons-story__body crayons-story__body-full_post"&gt;
    &lt;div class="crayons-story__top"&gt;
      &lt;div class="crayons-story__meta"&gt;
        &lt;div class="crayons-story__author-pic"&gt;

          &lt;a href="/saheed_ea3f3e90be19db2eac" class="crayons-avatar  crayons-avatar--l  "&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%2F3564446%2F428535b3-dd9e-4b74-9635-1086a8b0f210.png" alt="saheed_ea3f3e90be19db2eac profile" class="crayons-avatar__image"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/saheed_ea3f3e90be19db2eac" class="crayons-story__secondary fw-medium m:hidden"&gt;
              saheed
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                saheed
                
              
              &lt;div id="story-author-preview-content-3073781" class="profile-preview-card__content crayons-dropdown branded-7 p-4 pt-0"&gt;
                &lt;div class="gap-4 grid"&gt;
                  &lt;div class="-mt-4"&gt;
                    &lt;a href="/saheed_ea3f3e90be19db2eac" class="flex"&gt;
                      &lt;span class="crayons-avatar crayons-avatar--xl mr-2 shrink-0"&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%2F3564446%2F428535b3-dd9e-4b74-9635-1086a8b0f210.png" class="crayons-avatar__image" alt=""&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;saheed&lt;/span&gt;
                    &lt;/a&gt;
                  &lt;/div&gt;
                  &lt;div class="print-hidden"&gt;
                    
                      Follow
                    
                  &lt;/div&gt;
                  &lt;div class="author-preview-metadata-container"&gt;&lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
            &lt;/div&gt;

          &lt;/div&gt;
          &lt;a href="https://dev.to/saheed_ea3f3e90be19db2eac/aws-just-changed-how-we-log-in-to-the-cli-and-many-engineers-might-not-know-this-yet-4h5f" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;Nov 30 '25&lt;/time&gt;&lt;span class="time-ago-indicator-initial-placeholder"&gt;&lt;/span&gt;&lt;/a&gt;
        &lt;/div&gt;
      &lt;/div&gt;

    &lt;/div&gt;

    &lt;div class="crayons-story__indention"&gt;
      &lt;h2 class="crayons-story__title crayons-story__title-full_post"&gt;
        &lt;a href="https://dev.to/saheed_ea3f3e90be19db2eac/aws-just-changed-how-we-log-in-to-the-cli-and-many-engineers-might-not-know-this-yet-4h5f" id="article-link-3073781"&gt;
          AWS just changed how we log in to the CLI — By Saheed Ipaye
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
        &lt;/div&gt;
      &lt;div class="crayons-story__bottom"&gt;
        &lt;div class="crayons-story__details"&gt;
          &lt;a href="https://dev.to/saheed_ea3f3e90be19db2eac/aws-just-changed-how-we-log-in-to-the-cli-and-many-engineers-might-not-know-this-yet-4h5f" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left"&gt;
            &lt;div class="multiple_reactions_aggregate"&gt;
              &lt;span class="multiple_reactions_icons_container"&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/sparkle-heart-5f9bee3767e18deb1bb725290cb151c25234768a0e9a2bd39370c382d02920cf.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
              &lt;/span&gt;
              &lt;span class="aggregate_reactions_counter"&gt;1&lt;span class="hidden s:inline"&gt; reaction&lt;/span&gt;&lt;/span&gt;
            &lt;/div&gt;
          &lt;/a&gt;
            &lt;a href="https://dev.to/saheed_ea3f3e90be19db2eac/aws-just-changed-how-we-log-in-to-the-cli-and-many-engineers-might-not-know-this-yet-4h5f#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              Comments


              &lt;span class="hidden s:inline"&gt;Add Comment&lt;/span&gt;
            &lt;/a&gt;
        &lt;/div&gt;
        &lt;div class="crayons-story__save"&gt;
          &lt;small class="crayons-story__tertiary fs-xs mr-2"&gt;
            2 min read
          &lt;/small&gt;
            
              &lt;span class="bm-initial"&gt;
                

              &lt;/span&gt;
              &lt;span class="bm-success"&gt;
                

              &lt;/span&gt;
            
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;




</description>
      <category>cli</category>
      <category>security</category>
      <category>aws</category>
      <category>productivity</category>
    </item>
    <item>
      <title>AWS just changed how we log in to the CLI — By Saheed Ipaye</title>
      <dc:creator>saheed</dc:creator>
      <pubDate>Sun, 30 Nov 2025 16:00:23 +0000</pubDate>
      <link>https://dev.to/saheed_ea3f3e90be19db2eac/aws-just-changed-how-we-log-in-to-the-cli-and-many-engineers-might-not-know-this-yet-4h5f</link>
      <guid>https://dev.to/saheed_ea3f3e90be19db2eac/aws-just-changed-how-we-log-in-to-the-cli-and-many-engineers-might-not-know-this-yet-4h5f</guid>
      <description>&lt;p&gt;I just migrated away from long-term AWS access keys. Took me just 5 minutes. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Old Way&lt;/strong&gt;&lt;br&gt;
For years, we've all been doing the same thing: generating IAM access keys, storing them in ~/.aws/credentials, and hoping nobody finds them. Every security audit flagged them. Every developer onboarding session involved that awkward "here's how to store secrets safely" talk.&lt;/p&gt;

&lt;p&gt;Then AWS quietly released something that changes everything: aws login&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;My Migration Story&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 1&lt;/strong&gt;: Update AWS CLI&lt;br&gt;
First, I checked my CLI version. Anything below v2.22 won't work:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;aws --version
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Step 2&lt;/strong&gt;: Delete Those Permanent Keys&lt;br&gt;
Then came the scary part deleting my credentials file. I opened&lt;/p&gt;

&lt;p&gt;&lt;code&gt;~/.aws/credentials&lt;/code&gt;, saw the familiar &lt;code&gt;aws_access_key_id&lt;/code&gt; and &lt;code&gt;aws_secret_access_key&lt;/code&gt; staring back at me, and just... deleted them:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;rm ~/.aws/credentials
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I kept my region and output format in the config you still need those.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 3&lt;/strong&gt;: The Magic Moment&lt;br&gt;
Now here's where it gets good. I typed:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;aws login
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;My browser opened automatically. I signed in with my regular AWS console credentials the same email and password I use every day. No copying and pasting 40-character strings. No "wait, which key was for which account?" Within seconds, I was authenticated:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
You are now logged in as arn:aws:iam::&amp;lt;account-id&amp;gt;:user/your-user
Credentials stored for profile 'default'

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

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Step 4:&lt;/strong&gt; Verify It Worked&lt;br&gt;
Ran a quick test:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;aws sts get-caller-identity
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It worked. No access keys in sight. Just clean, secure, temporary tokens doing their job.&lt;/p&gt;

&lt;p&gt;What Makes This Better?&lt;br&gt;
The credentials it generates are temporary:&lt;/p&gt;

&lt;p&gt;They expire in hours, not years, They auto-rotate every 15 minutes&lt;br&gt;
They live in a secure cache, not a plain text file waiting to be accidentally committed to GitHub&lt;/p&gt;

&lt;p&gt;You can check the expiration yourself&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;cat ~/.aws/cli/cache/*.json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You'll see something like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{
  "Credentials": {
    "AccessKeyId": "...",
    "SecretAccessKey": "...",
    "SessionToken": "...",
    "Expiration": "2025-01-01T12:34:56Z"
  }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;The Bottom Line&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The entire migration took me 5 minutes. five minutes to eliminate one of the biggest security headaches in cloud development. If you're still using long-term access keys in 2025, this is your sign:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Update your CLI to v2.22+&lt;/li&gt;
&lt;li&gt;Delete those credentials&lt;/li&gt;
&lt;li&gt;Run aws login&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Your security team will thank you. Your future self will thank you.&lt;br&gt;
And honestly? It just feels better knowing those permanent keys aren't sitting there anymore.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Instead of deploying one NAT Gateway per Availability Zone, you can now deploy one NAT Gateway at the VPC level.

Check this out to see how you can easily get it done.</title>
      <dc:creator>saheed</dc:creator>
      <pubDate>Fri, 21 Nov 2025 07:52:39 +0000</pubDate>
      <link>https://dev.to/saheed_ea3f3e90be19db2eac/instead-of-deploying-one-nat-gateway-per-availability-zone-you-can-now-deploy-one-nat-gateway-at-43kb</link>
      <guid>https://dev.to/saheed_ea3f3e90be19db2eac/instead-of-deploying-one-nat-gateway-per-availability-zone-you-can-now-deploy-one-nat-gateway-at-43kb</guid>
      <description>&lt;div class="ltag__link"&gt;
  &lt;a href="/saheed_ea3f3e90be19db2eac" 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%2F3564446%2F428535b3-dd9e-4b74-9635-1086a8b0f210.png" alt="saheed_ea3f3e90be19db2eac"&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="https://dev.to/saheed_ea3f3e90be19db2eac/aws-just-changed-nat-gateway-heres-what-you-need-to-know-j52" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;AWS Just Changed NAT Gateway — Here’s What You Need to Know&lt;/h2&gt;
      &lt;h3&gt;saheed ・ Nov 21&lt;/h3&gt;
      &lt;div class="ltag__link__taglist"&gt;
        &lt;span class="ltag__link__tag"&gt;#networking&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#news&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#architecture&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#aws&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;


</description>
    </item>
    <item>
      <title>AWS Just Changed NAT Gateway — Here’s What You Need to Know</title>
      <dc:creator>saheed</dc:creator>
      <pubDate>Fri, 21 Nov 2025 07:47:21 +0000</pubDate>
      <link>https://dev.to/saheed_ea3f3e90be19db2eac/aws-just-changed-nat-gateway-heres-what-you-need-to-know-j52</link>
      <guid>https://dev.to/saheed_ea3f3e90be19db2eac/aws-just-changed-nat-gateway-heres-what-you-need-to-know-j52</guid>
      <description>&lt;p&gt;If you’ve worked with AWS for even a short time, you've probably crossed paths with the NAT Gateway the service that lets your private subnets access the internet without exposing them publicly. It’s reliable, managed, and simple… until you need to run workloads across multiple Availability Zones (AZs).&lt;/p&gt;

&lt;p&gt;Suddenly you’re managing multiple NAT Gateways, multiple public subnets, multiple route tables and of course, multiple bills.&lt;/p&gt;

&lt;p&gt;But AWS recently rolled out an update that changes the game: &lt;strong&gt;A new Regional NAT Gateway mode&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;In this post, I’ll break down what changed, why it matters, and how you can start using it today.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What AWS Actually Changed&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Traditionally, NAT Gateways were zonal. This meant you needed one NAT Gateway per AZ if you wanted high availability which led to higher cost and more complex architecture.&lt;/p&gt;

&lt;p&gt;With the new update, AWS now allows you to create a single NAT Gateway at the VPC level, which:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Automatically scales across AZs as needed&lt;/li&gt;
&lt;li&gt;Doesn’t require a public subnet in every AZ&lt;/li&gt;
&lt;li&gt;Supports Elastic IPs (EIPs) or Bring-Your-Own-IP (BYOIP)&lt;/li&gt;
&lt;li&gt;Automatically expands into an AZ when workloads appear there&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You essentially get a central, smarter, self-adjusting NAT Gateway for your entire VPC.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why This Update Is a Big Deal&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;1 &lt;strong&gt;Your Architecture Becomes Much Simpler&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;No more creating public subnets, NAT gateways, and route tables for every AZ. Your VPC diagram instantly gets cleaner.&lt;/p&gt;

&lt;p&gt;2 &lt;strong&gt;Better High Availability (With Less Work)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The regional NAT Gateway expands into any AZ where you launch resources. No failover scripts. No manual setup. Just automatic coverage.&lt;/p&gt;

&lt;p&gt;3 &lt;strong&gt;Better Security Posture&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Since you don’t need public subnets in every AZ anymore, your VPC can lean more toward a “private-by-default” model.&lt;/p&gt;

&lt;p&gt;4 &lt;strong&gt;Smarter IP Handling&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;AWS now automatically allocates additional IPs when connection limits are reached. It also integrates with IPAM, so large orgs can manage IP policies more cleanly.&lt;/p&gt;

&lt;p&gt;5 &lt;strong&gt;Potential Cost Optimization&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;You’re not paying for multiple idle NAT Gateways, You pay only for the regional gateway hours in the AZs where traffic actually flows.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How to Use the Regional NAT Gateway&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Here’s a simple AWS CLI example for creating one:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;aws ec2 create-nat-gateway \
  --connectivity-type public \
  --subnet-id subnet-1234567890abcdef \
  --region-availability regional \
  --allocation-id eipalloc-0123456789abcdef

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

&lt;/div&gt;



&lt;p&gt;In Terraform:&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_nat_gateway" "regional" {
  connectivity_type    = "public"
  subnet_id            = var.public_subnet
  region_availability  = "regional"
  allocation_id        = aws_eip.nat.id
}

resource "aws_eip" "nat" {
  domain = "vpc"
}

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

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Final Thoughts&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This update feels like one of those subtle AWS changes that quietly unlock major improvements in how we design cloud networks. Instead of juggling multiple NAT Gateways, route tables, and subnets, you can now build cleaner, more resilient architectures with much less effort.&lt;/p&gt;

&lt;p&gt;For teams that value scalability, security, and simplicity, this is a win.&lt;/p&gt;

&lt;p&gt;If you haven’t tried the new Regional NAT Gateway yet, spin it up in a dev environment and watch how much simpler your VPC looks.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Author: SAHEED OLATUNDE IPAYE&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>networking</category>
      <category>news</category>
      <category>architecture</category>
      <category>aws</category>
    </item>
    <item>
      <title>How I Saved My Cloud Costs Before Spending a Dime - When I built a simple café website on AWS for practice, everything looked perfect until I asked myself a question no cloud engineer should ignore: “How much will this architecture cost me every month?”</title>
      <dc:creator>saheed</dc:creator>
      <pubDate>Sun, 26 Oct 2025 14:39:33 +0000</pubDate>
      <link>https://dev.to/saheed_ea3f3e90be19db2eac/how-i-saved-my-cloud-costs-before-spending-a-dime-when-i-built-a-simple-cafe-website-on-aws-for-3ab3</link>
      <guid>https://dev.to/saheed_ea3f3e90be19db2eac/how-i-saved-my-cloud-costs-before-spending-a-dime-when-i-built-a-simple-cafe-website-on-aws-for-3ab3</guid>
      <description>&lt;p&gt;

&lt;/p&gt;
&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/saheed_ea3f3e90be19db2eac/the-power-of-aws-pricing-calculator-your-secret-weapon-for-cloud-cost-optimization-5164" class="crayons-story__hidden-navigation-link"&gt;The Power of AWS Pricing Calculator - Your Secret Weapon for Cloud Cost Optimization&lt;/a&gt;


  &lt;div class="crayons-story__body crayons-story__body-full_post"&gt;
    &lt;div class="crayons-story__top"&gt;
      &lt;div class="crayons-story__meta"&gt;
        &lt;div class="crayons-story__author-pic"&gt;

          &lt;a href="/saheed_ea3f3e90be19db2eac" class="crayons-avatar  crayons-avatar--l  "&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%2F3564446%2F428535b3-dd9e-4b74-9635-1086a8b0f210.png" alt="saheed_ea3f3e90be19db2eac profile" class="crayons-avatar__image"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/saheed_ea3f3e90be19db2eac" class="crayons-story__secondary fw-medium m:hidden"&gt;
              saheed
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                saheed
                
              
              &lt;div id="story-author-preview-content-2962473" class="profile-preview-card__content crayons-dropdown branded-7 p-4 pt-0"&gt;
                &lt;div class="gap-4 grid"&gt;
                  &lt;div class="-mt-4"&gt;
                    &lt;a href="/saheed_ea3f3e90be19db2eac" class="flex"&gt;
                      &lt;span class="crayons-avatar crayons-avatar--xl mr-2 shrink-0"&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%2F3564446%2F428535b3-dd9e-4b74-9635-1086a8b0f210.png" class="crayons-avatar__image" alt=""&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;saheed&lt;/span&gt;
                    &lt;/a&gt;
                  &lt;/div&gt;
                  &lt;div class="print-hidden"&gt;
                    
                      Follow
                    
                  &lt;/div&gt;
                  &lt;div class="author-preview-metadata-container"&gt;&lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
            &lt;/div&gt;

          &lt;/div&gt;
          &lt;a href="https://dev.to/saheed_ea3f3e90be19db2eac/the-power-of-aws-pricing-calculator-your-secret-weapon-for-cloud-cost-optimization-5164" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;Oct 26 '25&lt;/time&gt;&lt;span class="time-ago-indicator-initial-placeholder"&gt;&lt;/span&gt;&lt;/a&gt;
        &lt;/div&gt;
      &lt;/div&gt;

    &lt;/div&gt;

    &lt;div class="crayons-story__indention"&gt;
      &lt;h2 class="crayons-story__title crayons-story__title-full_post"&gt;
        &lt;a href="https://dev.to/saheed_ea3f3e90be19db2eac/the-power-of-aws-pricing-calculator-your-secret-weapon-for-cloud-cost-optimization-5164" id="article-link-2962473"&gt;
          The Power of AWS Pricing Calculator - Your Secret Weapon for Cloud Cost Optimization
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/tutorial"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;tutorial&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/productivity"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;productivity&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/cloud"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;cloud&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/aws"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;aws&lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="crayons-story__bottom"&gt;
        &lt;div class="crayons-story__details"&gt;
          &lt;a href="https://dev.to/saheed_ea3f3e90be19db2eac/the-power-of-aws-pricing-calculator-your-secret-weapon-for-cloud-cost-optimization-5164" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left"&gt;
            &lt;div class="multiple_reactions_aggregate"&gt;
              &lt;span class="multiple_reactions_icons_container"&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/sparkle-heart-5f9bee3767e18deb1bb725290cb151c25234768a0e9a2bd39370c382d02920cf.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
              &lt;/span&gt;
              &lt;span class="aggregate_reactions_counter"&gt;1&lt;span class="hidden s:inline"&gt; reaction&lt;/span&gt;&lt;/span&gt;
            &lt;/div&gt;
          &lt;/a&gt;
            &lt;a href="https://dev.to/saheed_ea3f3e90be19db2eac/the-power-of-aws-pricing-calculator-your-secret-weapon-for-cloud-cost-optimization-5164#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              Comments


              &lt;span class="hidden s:inline"&gt;Add Comment&lt;/span&gt;
            &lt;/a&gt;
        &lt;/div&gt;
        &lt;div class="crayons-story__save"&gt;
          &lt;small class="crayons-story__tertiary fs-xs mr-2"&gt;
            5 min read
          &lt;/small&gt;
            
              &lt;span class="bm-initial"&gt;
                

              &lt;/span&gt;
              &lt;span class="bm-success"&gt;
                

              &lt;/span&gt;
            
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;




</description>
      <category>beginners</category>
      <category>productivity</category>
      <category>cloud</category>
      <category>aws</category>
    </item>
    <item>
      <title>The Power of AWS Pricing Calculator - Your Secret Weapon for Cloud Cost Optimization</title>
      <dc:creator>saheed</dc:creator>
      <pubDate>Sun, 26 Oct 2025 14:25:02 +0000</pubDate>
      <link>https://dev.to/saheed_ea3f3e90be19db2eac/the-power-of-aws-pricing-calculator-your-secret-weapon-for-cloud-cost-optimization-5164</link>
      <guid>https://dev.to/saheed_ea3f3e90be19db2eac/the-power-of-aws-pricing-calculator-your-secret-weapon-for-cloud-cost-optimization-5164</guid>
      <description>&lt;p&gt;&lt;strong&gt;INTRODUCTION&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Why Cloud Engineers Can't Afford to Ignore This Tool, Picture this: You've just deployed your application to AWS, feeling proud of your architecture. Then the first bill arrives, and your jaw drops. Sound familiar? You're not alone. Cloud cost surprises are one of the biggest challenges facing engineers today, but there's a powerful tool that most people aren't leveraging effectively: the AWS Pricing Calculator.&lt;/p&gt;

&lt;p&gt;In this comprehensive guide, I'll walk you through a real-world scenario using the AWS Pricing Calculator to estimate costs and optimize spending. By the end, you'll understand why this tool should be your first stop before deploying any AWS infrastructure.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Hidden Cost of "Figure It Out Later"&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Many developers treat AWS pricing as an afterthought. They spin up resources, build their applications, and hope for the best. This approach can lead to:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Budget overruns that derail projects&lt;/li&gt;
&lt;li&gt;Unexpected bills that catch stakeholders off-guard&lt;/li&gt;
&lt;li&gt;Missed optimization opportunities that could save thousands&lt;/li&gt;
&lt;li&gt;Difficult conversations with finance teams&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The AWS Pricing Calculator eliminates these surprises by giving you accurate cost estimates before you commit a single dollar to infrastructure.&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%2F3gp1cqsadwxd9n0s182z.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%2F3gp1cqsadwxd9n0s182z.png" alt=" " width="800" height="435"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Real-World Scenario: Estimating Costs for a Café Website&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Let's work through a practical example. Imagine you're running a café website on AWS and need to estimate your monthly costs. The current setup includes:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;An EC2 instance running the web application&lt;/li&gt;
&lt;li&gt;An RDS database for customer data&lt;/li&gt;
&lt;li&gt;Storage for both the application and a decommissioned local database&lt;/li&gt;
&lt;/ol&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%2F3s3vx6e5htxxnm22kvb8.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%2F3s3vx6e5htxxnm22kvb8.png" alt=" " width="800" height="435"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We'll calculate the cost of this "before optimization" topology, which represents a common scenario where legacy components still occupy resources and cost money.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Our Infrastructure Components&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Region: US East (N. Virginia) - or whichever region your resources run in&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Amazon EC2 Instance:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Instance type: t3.small&lt;br&gt;
Pricing model: On-Demand&lt;br&gt;
Utilization: 100% per month (constant usage)&lt;br&gt;
Operating system: Linux&lt;br&gt;
Storage: 40 GB General Purpose SSD (gp2) - including 20 GB from a decommissioned database&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Amazon RDS Instance:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Instance class: db.t3.micro&lt;br&gt;
Database engine: MariaDB&lt;br&gt;
Storage: 20 GB General Purpose SSD (gp2)&lt;br&gt;
Deployment: Standard single-AZ&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step-by-Step: Building Your Cost Estimate&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Let me walk you through the exact process of creating this estimate. Follow along, and you'll have a reusable framework for any future AWS projects.&lt;br&gt;
**&lt;br&gt;
Phase 1: Setting Up Your Estimate**&lt;/p&gt;

&lt;p&gt;Step 1: Navigate to the AWS Pricing Calculator at &lt;a href="https://calculator.aws" rel="noopener noreferrer"&gt;https://calculator.aws&lt;/a&gt; and click Create estimate.&lt;/p&gt;

&lt;p&gt;Step 2: Scroll through the service options until you find the Amazon EC2 service box, then click Configure.&lt;/p&gt;

&lt;p&gt;Step 3: At the top of the page, select your region from the dropdown menu. For this example, we're using US East (N. Virginia). If prompted, confirm the region change by clicking Change Region.&lt;/p&gt;

&lt;p&gt;Why this matters: AWS pricing varies significantly by region. Choosing the correct region ensures your estimate matches your actual costs.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Phase 2: Configuring Your EC2 Instance&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Step 4: Select the Advanced estimate option for more detailed configuration control.&lt;/p&gt;

&lt;p&gt;Step 5: In the EC2 instance specifications section, choose Linux as your operating system.&lt;/p&gt;

&lt;p&gt;Step 6: Configure the workload settings:&lt;/p&gt;

&lt;p&gt;Select Constant usage (since our café website runs 24/7)&lt;br&gt;
Set Number of instances to 1&lt;/p&gt;

&lt;p&gt;Step 7: In the EC2 instances search box, type and select t3.small as your instance type.&lt;/p&gt;

&lt;p&gt;Pro tip: The t3.small is part of AWS's burstable performance instances, ideal for workloads with variable CPU usage. It provides a baseline performance with the ability to burst when needed.&lt;/p&gt;

&lt;p&gt;Step 8: Under Pricing strategy, ensure On-Demand is selected. This gives you maximum flexibility without long-term commitments.&lt;/p&gt;

&lt;p&gt;Step 9: Configure storage in the Amazon Elastic Block Storage (EBS) section:&lt;/p&gt;

&lt;p&gt;Storage type: General Purpose SSD (gp2)&lt;br&gt;
Storage amount: 40 GB&lt;br&gt;
Snapshot Frequency: No snapshot storage&lt;/p&gt;

&lt;p&gt;Key insight: Notice we're paying for 40 GB even though 20 GB is occupied by a decommissioned database. This is exactly the kind of waste the calculator helps you identify!&lt;/p&gt;

&lt;p&gt;Step 10: Scroll down and click Add to my estimate.&lt;/p&gt;

&lt;p&gt;Excellent! You've now calculated your EC2 costs. But we're not done yet.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Phase 3: Adding Your RDS Database&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Step 11: On the My Estimate page, click Add service.&lt;/p&gt;

&lt;p&gt;Step 12: Find and click Configure in the Amazon RDS for MariaDB service panel.&lt;/p&gt;

&lt;p&gt;Step 13: Configure your RDS instance:&lt;/p&gt;

&lt;p&gt;Region: Select the same region as your EC2 instance&lt;br&gt;
MariaDB instance specifications: Standard (single-AZ)&lt;br&gt;
Instance type: Search for and select db.t3.micro&lt;br&gt;
Quantity: 1&lt;br&gt;
Pricing model: On-Demand Instances&lt;br&gt;
Storage volume: General Purpose SSD (gp2)&lt;br&gt;
Storage amount: 20 GB per month&lt;/p&gt;

&lt;p&gt;Important consideration: We're using single-AZ for this example, but production workloads should seriously consider Multi-AZ deployments for high availability. The calculator makes it easy to compare these costs.&lt;/p&gt;

&lt;p&gt;Step 14: Click Add to my estimate.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Phase 4: Reviewing and Sharing Your Estimate&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Congratulations! You now have a complete cost breakdown showing:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Individual service costs&lt;/li&gt;
&lt;li&gt;Detailed configuration for each component&lt;/li&gt;
&lt;li&gt;Total estimated monthly cost&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Step 15: Click Save and share (agree to terms if prompted).&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%2Fng8ln2ft0pjpka2jos6d.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%2Fng8ln2ft0pjpka2jos6d.png" alt=" " width="800" height="435"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Game-Changing Benefits of AWS Pricing Calculator&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Now that you've seen the calculator in action, let's discuss why this tool is indispensable for every cloud engineer:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Eliminate Budget Surprises&lt;/strong&gt;&lt;br&gt;
No more anxiety when the monthly bill arrives. You know exactly what to expect, down to the dollar. This predictability lets you sleep better and build with confidence.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Data-Driven Optimization Decisions&lt;/strong&gt;&lt;br&gt;
Want to know if upgrading to a larger instance or switching to Reserved Instances saves money? Build two estimates and compare. The calculator turns "I think" into "I know."&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Identify Waste Before It Costs You&lt;/strong&gt;&lt;br&gt;
In our example, we spotted 20 GB of storage from a decommissioned database. Without the calculator forcing you to itemize resources, would you have noticed? Probably not until you ran a cost audit months later.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Experiment Risk-Free&lt;/strong&gt;&lt;br&gt;
Wondering if a different architecture would be more cost-effective? Build estimates for multiple scenarios without spinning up a single resource. This is particularly valuable for proof-of-concept discussions.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&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%2F4xeouysy1i1kvl2uqxlu.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%2F4xeouysy1i1kvl2uqxlu.png" alt=" " width="800" height="435"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;CONCLUSION&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The AWS Pricing Calculator isn't just a nice to have tool it's essential for responsible cloud engineering. In our café website example, we now have a clear baseline cost estimate. More importantly, we've identified an obvious optimization opportunity: that 20 GB of wasted storage.&lt;/p&gt;

&lt;p&gt;Before you deploy your next AWS resource, take 15 minutes with the pricing calculator. Your future self (and your finance team) will thank you. The tool transforms cloud cost management from reactive firefighting into proactive planning.&lt;/p&gt;

&lt;p&gt;Remember every dollar you save on AWS infrastructure is a dollar your organization can invest in innovation, better tools, or your next big idea.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Your Turn&lt;/strong&gt;&lt;br&gt;
Have you used the AWS Pricing Calculator before? What cost surprises have you encountered in your cloud journey? Share your experiences in the comments below—I'd love to hear your optimization stories!&lt;/p&gt;

&lt;p&gt;Published by Saheed O. Ipaye.&lt;/p&gt;

</description>
      <category>tutorial</category>
      <category>productivity</category>
      <category>cloud</category>
      <category>aws</category>
    </item>
    <item>
      <title>[Boost]</title>
      <dc:creator>saheed</dc:creator>
      <pubDate>Tue, 21 Oct 2025 20:14:05 +0000</pubDate>
      <link>https://dev.to/saheed_ea3f3e90be19db2eac/-55cg</link>
      <guid>https://dev.to/saheed_ea3f3e90be19db2eac/-55cg</guid>
      <description>&lt;div class="ltag__link"&gt;
  &lt;a href="/saheed_ea3f3e90be19db2eac" 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%2F3564446%2F428535b3-dd9e-4b74-9635-1086a8b0f210.png" alt="saheed_ea3f3e90be19db2eac"&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="https://dev.to/saheed_ea3f3e90be19db2eac/from-zero-to-cloud-building-a-serverless-school-management-system-on-aws-23nc" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;From Zero to Cloud: Building a Serverless School Management System on AWS&lt;/h2&gt;
      &lt;h3&gt;saheed ・ Oct 21&lt;/h3&gt;
      &lt;div class="ltag__link__taglist"&gt;
        &lt;span class="ltag__link__tag"&gt;#serverless&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#architecture&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#aws&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#tutorial&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;


</description>
      <category>serverless</category>
      <category>architecture</category>
      <category>aws</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>From Zero to Cloud: Building a Serverless School Management System on AWS</title>
      <dc:creator>saheed</dc:creator>
      <pubDate>Tue, 21 Oct 2025 14:32:05 +0000</pubDate>
      <link>https://dev.to/saheed_ea3f3e90be19db2eac/from-zero-to-cloud-building-a-serverless-school-management-system-on-aws-23nc</link>
      <guid>https://dev.to/saheed_ea3f3e90be19db2eac/from-zero-to-cloud-building-a-serverless-school-management-system-on-aws-23nc</guid>
      <description>&lt;p&gt;&lt;strong&gt;INTRODUCTION&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;When I started this project, my goal was simple to build something real on the cloud, I spent two weeks building a production ready web application with one simple goal to prove that you don't need expensive servers to ship real applications.&lt;/p&gt;

&lt;p&gt;The result? A fully functional school management system that:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Scales from 1 to 1 million requests automatically&lt;/li&gt;
&lt;li&gt;Costs less than $2/month to run&lt;/li&gt;
&lt;li&gt;Handles real-world problems (CORS, data integrity, query optimization)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This isn't a "Hello World" serverless app. This is a real project with real challenges, real solutions, and real learnings let me show you exactly how I built it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What We're Building&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Before diving into code, here's what the final system does:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;User Perspective:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;View all school classes in a beautiful card-based interface&lt;/li&gt;
&lt;li&gt;Click on a class to see all enrolled students&lt;/li&gt;
&lt;li&gt;View detailed student information&lt;/li&gt;
&lt;li&gt;Add new students with a form&lt;/li&gt;
&lt;li&gt;Everything loads in under 200ms&lt;/li&gt;
&lt;/ol&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%2Ff6awo8j267ojs567ufrv.jpeg" 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%2Ff6awo8j267ojs567ufrv.jpeg" alt=" " width="800" height="477"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Behind the Scenes:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Serverless backend with zero servers to manage&lt;/li&gt;
&lt;li&gt;Auto-scaling to handle any traffic&lt;/li&gt;
&lt;li&gt;NoSQL database optimized for the access patterns&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Database Design : Create DynamoDB Tables&lt;/strong&gt;&lt;br&gt;
First, I went to AWS DynamoDB and created two tables&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%2F3g2xho85g3vwxheqa6gf.jpeg" 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%2F3g2xho85g3vwxheqa6gf.jpeg" alt=" " width="800" height="477"&gt;&lt;/a&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%2Fdjzllnqsiwutpocw88wv.jpeg" 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%2Fdjzllnqsiwutpocw88wv.jpeg" alt=" " width="800" height="477"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why this structure?&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;ClassID as partition key for direct lookups&lt;/li&gt;
&lt;li&gt;GSI on ClassID for querying students by class &lt;/li&gt;
&lt;li&gt;Simple, flat structure (no complex joins)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Lambda Functions&lt;/strong&gt; &lt;br&gt;
I Created Four Lambda Functions&lt;br&gt;
Each function handles one specific operation. I created them in Python 3.12 runtime.&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%2F7g4ocx7g3aqyymord1gm.jpeg" 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%2F7g4ocx7g3aqyymord1gm.jpeg" alt=" " width="800" height="477"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Create REST API&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Went to API Gateway console Created new REST API named SchoolManagementAPI&lt;/p&gt;

&lt;p&gt;Created resources:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;/classes&lt;/li&gt;
&lt;li&gt;/classes/{classId}&lt;/li&gt;
&lt;li&gt;/classes/{classId}/students&lt;/li&gt;
&lt;li&gt;/students&lt;/li&gt;
&lt;li&gt;/students/{studentId}&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;For each resource, created the appropriate HTTP method: &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%2Fiqbqhtuqeg007hg2tqpr.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%2Fiqbqhtuqeg007hg2tqpr.png" alt=" " width="800" height="218"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Critical Setting: Enable "Use Lambda Proxy integration" for each method.&lt;/p&gt;

&lt;p&gt;Enable CORS&lt;/p&gt;

&lt;p&gt;This is where I spent 2 hours debugging! For each resource:&lt;/p&gt;

&lt;p&gt;Click "Actions" → "Enable CORS"&lt;/p&gt;

&lt;p&gt;Set:&lt;br&gt;
Access-Control-Allow-Origin: *&lt;br&gt;
Access-Control-Allow-Methods: GET,POST,OPTIONS&lt;br&gt;
Access-Control-Allow-Headers: Content-Type,X-Amz-Date,Authorization&lt;/p&gt;

&lt;p&gt;Important: This creates an OPTIONS method automatically for preflight requests.&lt;/p&gt;

&lt;p&gt;Deploy API&lt;/p&gt;

&lt;p&gt;Click "Actions" → "Deploy API"&lt;br&gt;
Select "[New Stage]"&lt;br&gt;
Name it: dev&lt;br&gt;
Copy the Invoke URL&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;curl https://school-management-app-saheed-ipaye.s3-website.eu-west-2.amazonaws.com/
/dev/classes
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Frontend Deployment&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Create S3 Bucket&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Went to S3 console&lt;/li&gt;
&lt;li&gt;Created bucket: school-management-app-saheed-ipaye&lt;/li&gt;
&lt;li&gt;Disabled "Block all public access"&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Upload Frontend&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Saved React app as index.html&lt;/li&gt;
&lt;li&gt;Uploaded to bucket root&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Configure Static Website Hosting&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Properties tab → Static website hosting&lt;/li&gt;
&lt;li&gt;Enable it&lt;/li&gt;
&lt;li&gt;Index document: index.html&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Setup CloudFront&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Create CloudFront distribution&lt;/li&gt;
&lt;li&gt;Origin: Your S3 bucket&lt;/li&gt;
&lt;li&gt;Redirect HTTP to HTTPS&lt;/li&gt;
&lt;li&gt;Default root object: index.html&lt;/li&gt;
&lt;li&gt;Deploy (takes 5-15 minutes)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Challenges I Faced&lt;/strong&gt;  &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Challenge 1: CORS Errors&lt;/strong&gt;&lt;br&gt;
Problem: Frontend couldn't call API - "Access-Control-Allow-Origin missing"&lt;/p&gt;

&lt;p&gt;Root Cause: CORS needed configuration at BOTH Lambda AND API Gateway&lt;/p&gt;

&lt;p&gt;Solution:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Added headers in Lambda responses&lt;/li&gt;
&lt;li&gt;Enabled CORS on all API Gateway resources&lt;/li&gt;
&lt;li&gt;Created OPTIONS methods&lt;/li&gt;
&lt;li&gt;Deployed changes&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Challenge 2: Slow Database Queries&lt;/strong&gt;&lt;br&gt;
Problem: Students not showing up quickly&lt;/p&gt;

&lt;p&gt;Root Cause: Using scan() instead of query() on DynamoDB&lt;/p&gt;

&lt;p&gt;Solution:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Created Global Secondary Index (GSI) on ClassID&lt;/li&gt;
&lt;li&gt;Changed from scan to query operation&lt;/li&gt;
&lt;li&gt;Result: 500ms → 50ms (90% improvement!)
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# Before (Slow)
response = table.scan(
    FilterExpression='ClassID = :classid',
    ExpressionAttributeValues={':classid': class_id}
)

# After (Fast)
response = table.query(
    IndexName='ClassID-index',
    KeyConditionExpression='ClassID = :classid',
    ExpressionAttributeValues={':classid': class_id}
)

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

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Conclusion&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Building this serverless application taught me that:&lt;/p&gt;

&lt;p&gt;You don't need expensive infrastructure to ship real apps&lt;/p&gt;

&lt;p&gt;✅ Cloud services require thinking differently about architecture&lt;br&gt;
✅ The best learning happens when debugging production issues&lt;br&gt;
✅ Documentation and clean code matter&lt;br&gt;
✅ Shipping something imperfect beats perfecting in isolation&lt;/p&gt;

&lt;p&gt;If you're thinking about serverless but haven't started yet Start today. Build something simple, break it, fix it, and learn.&lt;/p&gt;

&lt;p&gt;The cloud is the future. Might as well get familiar with it now.&lt;/p&gt;

&lt;p&gt;AUTHOR: SAHEED IPAYE&lt;/p&gt;

</description>
      <category>serverless</category>
      <category>architecture</category>
      <category>aws</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>What's your biggest Docker pain point? Have you tried multi-stage builds? Drop your optimization tips below! 👇</title>
      <dc:creator>saheed</dc:creator>
      <pubDate>Tue, 14 Oct 2025 15:39:38 +0000</pubDate>
      <link>https://dev.to/saheed_ea3f3e90be19db2eac/whats-your-biggest-docker-pain-point-have-you-tried-multi-stage-builds-drop-your-optimization-1n1o</link>
      <guid>https://dev.to/saheed_ea3f3e90be19db2eac/whats-your-biggest-docker-pain-point-have-you-tried-multi-stage-builds-drop-your-optimization-1n1o</guid>
      <description>&lt;p&gt;

&lt;/p&gt;
&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/saheed_ea3f3e90be19db2eac/from-157gb-to-189mb-how-i-slashed-my-docker-image-size-by-88-2b5l" class="crayons-story__hidden-navigation-link"&gt;From 1.57GB to 189MB: How I Slashed My Docker Image Size by 88%&lt;/a&gt;


  &lt;div class="crayons-story__body crayons-story__body-full_post"&gt;
    &lt;div class="crayons-story__top"&gt;
      &lt;div class="crayons-story__meta"&gt;
        &lt;div class="crayons-story__author-pic"&gt;

          &lt;a href="/saheed_ea3f3e90be19db2eac" class="crayons-avatar  crayons-avatar--l  "&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%2F3564446%2F428535b3-dd9e-4b74-9635-1086a8b0f210.png" alt="saheed_ea3f3e90be19db2eac profile" class="crayons-avatar__image"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/saheed_ea3f3e90be19db2eac" class="crayons-story__secondary fw-medium m:hidden"&gt;
              saheed
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                saheed
                
              
              &lt;div id="story-author-preview-content-2923829" class="profile-preview-card__content crayons-dropdown branded-7 p-4 pt-0"&gt;
                &lt;div class="gap-4 grid"&gt;
                  &lt;div class="-mt-4"&gt;
                    &lt;a href="/saheed_ea3f3e90be19db2eac" class="flex"&gt;
                      &lt;span class="crayons-avatar crayons-avatar--xl mr-2 shrink-0"&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%2F3564446%2F428535b3-dd9e-4b74-9635-1086a8b0f210.png" class="crayons-avatar__image" alt=""&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;saheed&lt;/span&gt;
                    &lt;/a&gt;
                  &lt;/div&gt;
                  &lt;div class="print-hidden"&gt;
                    
                      Follow
                    
                  &lt;/div&gt;
                  &lt;div class="author-preview-metadata-container"&gt;&lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
            &lt;/div&gt;

          &lt;/div&gt;
          &lt;a href="https://dev.to/saheed_ea3f3e90be19db2eac/from-157gb-to-189mb-how-i-slashed-my-docker-image-size-by-88-2b5l" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;Oct 14 '25&lt;/time&gt;&lt;span class="time-ago-indicator-initial-placeholder"&gt;&lt;/span&gt;&lt;/a&gt;
        &lt;/div&gt;
      &lt;/div&gt;

    &lt;/div&gt;

    &lt;div class="crayons-story__indention"&gt;
      &lt;h2 class="crayons-story__title crayons-story__title-full_post"&gt;
        &lt;a href="https://dev.to/saheed_ea3f3e90be19db2eac/from-157gb-to-189mb-how-i-slashed-my-docker-image-size-by-88-2b5l" id="article-link-2923829"&gt;
          From 1.57GB to 189MB: How I Slashed My Docker Image Size by 88%
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/devops"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;devops&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/aws"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;aws&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/docker"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;docker&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/performance"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;performance&lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="crayons-story__bottom"&gt;
        &lt;div class="crayons-story__details"&gt;
          &lt;a href="https://dev.to/saheed_ea3f3e90be19db2eac/from-157gb-to-189mb-how-i-slashed-my-docker-image-size-by-88-2b5l" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left"&gt;
            &lt;div class="multiple_reactions_aggregate"&gt;
              &lt;span class="multiple_reactions_icons_container"&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/fire-f60e7a582391810302117f987b22a8ef04a2fe0df7e3258a5f49332df1cec71e.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/exploding-head-daceb38d627e6ae9b730f36a1e390fca556a4289d5a41abb2c35068ad3e2c4b5.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/sparkle-heart-5f9bee3767e18deb1bb725290cb151c25234768a0e9a2bd39370c382d02920cf.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
              &lt;/span&gt;
              &lt;span class="aggregate_reactions_counter"&gt;11&lt;span class="hidden s:inline"&gt; reactions&lt;/span&gt;&lt;/span&gt;
            &lt;/div&gt;
          &lt;/a&gt;
            &lt;a href="https://dev.to/saheed_ea3f3e90be19db2eac/from-157gb-to-189mb-how-i-slashed-my-docker-image-size-by-88-2b5l#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              Comments


              3&lt;span class="hidden s:inline"&gt; comments&lt;/span&gt;
            &lt;/a&gt;
        &lt;/div&gt;
        &lt;div class="crayons-story__save"&gt;
          &lt;small class="crayons-story__tertiary fs-xs mr-2"&gt;
            3 min read
          &lt;/small&gt;
            
              &lt;span class="bm-initial"&gt;
                

              &lt;/span&gt;
              &lt;span class="bm-success"&gt;
                

              &lt;/span&gt;
            
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;




</description>
    </item>
  </channel>
</rss>
