
Managing Secrets and CI/CD with Terragrunt
Learn how to manage secrets securely and integrate Terragrunt into your CI/CD pipelines to automate Infrastructure as Code deployments in production.
A collection of my thoughts, lessons learned, and technical notes.

Learn how to manage secrets securely and integrate Terragrunt into your CI/CD pipelines to automate Infrastructure as Code deployments in production.

Learn how Terragrunt helps manage multiple environments and AWS accounts consistently while eliminating duplicated configuration and scaling Infrastructure as Code for enterprise environments.

Learn how Terragrunt automatically manages dependencies between Terraform projects, builds dependency graphs, and deploys infrastructure in the correct order.

Learn how Terragrunt's three most powerful features—include, generate, and read_terragrunt_config—eliminate repetitive configuration and make large Terraform repositories maintainable.

Learn how to organize a Terragrunt repository for production environments, multiple AWS accounts, and hundreds of Terraform projects while keeping your Infrastructure as Code scalable and maintainable.

Now that you understand Terraform, it's time to explore Terragrunt—a tool that helps manage Infrastructure as Code at production scale by reducing duplication, organizing repositories, and orchestrating multiple Terraform projects.

Terraform is powerful, but managing multiple environments and modules at scale quickly becomes challenging. In this article, we'll explore Terraform's limitations and why Terragrunt was created.

Discover the most common mistakes engineers make when using Terraform, from state management and module design to collaboration workflows and production best practices.

Learn why local Terraform state does not scale to production, how remote state backends work, and why centralized state is essential for team collaboration and CI/CD.

Learn how to bring existing infrastructure under Terraform management using terraform import and Import Blocks without recreating resources or disrupting production systems.

Learn how to organize a Terraform repository for production environments using modules, environments, and best practices that scale with your infrastructure.

Learn the Terraform features you'll use in almost every real-world project, including for_each, count, locals, dynamic blocks, depends_on, and lifecycle.

Learn what Terraform Data Sources are, when to use them, how Terraform reads existing infrastructure, and how to combine Data Sources with Resources in real-world projects.

Understand how Terraform Providers work behind the scenes, from Resources and Data Sources to communication with external APIs. This is a fundamental concept for using Terraform effectively.

Terraform Modules are more than reusable code. A well-designed module makes infrastructure easier to maintain, scale, and reuse across environments. This article explores module design from a software engineering perspective.

Terraform State is one of the most important yet misunderstood parts of Terraform. Learn what Terraform State is, why Terraform needs it, how it works, and the best practices for managing State in production.

Terraform does not execute infrastructure sequentially like a Bash script. This article explains Terraform's execution model through Desired State, Current State, Actual Infrastructure, Dependency Graphs, Plans, Apply, Refresh, and Drift.

Infrastructure as Code is more than just Terraform or a collection of .tf files. In the first article of this series, I'll share why IaC exists, the challenges of managing infrastructure manually, and how thinking of infrastructure as code fundamentally changed the way I build and operate systems.

Explore how the JVM Execution Engine transforms bytecode into running code. Learn how the Interpreter, JIT Compiler, Code Cache, hotspot detection, and Garbage Collector work together to deliver high-performance Java applications.

Explore the JVM memory architecture through Runtime Data Areas. Learn how the Heap, Stack, Method Area, Metaspace, and per-thread memory areas work together to manage objects, execute bytecode, and support Garbage Collection in Java applications.

Explore the architecture of the Java Virtual Machine (JVM) and learn how the Class Loader Subsystem dynamically loads classes. Understand Bootstrap, Platform, and Application ClassLoaders, the Parent Delegation Model, and the class loading process that powers every Java application.

Spring boot is one of the most popular java framework for REST API development. However, there are some common mistakes can be made during development. Check it out...

Learn how to use Postman Scratch Pad to send API requests without signing in to a workspace. A quick guide for local API development and testing.

GitHub Packages is a software package hosting service that allows you to host your packages privately or publicly. Learn how to configure your Maven project and set up GitHub Actions to automatically publish your Java packages to GitHub Packages registry with proper authentication and version management.

SDKMAN makes it easy to install and manage multiple Java versions and other JVM tools. This guide shows how to install SDKMAN, install Java and switch between JDK versions on your development machine.

In practice, you may use multiple Git accounts for different repositories. This guide explains how to configure multiple SSH keys on macOS and select the correct key for each GitHub, GitLab or Bitbucket account.

Learn how to generate an SSH key on macOS for secure authentication with GitHub, GitLab, Bitbucket and remote servers. This step-by-step guide covers creating, configuring and verifying your SSH key.