<?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: Stephanie Makori</title>
    <description>The latest articles on DEV Community by Stephanie Makori (@stephanie_makori_845bb2c0).</description>
    <link>https://dev.to/stephanie_makori_845bb2c0</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%2F3829770%2F6b12f232-db11-4209-80a0-654ac696718d.JPG</url>
      <title>DEV Community: Stephanie Makori</title>
      <link>https://dev.to/stephanie_makori_845bb2c0</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/stephanie_makori_845bb2c0"/>
    <language>en</language>
    <item>
      <title>Ready for Terraform Certification: My Final Exam Prep and 30-Day Reflection</title>
      <dc:creator>Stephanie Makori</dc:creator>
      <pubDate>Tue, 21 Apr 2026 18:28:18 +0000</pubDate>
      <link>https://dev.to/stephanie_makori_845bb2c0/ready-for-terraform-certification-my-final-exam-prep-and-30-day-reflection-n77</link>
      <guid>https://dev.to/stephanie_makori_845bb2c0/ready-for-terraform-certification-my-final-exam-prep-and-30-day-reflection-n77</guid>
      <description>&lt;p&gt;Today is Day 30 of the 30-Day Terraform Challenge. I started this journey as someone who understood the concept of Infrastructure as Code but had never written a production Terraform configuration. Today I am finishing as someone who has deployed servers, clusters, databases, static websites, and Kubernetes workloads. I have written automated tests, built CI/CD pipelines, managed state across multiple environments, and understood how infrastructure deployment works at a professional level.&lt;/p&gt;

&lt;p&gt;This is my final exam preparation post and my reflection on 30 days of intense, focused learning.&lt;/p&gt;

&lt;h2&gt;
  
  
  My Final Practice Exam Results
&lt;/h2&gt;

&lt;p&gt;I took five full simulated exams over the past three days. Here is my progression:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Exam&lt;/th&gt;
&lt;th&gt;Score&lt;/th&gt;
&lt;th&gt;Percentage&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Exam 1&lt;/td&gt;
&lt;td&gt;38/57&lt;/td&gt;
&lt;td&gt;66.7%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Exam 2&lt;/td&gt;
&lt;td&gt;43/57&lt;/td&gt;
&lt;td&gt;75.4%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Exam 3&lt;/td&gt;
&lt;td&gt;46/57&lt;/td&gt;
&lt;td&gt;80.7%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Exam 4&lt;/td&gt;
&lt;td&gt;49/57&lt;/td&gt;
&lt;td&gt;85.9%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Exam 5&lt;/td&gt;
&lt;td&gt;51/57&lt;/td&gt;
&lt;td&gt;89.5%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The improvement from 66.7% to 89.5% tells me I did not just memorize answers. I actually learned the material. The stability between Exam 4 and Exam 5 shows consolidation, not cramming.&lt;/p&gt;

&lt;p&gt;On the final simulated exam, my wrong answers were集中在 Terraform Cloud agent pools, module source version pinning, and the exact behavior of &lt;code&gt;moved&lt;/code&gt; blocks. I noted these topics but did not deep dive into new documentation on the last day. That work is done. I trust what I know.&lt;/p&gt;

&lt;h2&gt;
  
  
  Fill in the Blank Self Test
&lt;/h2&gt;

&lt;p&gt;I tested myself on ten fill in the blank questions. These are harder than multiple choice because you cannot recognize the answer. You have to retrieve it from memory.&lt;/p&gt;

&lt;p&gt;Here were my answers before checking any documentation:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;code&gt;fmt&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;prevent_destroy&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;workspace&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;encrypt&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;set&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;rm&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;3.0&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;existing&lt;/code&gt;, &lt;code&gt;managed&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;.terraform.lock.hcl&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;myplan.tfplan&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;All ten were correct.&lt;/p&gt;

&lt;p&gt;The ones I hesitated on: number 4 (S3 backend encryption uses &lt;code&gt;encrypt = true&lt;/code&gt;, not &lt;code&gt;sse_algorithm&lt;/code&gt;) and number 9 (the lock file is &lt;code&gt;.terraform.lock.hcl&lt;/code&gt; with the dot at the start). Precision matters on the certification exam. Getting these right from memory tells me my recall is exam ready.&lt;/p&gt;

&lt;h2&gt;
  
  
  Final Readiness Check
&lt;/h2&gt;

&lt;p&gt;I answered these ten questions cold. No notes. No documentation. No searching.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. What does &lt;code&gt;terraform init&lt;/code&gt; do to your &lt;code&gt;.terraform&lt;/code&gt; directory?&lt;/strong&gt;&lt;br&gt;
It creates or updates the directory, downloading provider plugins and modules specified in the configuration into &lt;code&gt;.terraform/providers&lt;/code&gt; and &lt;code&gt;.terraform/modules&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. What is the difference between &lt;code&gt;terraform.tfstate&lt;/code&gt; and &lt;code&gt;terraform.tfstate.backup&lt;/code&gt;?&lt;/strong&gt;&lt;br&gt;
The main state file contains the current mapping of configuration to real infrastructure. The backup file is created automatically before state changing operations and contains the previous state version.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Why should you never commit &lt;code&gt;terraform.tfstate&lt;/code&gt; to version control?&lt;/strong&gt;&lt;br&gt;
Because it contains sensitive data in plain text including resource IDs, IP addresses, and potential secrets. Also because team conflicts on state files are unmanageable. Use remote state backends.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. What does &lt;code&gt;depends_on&lt;/code&gt; do and when should you use it?&lt;/strong&gt;&lt;br&gt;
It creates explicit dependencies when Terraform cannot infer them automatically. Use it only when implicit references are impossible, such as when a resource must exist before another but you do not reference any of its attributes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5. What is the difference between a &lt;code&gt;variable&lt;/code&gt; block and a &lt;code&gt;locals&lt;/code&gt; block?&lt;/strong&gt;&lt;br&gt;
Variables are input parameters set from outside the module. Locals are internal named expressions that cannot be overridden.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;6. What happens if you run &lt;code&gt;terraform apply&lt;/code&gt; and the state file was modified by another team member since your last &lt;code&gt;terraform plan&lt;/code&gt;?&lt;/strong&gt;&lt;br&gt;
Terraform refreshes the state before applying and detects drift. If conflicts exist, Terraform will error or prompt you to run a new plan.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;7. What does the &lt;code&gt;terraform graph&lt;/code&gt; command output and what is it used for?&lt;/strong&gt;&lt;br&gt;
It outputs a Graphviz formatted visualization of the dependency graph. Use it to debug complex dependencies and understand why Terraform plans to destroy and recreate resources.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;8. What is the Terraform Registry and what are the three types of things published there?&lt;/strong&gt;&lt;br&gt;
The Registry is HashiCorp's platform for sharing Terraform components. The three types are providers, modules, and policy libraries (Sentinel).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;9. What is the difference between Terraform Cloud and Terraform Enterprise?&lt;/strong&gt;&lt;br&gt;
Terraform Cloud is HashiCorp's SaaS offering. Terraform Enterprise is the self hosted version that runs in your own infrastructure for air gapped or compliance heavy environments.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;10. When a module uses &lt;code&gt;configuration_aliases&lt;/code&gt;, what problem does it solve?&lt;/strong&gt;&lt;br&gt;
It solves the problem of a module needing to use multiple configurations of the same provider, such as creating resources in both us-east-1 and us-west-1 using different aliases of the AWS provider.&lt;/p&gt;

&lt;p&gt;I answered all ten correctly without hesitation. I am ready for the exam.&lt;/p&gt;

&lt;h2&gt;
  
  
  Exam Logistics
&lt;/h2&gt;

&lt;p&gt;My exam is booked for Saturday, 27th May 2024 at 10:00 AM local time. It will be online proctored through the HashiCorp portal.&lt;/p&gt;

&lt;p&gt;I have completed the following:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Registered at hashicorp.com/certification&lt;/li&gt;
&lt;li&gt;Tested my webcam and microphone&lt;/li&gt;
&lt;li&gt;Cleared my desk&lt;/li&gt;
&lt;li&gt;Prepared my government ID&lt;/li&gt;
&lt;li&gt;Read all exam policies&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;My score will appear in my Credly account within 24 hours of completion.&lt;/p&gt;

&lt;h2&gt;
  
  
  30 Day Reflection
&lt;/h2&gt;

&lt;p&gt;The challenge asked me to answer three questions honestly. Here is what I wrote.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What changed?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Not what I learned. What actually changed.&lt;/p&gt;

&lt;p&gt;I used to think infrastructure was just servers and networks and maybe some load balancers. Now I know infrastructure is code that demands the same discipline as application code. Version control. Automated testing. Code review. CI/CD pipelines. These are not optional extras for infrastructure. They are the bare minimum.&lt;/p&gt;

&lt;p&gt;What changed is my instinct. When I see a manual server setup now, I do not think "that is fine for now." I think "that should be a module." I have internalized that automation is not about saving time today. It is about eliminating entire categories of human error forever. I no longer trust manual processes. I trust code that has been planned, applied, and tested.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What am I most proud of?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Day 19.&lt;/p&gt;

&lt;p&gt;I built a complete three tier application deployment using modules I wrote myself. A VPC module. A compute module. A database module. A load balancer module. I wired them all together and ran &lt;code&gt;terraform apply&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;I watched 47 resources create in the correct order. No errors. First try.&lt;/p&gt;

&lt;p&gt;That was not luck. That was understanding dependency graphs, module composition, and Terraform's execution model well enough to predict exactly what would happen before it happened. That is the moment I stopped being someone learning Terraform and became someone who knows Terraform.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What comes next?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I am joining a small team building a data pipeline platform on AWS. They currently manage infrastructure with bash scripts and manual CloudFormation.&lt;/p&gt;

&lt;p&gt;My first project is to migrate their development environment to Terraform. I will implement remote state with DynamoDB locking. I will set up a CI pipeline that runs &lt;code&gt;terraform validate&lt;/code&gt; and &lt;code&gt;terraform plan&lt;/code&gt; on every pull request. Then I will train the team on the workflow.&lt;/p&gt;

&lt;p&gt;The certification is proof of knowledge. The migration is proof of value.&lt;/p&gt;

&lt;h2&gt;
  
  
  A Message to Future Participants
&lt;/h2&gt;

&lt;p&gt;If you are reading this and considering starting the 30-Day Terraform Challenge, here is what I wish someone had told me on Day 1:&lt;/p&gt;

&lt;p&gt;Do not skip the labs.&lt;/p&gt;

&lt;p&gt;Watching videos and reading documentation feels productive. It is not the same as running &lt;code&gt;terraform destroy&lt;/code&gt; on accident and learning why state management matters. Make your own mistakes. Break things in a development environment. Fix them. Break them again.&lt;/p&gt;

&lt;p&gt;The exam tests your knowledge. The challenge builds your capability. They are not the same thing.&lt;/p&gt;

&lt;p&gt;Also, the &lt;code&gt;terraform plan&lt;/code&gt; output is your best teacher. Read every line. Understand why every plus and minus is there. If you cannot explain a planned change, do not apply it. That discipline will serve you longer than any certification.&lt;/p&gt;

&lt;h2&gt;
  
  
  Acknowledgments
&lt;/h2&gt;

&lt;p&gt;This challenge was brought to you by AWS AI/ML UserGroup Kenya, Meru HashiCorp User Group, and EveOps. Thank you for making this happen.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Comes Next For Me
&lt;/h2&gt;

&lt;p&gt;I will take the Terraform Associate certification exam on Saturday. Then I will start that migration project. And then I will keep building.&lt;/p&gt;

&lt;p&gt;Terraform is not the end of my learning journey. It is the foundation.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Day 30 complete.&lt;/strong&gt; Five practice exams. 30 days of builds. Modules, state management, testing, CI/CD, and a full certification prep program.&lt;/p&gt;

&lt;p&gt;Now I go pass that exam.&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>devops</category>
      <category>learning</category>
      <category>terraform</category>
    </item>
    <item>
      <title>Fine-tuning My Terraform Exam Prep with Practice Exams</title>
      <dc:creator>Stephanie Makori</dc:creator>
      <pubDate>Tue, 21 Apr 2026 17:27:57 +0000</pubDate>
      <link>https://dev.to/stephanie_makori_845bb2c0/fine-tuning-my-terraform-exam-prep-with-practice-exams-l7i</link>
      <guid>https://dev.to/stephanie_makori_845bb2c0/fine-tuning-my-terraform-exam-prep-with-practice-exams-l7i</guid>
      <description>&lt;h1&gt;
  
  
  Day 29 of My 30-Day Terraform Challenge
&lt;/h1&gt;

&lt;p&gt;Day 29 of my 30-Day Terraform Challenge was focused on measuring how ready I am for the Terraform Associate certification exam. I completed two more full practice exams under timed conditions and compared the results with yesterday's scores to identify my remaining weak areas.&lt;/p&gt;

&lt;h2&gt;
  
  
  Practice Exam Progress
&lt;/h2&gt;

&lt;p&gt;Here is the score trend across all four exams:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Exam&lt;/th&gt;
&lt;th&gt;Score&lt;/th&gt;
&lt;th&gt;Percentage&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Exam 1&lt;/td&gt;
&lt;td&gt;41/57&lt;/td&gt;
&lt;td&gt;72%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Exam 2&lt;/td&gt;
&lt;td&gt;46/57&lt;/td&gt;
&lt;td&gt;81%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Exam 3&lt;/td&gt;
&lt;td&gt;47/57&lt;/td&gt;
&lt;td&gt;82%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Exam 4&lt;/td&gt;
&lt;td&gt;49/57&lt;/td&gt;
&lt;td&gt;86%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The results showed steady improvement in both speed and accuracy. Scoring above the passing mark in all four exams gave me confidence that my understanding is improving, but it also highlighted a few areas where I still need review.&lt;/p&gt;

&lt;h2&gt;
  
  
  Persistent Weak Areas
&lt;/h2&gt;

&lt;p&gt;After reviewing the wrong answers across all four exams, I found that the same topics kept appearing:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Terraform state management&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Terraform import&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Workspace behavior&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Provider version constraints&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;One of the most common mistakes was confusing &lt;code&gt;terraform state rm&lt;/code&gt; with &lt;code&gt;terraform destroy&lt;/code&gt;. I now understand that &lt;code&gt;terraform state rm&lt;/code&gt; only removes the resource from Terraform state tracking, while &lt;code&gt;terraform destroy&lt;/code&gt; removes the actual infrastructure resource.&lt;/p&gt;

&lt;p&gt;I also clarified that &lt;code&gt;terraform import&lt;/code&gt; adds resources to the state file but does not create the Terraform configuration, which means &lt;code&gt;terraform plan&lt;/code&gt; may still show changes after importing.&lt;/p&gt;

&lt;h2&gt;
  
  
  Hands-On Revision
&lt;/h2&gt;

&lt;p&gt;To strengthen those weak areas, I practiced the commands directly:&lt;/p&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
bash
terraform state list
terraform state show random_id.test
terraform state rm random_id.test
terraform workspace new dev
terraform workspace list
terraform workspace show
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

</description>
      <category>devjournal</category>
      <category>devops</category>
      <category>learning</category>
      <category>terraform</category>
    </item>
    <item>
      <title>How I Prepared for the Terraform Associate Exam with Practice Questions</title>
      <dc:creator>Stephanie Makori</dc:creator>
      <pubDate>Tue, 21 Apr 2026 16:12:19 +0000</pubDate>
      <link>https://dev.to/stephanie_makori_845bb2c0/how-i-prepared-for-the-terraform-associate-exam-with-practice-questions-1jho</link>
      <guid>https://dev.to/stephanie_makori_845bb2c0/how-i-prepared-for-the-terraform-associate-exam-with-practice-questions-1jho</guid>
      <description>&lt;p&gt;As part of my 30-Day Terraform Challenge, Day 28 was all about simulating the real exam environment using timed practice exams and using the results to strengthen weak areas before exam day.&lt;/p&gt;

&lt;p&gt;I completed &lt;strong&gt;two full 57-question Terraform Associate practice exams&lt;/strong&gt;, each under a &lt;strong&gt;60-minute time limit&lt;/strong&gt;, with no reference materials allowed during the session.&lt;/p&gt;

&lt;h2&gt;
  
  
  Practice Exam Results
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Practice Exam 1:&lt;/strong&gt; 41/57 (&lt;strong&gt;72%&lt;/strong&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Practice Exam 2:&lt;/strong&gt; 46/57 (&lt;strong&gt;81%&lt;/strong&gt;)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The second exam score was better than the first, which showed that once I settled into the pace and question style, my performance improved. It also highlighted how important warm-up and time management are before the actual certification exam.&lt;/p&gt;

&lt;h2&gt;
  
  
  Weak Areas Identified
&lt;/h2&gt;

&lt;p&gt;After reviewing both exams, I found that my weakest domains were:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Terraform Modules&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;State Management&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Terraform Cloud&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These sections had the lowest accuracy because the questions were scenario-based and required understanding Terraform behavior rather than memorizing commands.&lt;/p&gt;

&lt;p&gt;For example, I missed questions on:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;the behavior of &lt;code&gt;terraform state rm&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;how child modules receive variables&lt;/li&gt;
&lt;li&gt;what Terraform Cloud workspaces manage&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Reviewing Wrong Answers
&lt;/h2&gt;

&lt;p&gt;Instead of just checking the correct answer, I reviewed &lt;em&gt;why&lt;/em&gt; I got each question wrong. This helped me identify reasoning mistakes.&lt;/p&gt;

&lt;p&gt;One example was misunderstanding &lt;code&gt;terraform state rm&lt;/code&gt;. I initially thought it destroyed the resource, but it only removes the resource from the Terraform state file while leaving the infrastructure intact.&lt;/p&gt;

&lt;p&gt;This kind of review made the concepts much clearer than simply rereading notes.&lt;/p&gt;

&lt;h2&gt;
  
  
  Hands-On Reinforcement
&lt;/h2&gt;

&lt;p&gt;To close the gaps, I practiced the commands I struggled with:&lt;/p&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
bash
terraform state list
terraform state show aws_instance.web
terraform state mv aws_instance.web aws_instance.app
terraform state rm aws_instance.app
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

</description>
      <category>devchallenge</category>
      <category>devops</category>
      <category>learning</category>
      <category>terraform</category>
    </item>
    <item>
      <title>Building a 3-Tier Multi-Region High Availability Architecture with Terraform</title>
      <dc:creator>Stephanie Makori</dc:creator>
      <pubDate>Fri, 17 Apr 2026 06:17:36 +0000</pubDate>
      <link>https://dev.to/stephanie_makori_845bb2c0/building-a-3-tier-multi-region-high-availability-architecture-with-terraform-1l82</link>
      <guid>https://dev.to/stephanie_makori_845bb2c0/building-a-3-tier-multi-region-high-availability-architecture-with-terraform-1l82</guid>
      <description>&lt;p&gt;High availability is one of the most important goals when designing cloud infrastructure. In a production environment, deploying resources in a single region is not enough because a regional outage can make the entire application unavailable. To solve this, I built a &lt;strong&gt;3-tier multi-region high availability architecture on AWS using Terraform&lt;/strong&gt;, designed to remain available even if one AWS region fails.&lt;/p&gt;

&lt;p&gt;This infrastructure consists of five reusable Terraform modules that provision networking, load balancing, compute, database, and DNS failover resources across two AWS regions. The result is a resilient architecture where traffic automatically shifts to a secondary region if the primary region becomes unhealthy.&lt;/p&gt;

&lt;h2&gt;
  
  
  Architecture Overview
&lt;/h2&gt;

&lt;p&gt;The infrastructure follows a standard &lt;strong&gt;3-tier architecture&lt;/strong&gt;:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Presentation Tier&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Route53 directs traffic to an Application Load Balancer (ALB) in the active region.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Application Tier&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
EC2 instances are managed by an Auto Scaling Group (ASG) across multiple Availability Zones.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Database Tier&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Amazon RDS runs in Multi-AZ mode in the primary region with a cross-region read replica in the secondary region.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Traffic flows like this:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Route53 → ALB → EC2 Auto Scaling Group → RDS&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This design ensures redundancy at every layer. If one Availability Zone fails, traffic is served from another AZ. If the primary region fails, Route53 automatically redirects traffic to the secondary region.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Use Five Terraform Modules?
&lt;/h2&gt;

&lt;p&gt;To keep the infrastructure maintainable and reusable, I split the deployment into five Terraform modules:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;VPC Module&lt;/strong&gt; provisions networking resources such as VPCs, public/private subnets, route tables, internet gateways, and NAT gateways.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;ALB Module&lt;/strong&gt; provisions the Application Load Balancer, listeners, target groups, and ALB security groups.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;ASG Module&lt;/strong&gt; provisions launch templates, EC2 instances, scaling policies, alarms, and instance security groups.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;RDS Module&lt;/strong&gt; provisions the Multi-AZ primary database and cross-region replica.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Route53 Module&lt;/strong&gt; provisions health checks and failover DNS records.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Using modules avoids duplicating code and allows each infrastructure component to manage a single responsibility. This also makes troubleshooting easier because changes can be isolated to one module without affecting the others.&lt;/p&gt;

&lt;h2&gt;
  
  
  Data Flow Between Modules
&lt;/h2&gt;

&lt;p&gt;One of the biggest advantages of modular Terraform is how &lt;strong&gt;outputs from one module become inputs to another&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;For example, the ALB module creates a target group and exports its ARN. That ARN is then passed to the ASG module so the EC2 instances register with the load balancer target group.&lt;/p&gt;

&lt;p&gt;Similarly, the RDS primary database module exports its database ARN, which is passed into the secondary region RDS module as the replication source. This creates a cross-region read replica.&lt;/p&gt;

&lt;p&gt;This flow creates a dependency chain:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;VPC outputs → ALB inputs → ASG inputs → RDS inputs → Route53 inputs&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This keeps the root Terraform configuration clean while each module handles its own internal complexity.&lt;/p&gt;

&lt;h2&gt;
  
  
  Route53 Failover in Action
&lt;/h2&gt;

&lt;p&gt;A major feature of this architecture is &lt;strong&gt;automatic DNS failover&lt;/strong&gt; using Route53 health checks.&lt;/p&gt;

&lt;p&gt;Route53 continuously checks the health of the primary region ALB endpoint. If the primary region fails health checks, Route53 marks it unhealthy and redirects DNS traffic to the ALB in the secondary region.&lt;/p&gt;

&lt;p&gt;The failover process works like this:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Route53 detects the failed health check in the primary region&lt;/li&gt;
&lt;li&gt;DNS failover policy marks the primary record unhealthy&lt;/li&gt;
&lt;li&gt;Traffic is routed to the secondary ALB&lt;/li&gt;
&lt;li&gt;Users continue accessing the application with minimal downtime&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This failover typically takes about &lt;strong&gt;1 to 2 minutes&lt;/strong&gt;, depending on DNS TTL and health check intervals.&lt;/p&gt;

&lt;p&gt;This approach provides automatic disaster recovery without manual intervention.&lt;/p&gt;

&lt;h2&gt;
  
  
  Multi-AZ vs Cross-Region Replication
&lt;/h2&gt;

&lt;p&gt;The database layer uses both &lt;strong&gt;Multi-AZ&lt;/strong&gt; and &lt;strong&gt;cross-region replication&lt;/strong&gt;, but they serve different purposes.&lt;/p&gt;

&lt;h3&gt;
  
  
  Multi-AZ
&lt;/h3&gt;

&lt;p&gt;Multi-AZ creates a standby database in another Availability Zone within the same region. If the primary database instance fails, AWS automatically promotes the standby.&lt;/p&gt;

&lt;p&gt;This protects against:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;AZ failures&lt;/li&gt;
&lt;li&gt;hardware failures&lt;/li&gt;
&lt;li&gt;maintenance downtime&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Cross-Region Read Replica
&lt;/h3&gt;

&lt;p&gt;Cross-region replication copies data asynchronously to another AWS region.&lt;/p&gt;

&lt;p&gt;This protects against:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;regional outages&lt;/li&gt;
&lt;li&gt;disaster recovery scenarios&lt;/li&gt;
&lt;li&gt;geographic redundancy needs&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Together, these strategies provide both &lt;strong&gt;high availability&lt;/strong&gt; and &lt;strong&gt;regional resilience&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Benefits of This Architecture
&lt;/h2&gt;

&lt;p&gt;This deployment provided several important benefits:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;High availability&lt;/strong&gt; through Multi-AZ EC2 and RDS deployment&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Disaster recovery&lt;/strong&gt; through cross-region redundancy&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Automatic failover&lt;/strong&gt; using Route53 health checks&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Scalability&lt;/strong&gt; through Auto Scaling Groups&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Reusability&lt;/strong&gt; through modular Terraform design&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Consistency&lt;/strong&gt; through infrastructure as code&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Instead of manually configuring resources in AWS, Terraform made it possible to define the entire infrastructure in reusable modules and deploy it consistently across regions.&lt;/p&gt;

&lt;h2&gt;
  
  
  Final Thoughts
&lt;/h2&gt;

&lt;p&gt;This project was an excellent demonstration of how Terraform modules can be combined to build a &lt;strong&gt;production-style multi-region high availability architecture&lt;/strong&gt; on AWS.&lt;/p&gt;

&lt;p&gt;By separating the infrastructure into reusable modules and wiring them together with outputs and inputs, I created an environment that is scalable, fault tolerant, and easy to manage.&lt;/p&gt;

&lt;p&gt;The most valuable takeaway from this project was understanding how &lt;strong&gt;Route53 failover, Auto Scaling Groups, Multi-AZ RDS, and cross-region replicas&lt;/strong&gt; work together to provide resilience at every layer of the application stack.&lt;/p&gt;

&lt;p&gt;This is the kind of architecture that forms the foundation for real-world production systems where uptime and fault tolerance are critical.&lt;/p&gt;

</description>
      <category>architecture</category>
      <category>aws</category>
      <category>devops</category>
      <category>terraform</category>
    </item>
    <item>
      <title>Building a Scalable Web Application on AWS with EC2, ALB, and Auto Scaling using Terraform</title>
      <dc:creator>Stephanie Makori</dc:creator>
      <pubDate>Thu, 16 Apr 2026 16:54:34 +0000</pubDate>
      <link>https://dev.to/stephanie_makori_845bb2c0/building-a-scalable-web-application-on-aws-with-ec2-alb-and-auto-scaling-using-terraform-31h1</link>
      <guid>https://dev.to/stephanie_makori_845bb2c0/building-a-scalable-web-application-on-aws-with-ec2-alb-and-auto-scaling-using-terraform-31h1</guid>
      <description>&lt;p&gt;On Day 26 of the Terraform Challenge, I moved from deploying static infrastructure to building a scalable web application architecture on AWS using Terraform. This project brought together EC2 Launch Templates, an Application Load Balancer, an Auto Scaling Group, and CloudWatch alarms into a modular infrastructure design that can automatically respond to changes in demand.&lt;/p&gt;

&lt;p&gt;This was one of the most practical labs in the challenge because it demonstrated how multiple Terraform modules can work together to create a production-style environment where traffic is distributed across healthy instances and scaling decisions happen automatically.&lt;/p&gt;

&lt;h2&gt;
  
  
  Project Architecture
&lt;/h2&gt;

&lt;p&gt;The infrastructure was split into three reusable Terraform modules:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;EC2 Module&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
This module created the launch template and security group for the web application instances.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;ALB Module&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
This module provisioned the Application Load Balancer, listener, target group, and the ALB security group.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;ASG Module&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
This module created the Auto Scaling Group, attached instances to the ALB target group, and configured CPU-based scaling policies with CloudWatch alarms.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;By separating the resources into modules, the deployment stayed organized and reusable. Each module focused on one responsibility, and outputs from one module were passed as inputs to another.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Modular Design Matters
&lt;/h2&gt;

&lt;p&gt;Instead of placing all AWS resources in one Terraform file, I separated them into modules so that each part of the infrastructure could be reused independently.&lt;/p&gt;

&lt;p&gt;For example:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The &lt;strong&gt;EC2 module&lt;/strong&gt; outputs the launch template ID&lt;/li&gt;
&lt;li&gt;The &lt;strong&gt;ALB module&lt;/strong&gt; outputs the target group ARN&lt;/li&gt;
&lt;li&gt;The &lt;strong&gt;ASG module&lt;/strong&gt; consumes both outputs to launch instances and attach them behind the load balancer&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This modular structure keeps the environment configuration clean and makes it easier to maintain or expand the infrastructure later.&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;envs/dev&lt;/code&gt; configuration only needed to define environment-specific variables like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;AMI ID&lt;/li&gt;
&lt;li&gt;desired capacity&lt;/li&gt;
&lt;li&gt;subnet IDs&lt;/li&gt;
&lt;li&gt;VPC ID&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;All the infrastructure logic remained inside the modules.&lt;/p&gt;

&lt;h2&gt;
  
  
  Deployment Workflow
&lt;/h2&gt;

&lt;p&gt;After building the modules, I deployed the infrastructure using the normal Terraform workflow:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;code&gt;terraform init&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;terraform validate&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;terraform plan&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;terraform apply&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Terraform created:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;EC2 Launch Template&lt;/li&gt;
&lt;li&gt;Application Load Balancer&lt;/li&gt;
&lt;li&gt;Target Group&lt;/li&gt;
&lt;li&gt;Auto Scaling Group&lt;/li&gt;
&lt;li&gt;CPU scale-out and scale-in policies&lt;/li&gt;
&lt;li&gt;CloudWatch alarms&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;After deployment, Terraform returned the ALB DNS endpoint, which served as the public URL for the application.&lt;/p&gt;

&lt;p&gt;When I opened the ALB URL in the browser, the application returned:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Deployed with Terraform — environment: dev&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This confirmed that:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;the EC2 instances launched successfully&lt;/li&gt;
&lt;li&gt;the load balancer was routing traffic correctly&lt;/li&gt;
&lt;li&gt;the Auto Scaling Group registered healthy targets&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  How Auto Scaling Works
&lt;/h2&gt;

&lt;p&gt;The Auto Scaling Group was configured with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;minimum capacity:&lt;/strong&gt; 1 instance&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;desired capacity:&lt;/strong&gt; 2 instances&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;maximum capacity:&lt;/strong&gt; 4 instances&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;CloudWatch alarms monitored average CPU utilization:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;If CPU reached &lt;strong&gt;70%&lt;/strong&gt;, Terraform triggered a &lt;strong&gt;scale-out policy&lt;/strong&gt; to add one instance&lt;/li&gt;
&lt;li&gt;If CPU dropped to &lt;strong&gt;30%&lt;/strong&gt;, Terraform triggered a &lt;strong&gt;scale-in policy&lt;/strong&gt; to remove one instance&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This creates elasticity in the infrastructure, allowing the application to handle increased load while reducing costs during low usage.&lt;/p&gt;

&lt;p&gt;One important configuration in the Auto Scaling Group was:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;health_check_type = "ELB"&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;This setting ensures that scaling decisions are based on the Application Load Balancer health checks rather than only EC2 instance status.&lt;/p&gt;

&lt;p&gt;Without it, an EC2 instance could remain "healthy" from AWS's perspective even if the web server application had failed. Using ELB health checks ensures only working instances receive traffic.&lt;/p&gt;

&lt;h2&gt;
  
  
  Benefits of This Architecture
&lt;/h2&gt;

&lt;p&gt;This infrastructure design provides several key advantages:&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;1. High Availability&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;The Application Load Balancer distributes requests across multiple instances, reducing the risk of downtime.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;2. Elastic Scaling&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;The Auto Scaling Group increases or decreases capacity based on CPU demand automatically.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;3. Modular Reusability&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Each module can be reused in other environments such as staging or production.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;4. Maintainability&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Because the modules are separated by function, updates can be made without affecting unrelated components.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;5. Cost Efficiency&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Scaling policies ensure resources are only added when needed.&lt;/p&gt;

&lt;h2&gt;
  
  
  Cleanup
&lt;/h2&gt;

&lt;p&gt;Once the deployment was verified, I ran:&lt;/p&gt;

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

&lt;p&gt;This removed the Auto Scaling Group, load balancer, target group, launch template, and CloudWatch alarms.&lt;/p&gt;

&lt;p&gt;Cleaning up after testing is important because EC2 instances and ALBs continue incurring charges if left running.&lt;/p&gt;

&lt;h2&gt;
  
  
  Final Thoughts
&lt;/h2&gt;

&lt;p&gt;This project was a major step forward in understanding how scalable infrastructure is built on AWS with Terraform.&lt;/p&gt;

&lt;p&gt;It was not just about provisioning EC2 instances, but about connecting multiple services into a self-managing system:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Launch Templates define compute&lt;/li&gt;
&lt;li&gt;ALB distributes traffic&lt;/li&gt;
&lt;li&gt;ASG manages instance count&lt;/li&gt;
&lt;li&gt;CloudWatch triggers scaling actions&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The biggest lesson was understanding how Terraform modules can model real infrastructure relationships while keeping the code reusable and organized.&lt;/p&gt;

&lt;p&gt;This project felt like the first truly production-style deployment in the challenge, combining modularity, scalability, automation, and resilience into one infrastructure workflow.&lt;/p&gt;

&lt;p&gt;Day 26 showed how Infrastructure as Code moves beyond provisioning resources into designing systems that can adapt automatically to real demand.&lt;/p&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;

</description>
      <category>automation</category>
      <category>aws</category>
      <category>devops</category>
      <category>terraform</category>
    </item>
    <item>
      <title>Deploying a Static Website on AWS S3 with Terraform: A Beginner’s Guide</title>
      <dc:creator>Stephanie Makori</dc:creator>
      <pubDate>Wed, 15 Apr 2026 09:23:42 +0000</pubDate>
      <link>https://dev.to/stephanie_makori_845bb2c0/deploying-a-static-website-on-aws-s3-with-terraform-a-beginners-guide-koi</link>
      <guid>https://dev.to/stephanie_makori_845bb2c0/deploying-a-static-website-on-aws-s3-with-terraform-a-beginners-guide-koi</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;In this project, I deployed a fully functional static website using AWS S3 and CloudFront with Terraform. The goal was to apply everything learned throughout the Terraform challenge, including modular design, environment separation, remote state, and Infrastructure as Code best practices.&lt;/p&gt;

&lt;p&gt;This project represents a complete real-world workflow where infrastructure is defined, reviewed, deployed, and destroyed in a controlled and repeatable manner.&lt;/p&gt;




&lt;h2&gt;
  
  
  Project Overview
&lt;/h2&gt;

&lt;p&gt;The architecture of the solution follows a simple but powerful flow:&lt;/p&gt;

&lt;p&gt;User requests website → CloudFront distributes content globally → S3 bucket serves static files&lt;/p&gt;

&lt;h3&gt;
  
  
  Key Components
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;S3 bucket for static website hosting&lt;/li&gt;
&lt;li&gt;CloudFront distribution for global content delivery and HTTPS support&lt;/li&gt;
&lt;li&gt;Terraform module for reusable infrastructure design&lt;/li&gt;
&lt;li&gt;Environment-based configuration for dev deployment&lt;/li&gt;
&lt;li&gt;Remote backend for state management and locking&lt;/li&gt;
&lt;/ul&gt;




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

&lt;p&gt;The project was organized using a modular approach:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A modules directory containing reusable infrastructure logic for the static website&lt;/li&gt;
&lt;li&gt;An envs directory containing environment-specific configurations&lt;/li&gt;
&lt;li&gt;A backend configuration for remote state storage&lt;/li&gt;
&lt;li&gt;A provider configuration for AWS setup&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This structure ensures a clear separation between reusable infrastructure components and environment-specific deployment settings.&lt;/p&gt;




&lt;h2&gt;
  
  
  Module Design Decisions
&lt;/h2&gt;

&lt;p&gt;The module was designed to encapsulate all infrastructure complexity related to the static website.&lt;/p&gt;

&lt;h3&gt;
  
  
  Key design choices:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;The bucket name is required with no default because it must be globally unique in AWS&lt;/li&gt;
&lt;li&gt;The environment variable is restricted to predefined values to prevent misconfiguration&lt;/li&gt;
&lt;li&gt;Tags are optional to allow flexibility while still supporting cost tracking and resource organization&lt;/li&gt;
&lt;li&gt;Default values are used for index and error documents because most static websites follow standard conventions&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The module also centralizes tagging, security configuration, and CloudFront setup to ensure consistency across deployments.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why Modules Were Used
&lt;/h2&gt;

&lt;p&gt;Modules were introduced to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Avoid duplication of infrastructure code&lt;/li&gt;
&lt;li&gt;Promote reusability across environments&lt;/li&gt;
&lt;li&gt;Improve maintainability of the codebase&lt;/li&gt;
&lt;li&gt;Enforce consistent architecture patterns&lt;/li&gt;
&lt;li&gt;Support scaling to multiple environments such as staging and production&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Without modules, each environment would require repeated configuration, increasing the risk of inconsistency and errors.&lt;/p&gt;




&lt;h2&gt;
  
  
  Calling Configuration (Dev Environment)
&lt;/h2&gt;

&lt;p&gt;The dev environment configuration acts as a lightweight wrapper around the module.&lt;/p&gt;

&lt;p&gt;It only defines:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The bucket name&lt;/li&gt;
&lt;li&gt;The environment type&lt;/li&gt;
&lt;li&gt;Any overrides for defaults&lt;/li&gt;
&lt;li&gt;Basic tagging information&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;All infrastructure logic remains inside the module, keeping the environment configuration clean and easy to manage.&lt;/p&gt;




&lt;h2&gt;
  
  
  Deployment Workflow
&lt;/h2&gt;

&lt;p&gt;The deployment followed a structured Terraform workflow:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Initialization of the working directory and backend configuration&lt;/li&gt;
&lt;li&gt;Validation of configuration correctness&lt;/li&gt;
&lt;li&gt;Planning of infrastructure changes to preview modifications&lt;/li&gt;
&lt;li&gt;Application of the planned changes to create real AWS resources&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Each step ensured that infrastructure changes were predictable and reviewable before being applied.&lt;/p&gt;




&lt;h2&gt;
  
  
  Deployment Output
&lt;/h2&gt;

&lt;p&gt;After successful execution, Terraform output provided a CloudFront distribution domain.&lt;/p&gt;

&lt;p&gt;This domain represents the live endpoint of the deployed static website, served globally through AWS edge locations.&lt;/p&gt;

&lt;p&gt;The deployment confirmed that:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;S3 bucket was created and configured correctly&lt;/li&gt;
&lt;li&gt;CloudFront distribution was provisioned successfully&lt;/li&gt;
&lt;li&gt;Static website content was accessible via HTTPS&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Live Website Confirmation
&lt;/h2&gt;

&lt;p&gt;The deployed website was successfully accessed using the CloudFront URL.&lt;/p&gt;

&lt;p&gt;The site displayed:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A simple static HTML page&lt;/li&gt;
&lt;li&gt;A confirmation message indicating deployment via Terraform&lt;/li&gt;
&lt;li&gt;Dynamic values such as environment and bucket information&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This confirmed that both S3 and CloudFront were correctly integrated.&lt;/p&gt;




&lt;h2&gt;
  
  
  Cleanup Process
&lt;/h2&gt;

&lt;p&gt;After verification, all infrastructure was destroyed using Terraform destroy.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;No unnecessary AWS costs were incurred&lt;/li&gt;
&lt;li&gt;All resources were properly removed&lt;/li&gt;
&lt;li&gt;State was updated to reflect the destroyed infrastructure&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This step reinforces the importance of infrastructure lifecycle management in real-world environments.&lt;/p&gt;




&lt;h2&gt;
  
  
  DRY Principle in Practice
&lt;/h2&gt;

&lt;p&gt;The DRY (Don’t Repeat Yourself) principle was applied through module usage.&lt;/p&gt;

&lt;p&gt;Instead of repeating S3 and CloudFront configurations across environments:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;All logic was centralized in a single module&lt;/li&gt;
&lt;li&gt;Environments only supplied configuration values&lt;/li&gt;
&lt;li&gt;Infrastructure changes could be made in one place and applied everywhere&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This significantly reduces complexity and improves long-term maintainability.&lt;/p&gt;




&lt;h2&gt;
  
  
  Key Learnings
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;CloudFront requires propagation time before the site becomes fully available globally&lt;/li&gt;
&lt;li&gt;S3 static websites require careful configuration of public access policies&lt;/li&gt;
&lt;li&gt;Modules are essential for scalable infrastructure design&lt;/li&gt;
&lt;li&gt;Remote state improves collaboration and prevents configuration drift&lt;/li&gt;
&lt;li&gt;Terraform outputs are critical for validating successful deployments&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;This project demonstrates how Terraform transforms simple infrastructure into a scalable and maintainable system. A static website deployment becomes more than just hosting files; it becomes a fully automated, version-controlled, and reproducible cloud architecture.&lt;/p&gt;

&lt;p&gt;By combining S3, CloudFront, modules, and remote state, infrastructure is treated like software — predictable, reusable, and safe to evolve over time.&lt;/p&gt;

</description>
      <category>aws</category>
      <category>beginners</category>
      <category>devops</category>
      <category>terraform</category>
    </item>
    <item>
      <title>My Final Preparation for the Terraform Associate Exam</title>
      <dc:creator>Stephanie Makori</dc:creator>
      <pubDate>Wed, 15 Apr 2026 05:43:19 +0000</pubDate>
      <link>https://dev.to/stephanie_makori_845bb2c0/my-final-preparation-for-the-terraform-associate-exam-ie8</link>
      <guid>https://dev.to/stephanie_makori_845bb2c0/my-final-preparation-for-the-terraform-associate-exam-ie8</guid>
      <description>&lt;p&gt;After 24 days of consistent hands-on practice and study, I shifted fully into exam preparation mode. This stage was not about learning new tools, but about refining precision and confidence under pressure.&lt;/p&gt;

&lt;h2&gt;
  
  
  Exam Simulation Results
&lt;/h2&gt;

&lt;p&gt;I completed a full 60-minute simulation with 57 questions and scored &lt;strong&gt;44 out of 57 (77%)&lt;/strong&gt;. This gave me a realistic view of my readiness. While the score is above the passing mark, it exposed specific weak areas that needed focused attention.&lt;/p&gt;

&lt;p&gt;The main gaps were:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Terraform CLI edge cases&lt;/li&gt;
&lt;li&gt;State management scenarios&lt;/li&gt;
&lt;li&gt;Terraform Cloud features&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Most mistakes came from confusing similar commands and misunderstanding how state behaves in real situations.&lt;/p&gt;

&lt;h2&gt;
  
  
  Focus Areas and Improvements
&lt;/h2&gt;

&lt;p&gt;I spent time drilling the highest-weight domains:&lt;/p&gt;

&lt;h3&gt;
  
  
  Terraform Basics
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Clear understanding of &lt;strong&gt;state as the source of truth&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Difference between &lt;strong&gt;resources and data sources&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Proper use of lifecycle rules like &lt;code&gt;prevent_destroy&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Terraform CLI
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Knowing exactly what each command does in practice&lt;/li&gt;
&lt;li&gt;Understanding flags like &lt;code&gt;-target&lt;/code&gt; and &lt;code&gt;-auto-approve&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Distinguishing between &lt;code&gt;apply&lt;/code&gt;, &lt;code&gt;destroy&lt;/code&gt;, and &lt;code&gt;refresh-only&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Infrastructure as Code Concepts
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Idempotency ensures consistent results&lt;/li&gt;
&lt;li&gt;Declarative approach defines desired state&lt;/li&gt;
&lt;li&gt;Drift detection highlights real vs expected infrastructure differences&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Terraform Purpose
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Provider-agnostic design&lt;/li&gt;
&lt;li&gt;Workflow: &lt;strong&gt;Write → Plan → Apply&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Importance of state in tracking infrastructure&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Common Exam Traps
&lt;/h2&gt;

&lt;p&gt;A few patterns stood out during practice:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;terraform state rm&lt;/code&gt; does not delete resources, only removes them from state&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;sensitive = true&lt;/code&gt; hides output but still stores values in state&lt;/li&gt;
&lt;li&gt;Using branch references instead of version tags breaks reproducibility&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  My Exam Strategy
&lt;/h2&gt;

&lt;p&gt;To stay efficient during the exam:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Spend no more than &lt;strong&gt;60–90 seconds per question&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Flag difficult questions and revisit later&lt;/li&gt;
&lt;li&gt;Eliminate wrong answers first to improve accuracy&lt;/li&gt;
&lt;li&gt;Pay close attention to keywords like &lt;em&gt;state&lt;/em&gt;, &lt;em&gt;destroy&lt;/em&gt;, and &lt;em&gt;drift&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;Follow instructions strictly for multi-select questions&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Final Thoughts
&lt;/h2&gt;

&lt;p&gt;This preparation phase helped me move from general understanding to precise execution. The biggest shift was learning to think in terms of Terraform’s behavior, not just memorizing commands.&lt;/p&gt;

&lt;p&gt;At this point, I am confident in both my knowledge and my approach. The goal is not just to pass the exam, but to truly understand how Terraform works in real-world scenarios.&lt;/p&gt;

&lt;p&gt;Next step: exam day.&lt;/p&gt;

</description>
      <category>career</category>
      <category>devops</category>
      <category>learning</category>
      <category>terraform</category>
    </item>
    <item>
      <title>Preparing for the Terraform Associate Exam: Key Resources and Tips</title>
      <dc:creator>Stephanie Makori</dc:creator>
      <pubDate>Mon, 13 Apr 2026 05:16:19 +0000</pubDate>
      <link>https://dev.to/stephanie_makori_845bb2c0/preparing-for-the-terraform-associate-exam-key-resources-and-tips-45mc</link>
      <guid>https://dev.to/stephanie_makori_845bb2c0/preparing-for-the-terraform-associate-exam-key-resources-and-tips-45mc</guid>
      <description>&lt;p&gt;As I move deeper into Terraform exam preparation, I realized that success is not just about building infrastructure, but about understanding how Terraform behaves under different scenarios. Day 23 focused on auditing my knowledge against the official exam domains and identifying gaps early enough to fix them before the exam.&lt;/p&gt;

&lt;p&gt;The first step was reviewing all exam domains and honestly rating my confidence level. I found that I am strongest in core Terraform concepts, modules, and general workflow, where I consistently operate in real projects. However, my weaker areas are Terraform CLI commands, state management, and Terraform Cloud internals. These are not difficult concepts, but they require deliberate hands on repetition rather than passive reading.&lt;/p&gt;

&lt;p&gt;One of the most important parts of my preparation is the Terraform CLI. Commands like plan, apply, init, state mv, state rm, and import are heavily tested. The exam does not only ask what they do, but also what happens to infrastructure when they are executed. This means understanding the difference between modifying state and modifying real resources is critical.&lt;/p&gt;

&lt;p&gt;I also reviewed non cloud providers such as random and local. These are often overlooked but appear frequently in exam questions because they test understanding of Terraform beyond AWS or cloud infrastructure.&lt;/p&gt;

&lt;p&gt;Based on my audit, I created a structured study plan focusing on three key areas: CLI commands, state management, and Terraform Cloud features. Each topic has a clear practice method such as running commands in a test environment or writing out scenarios from memory.&lt;/p&gt;

&lt;p&gt;The most valuable takeaway from this stage is that Terraform mastery is not about memorizing syntax. It is about understanding the lifecycle of infrastructure, especially how state connects configuration to real-world resources.&lt;/p&gt;

&lt;p&gt;Moving forward, my focus is repetition, practice questions, and reinforcing weak areas until they become automatic.&lt;/p&gt;

</description>
      <category>career</category>
      <category>devops</category>
      <category>learning</category>
      <category>terraform</category>
    </item>
    <item>
      <title>Putting It All Together: Application and Infrastructure Workflows with Terraform</title>
      <dc:creator>Stephanie Makori</dc:creator>
      <pubDate>Mon, 13 Apr 2026 04:50:48 +0000</pubDate>
      <link>https://dev.to/stephanie_makori_845bb2c0/putting-it-all-together-application-and-infrastructure-workflows-with-terraform-3c0e</link>
      <guid>https://dev.to/stephanie_makori_845bb2c0/putting-it-all-together-application-and-infrastructure-workflows-with-terraform-3c0e</guid>
      <description>&lt;p&gt;Over the past three weeks, I have moved from writing basic Terraform code to building a complete, production-ready workflow that combines application and infrastructure deployment into one unified system.&lt;/p&gt;

&lt;p&gt;The biggest takeaway is that &lt;strong&gt;Infrastructure as Code must follow the same discipline as software engineering&lt;/strong&gt;. Version control, testing, code reviews, and CI/CD pipelines are not optional. They are essential for safe and scalable infrastructure.&lt;/p&gt;

&lt;p&gt;In this final stage, I built an &lt;strong&gt;integrated CI pipeline&lt;/strong&gt; using GitHub Actions. Every pull request triggers formatting checks, validation, and a Terraform plan. That plan is saved as an immutable artifact, ensuring that what gets reviewed is exactly what gets applied. This removes uncertainty and prevents unexpected changes during deployment.&lt;/p&gt;

&lt;p&gt;I also implemented &lt;strong&gt;Sentinel policies&lt;/strong&gt; in Terraform Cloud to enforce rules across all deployments. Restricting instance types prevents costly mistakes, while mandatory tagging ensures every resource is traceable and properly managed. These policies act as guardrails, allowing teams to move quickly without compromising safety.&lt;/p&gt;

&lt;p&gt;Another key addition is the &lt;strong&gt;cost estimation gate&lt;/strong&gt;. Terraform Cloud calculates the expected monthly cost before deployment and blocks changes that exceed a defined threshold. This introduces financial accountability directly into the workflow.&lt;/p&gt;

&lt;p&gt;What makes this approach powerful is the concept of &lt;strong&gt;immutable infrastructure promotion&lt;/strong&gt;. Instead of rebuilding environments differently, the same reviewed Terraform plan is promoted across environments. This ensures consistency, reduces drift, and aligns infrastructure workflows with modern application deployment practices.&lt;/p&gt;

&lt;p&gt;Reflecting on this journey, the most important shift for me was thinking of infrastructure as a &lt;strong&gt;controlled, versioned system&lt;/strong&gt; rather than manual configuration. This mindset is what enables teams to scale safely and confidently.&lt;/p&gt;

&lt;p&gt;This is no longer just about writing Terraform. It is about building reliable systems.&lt;/p&gt;

</description>
      <category>cicd</category>
      <category>devops</category>
      <category>github</category>
      <category>terraform</category>
    </item>
    <item>
      <title>A Workflow for Deploying Infrastructure Code with Terraform</title>
      <dc:creator>Stephanie Makori</dc:creator>
      <pubDate>Sun, 12 Apr 2026 16:37:40 +0000</pubDate>
      <link>https://dev.to/stephanie_makori_845bb2c0/a-workflow-for-deploying-infrastructure-code-with-terraform-6f3</link>
      <guid>https://dev.to/stephanie_makori_845bb2c0/a-workflow-for-deploying-infrastructure-code-with-terraform-6f3</guid>
      <description>&lt;p&gt;Yesterday, I mapped the standard application deployment workflow. Today, I applied the same seven-step process to infrastructure code and the difference is clear: deploying infrastructure is not just riskier, it demands stricter discipline.&lt;/p&gt;

&lt;p&gt;I implemented a real change by adding a CloudWatch CPU alarm to a webserver instance using Terraform.&lt;/p&gt;

&lt;p&gt;The workflow began with &lt;strong&gt;version control&lt;/strong&gt;, enforcing protected branches and pull request reviews. This is familiar from application development, but far more critical when changes can affect live infrastructure.&lt;/p&gt;

&lt;p&gt;Next, I ran &lt;code&gt;terraform plan&lt;/code&gt; locally. This is where the workflows begin to diverge. Instead of running code, Terraform generates a &lt;strong&gt;diff against the current state&lt;/strong&gt;, showing exactly what will change. This step is non-negotiable because even a small misconfiguration can have a large impact.&lt;/p&gt;

&lt;p&gt;After creating a feature branch and committing the change, I opened a pull request and included the full plan output. Unlike application code reviews, this is not just about logic. Reviewers must evaluate &lt;strong&gt;cost, security, and potential blast radius&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Once approved, the change was merged and tagged. Deployment was then executed using a &lt;strong&gt;saved plan file&lt;/strong&gt;:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;terraform apply day21.tfplan&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;This ensures that what was reviewed is exactly what gets applied, eliminating drift between plan and execution.&lt;/p&gt;

&lt;p&gt;To make the workflow safe, I implemented key safeguards: plan file pinning, blast radius documentation, and approval gates for changes. I also explored Sentinel policies, which act as a guardrail by enforcing rules before any deployment can proceed.&lt;/p&gt;

&lt;p&gt;The biggest lesson is this: infrastructure deployments are not forgiving. Application failures can often be rolled back quickly. Infrastructure mistakes can cascade across systems.&lt;/p&gt;

&lt;p&gt;Infrastructure as Code only works at scale when it is treated with the same rigor as software engineering, plus an extra layer of caution.&lt;/p&gt;

</description>
      <category>automation</category>
      <category>aws</category>
      <category>devops</category>
      <category>terraform</category>
    </item>
    <item>
      <title>A Workflow for Deploying Application Code with Terraform</title>
      <dc:creator>Stephanie Makori</dc:creator>
      <pubDate>Sun, 12 Apr 2026 11:18:12 +0000</pubDate>
      <link>https://dev.to/stephanie_makori_845bb2c0/a-workflow-for-deploying-application-code-with-terraform-10i3</link>
      <guid>https://dev.to/stephanie_makori_845bb2c0/a-workflow-for-deploying-application-code-with-terraform-10i3</guid>
      <description>&lt;p&gt;Modern Infrastructure as Code becomes truly effective when it follows the same disciplined workflows used in application development. In this exercise, I mapped the standard seven step software delivery pipeline to a Terraform-based infrastructure workflow.&lt;/p&gt;

&lt;p&gt;The process begins with &lt;strong&gt;version control&lt;/strong&gt;, where all infrastructure code is stored in Git with a protected main branch. This ensures that no changes are applied directly without review, maintaining consistency and control across the system.&lt;/p&gt;

&lt;p&gt;Next, I worked &lt;strong&gt;locally&lt;/strong&gt; by modifying the application user data script to update the deployed web response to version 3. I validated this change using &lt;code&gt;terraform plan&lt;/code&gt;, which provides a safe preview of all infrastructure modifications before execution.&lt;/p&gt;

&lt;p&gt;A feature branch was created to isolate the change, and standard Git practices were followed for commit and push operations. This ensures traceability and clean collaboration.&lt;/p&gt;

&lt;p&gt;During the &lt;strong&gt;review stage&lt;/strong&gt;, a pull request was opened and the Terraform plan output was attached. This allows reviewers to assess infrastructure impact without needing to execute Terraform, improving both safety and transparency.&lt;/p&gt;

&lt;p&gt;Automated validation was handled through CI pipelines using GitHub Actions, ensuring that formatting and configuration checks passed before merging.&lt;/p&gt;

&lt;p&gt;Once approved, the change was merged into the main branch and tagged for version tracking. Deployment was then executed using &lt;code&gt;terraform apply&lt;/code&gt;, and the updated application was verified through the browser.&lt;/p&gt;

&lt;p&gt;Terraform Cloud enhanced this workflow by introducing remote state management, secure variable storage, and detailed audit logs. The private registry further enables reusable, versioned infrastructure modules across teams.&lt;/p&gt;

&lt;p&gt;The key insight from this exercise is that Infrastructure as Code must follow structured engineering workflows. When teams skip planning, review, or automation, they introduce unnecessary risk, drift, and instability.&lt;/p&gt;

&lt;p&gt;When properly implemented, Terraform transforms infrastructure into a predictable, versioned, and collaborative engineering system aligned with modern software delivery practices.&lt;/p&gt;

</description>
      <category>automation</category>
      <category>devops</category>
      <category>terraform</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Day 19 - Adopting Infrastructure as Code in Practice</title>
      <dc:creator>Stephanie Makori</dc:creator>
      <pubDate>Sun, 12 Apr 2026 10:30:25 +0000</pubDate>
      <link>https://dev.to/stephanie_makori_845bb2c0/day-19-adopting-infrastructure-as-code-in-practice-4ekd</link>
      <guid>https://dev.to/stephanie_makori_845bb2c0/day-19-adopting-infrastructure-as-code-in-practice-4ekd</guid>
      <description>&lt;p&gt;Infrastructure as Code (IaC) is often presented as a technical skill, but in real environments, it is primarily an &lt;strong&gt;adoption and culture problem&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Today focused on understanding how teams transition from manual infrastructure management to a fully version-controlled and automated approach using Terraform.&lt;/p&gt;




&lt;h2&gt;
  
  
  What I worked on
&lt;/h2&gt;

&lt;p&gt;I started by setting up a secure Terraform backend using an S3 bucket and DynamoDB for state locking. This ensured safe remote state management and collaboration.&lt;/p&gt;

&lt;p&gt;Next, I provisioned infrastructure using Terraform by creating an S3 bucket. This reinforced the standard workflow of:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Writing configuration&lt;/li&gt;
&lt;li&gt;Running &lt;code&gt;terraform plan&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Applying infrastructure changes safely&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I also practiced importing existing infrastructure using &lt;code&gt;terraform import&lt;/code&gt;, which demonstrated how real-world systems can be gradually brought under Terraform management without disruption.&lt;/p&gt;

&lt;p&gt;After importing, I verified the state using:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;terraform plan&lt;/code&gt; and &lt;code&gt;terraform show&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;This confirmed that Terraform correctly recognized the existing infrastructure.&lt;/p&gt;




&lt;h2&gt;
  
  
  Key takeaway
&lt;/h2&gt;

&lt;p&gt;The biggest challenge in Infrastructure as Code adoption is not technical — it is &lt;strong&gt;organizational and cultural&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Common blockers include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Lack of trust in automation&lt;/li&gt;
&lt;li&gt;Dependence on manual cloud operations&lt;/li&gt;
&lt;li&gt;Resistance to workflow change&lt;/li&gt;
&lt;li&gt;Unclear migration strategy&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Adoption strategy that works
&lt;/h2&gt;

&lt;p&gt;A successful IaC rollout should be incremental:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Start with new infrastructure
&lt;/li&gt;
&lt;li&gt;Gradually import existing resources
&lt;/li&gt;
&lt;li&gt;Establish team standards (PR reviews, CI checks, version control)
&lt;/li&gt;
&lt;li&gt;Introduce automation last, after trust is established
&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  Final thought
&lt;/h2&gt;

&lt;p&gt;Infrastructure as Code is not just about automation tools like Terraform.&lt;/p&gt;

&lt;p&gt;It is about building &lt;strong&gt;repeatable, reliable, and collaborative infrastructure systems&lt;/strong&gt;.&lt;/p&gt;




</description>
      <category>automation</category>
      <category>aws</category>
      <category>devops</category>
      <category>terraform</category>
    </item>
  </channel>
</rss>
