DevOps

Terragrunt vs Terraform: Battle of DevOps tools

Learn key differences between Terraform and Terragrunt, two powerful tools for DevOps. Learn about modules, remote state, and more.

Quick Summary

  • It’s a powerful tool for infrastructure provisioning on different cloud platforms, and its wide adoption can be attributed to several key features that eliminate the need to use the same infrastructure manual steps that have been used for years.
  • It allows teams to work together on shared Terraform projects by managing and storing state files, providing a platform for remote operations, and enabling collaboration through access controls and workspace management.
  • Its integration with existing Terraform configurations means that developers can leverage the benefits of Terraform Cloud without significant changes to their existing infrastructure code, facilitating a more efficient and cohesive workflow.

Infrastructure as Code (IaC) has become widely adopted by many, including in production environments, development labs, and by home lab enthusiasts to deploy infrastructure. Terraform is arguably one of the top tools used by DevOps professionals. However, there is another tool you may not have heard about called Terragrunt. What is Terragrunt? What about Terragrunt vs Terraform? Are they competing solutions?

What is Terraform?

Most likely, you have heard about Terraform. Terraform is an open-source infrastructure as code (IaC) tool that allows developers to create, modify, and manage multiple environments through simple text files.

It’s a powerful tool for infrastructure provisioning on different cloud platforms, and its wide adoption can be attributed to several key features that eliminate the need to use the same infrastructure manual steps that have been used for years.

Below, running the terraform command to see the command parameters.

Running terraform from the command line 1
Running terraform from the command line 1

Hashicorp develops Terraform and allows developers to define infrastructure using HCL files. These declarative syntax files provide an efficient way to manage cloud platforms, ensuring consistency across different environments.

With the support of multiple cloud providers, Terraform enables streamlined infrastructure provisioning and the ability to handle complex infrastructures. Note the following:

Declarative Syntax with HCL Files

Using HashiCorp Configuration Language (HCL), developers can write their infrastructure code in a human-readable format. The HCL files define infrastructure, giving clear visibility and control over the cloud infrastructure setup.

Modularity and Reusable Components

Terraform modules are building blocks that can be reused across different environments. These reusable modules reduce code duplication and enhance efficiency in managing complex infrastructures.

State Management

Terraform stores the state of the managed infrastructure in state files. These files enable synchronization and shared access, making collaboration among teams smoother.

Provider Ecosystem

Terraform supports many cloud providers, allowing developers to manage different cloud resources through the same code. This consistency facilitates smoother transitions between different configurations and cloud providers.

Scalable and Extensible

Terraform’s design enables the handling of both small and large-scale infrastructure deployments. With its extensible architecture, it can grow with your organization’s needs without manually configuring each new environment.

Terraform Cloud

Terraform Cloud is a hosted service provided by HashiCorp that offers collaboration, governance, and automation capabilities for Terraform users. It allows teams to work together on shared Terraform projects by managing and storing state files, providing a platform for remote operations, and enabling collaboration through access controls and workspace management.

With support for various cloud providers, Terraform Cloud simplifies infrastructure provisioning and enhances the process of managing complex infrastructures across different environments. Its integration with existing Terraform configurations means that developers can leverage the benefits of Terraform Cloud without significant changes to their existing infrastructure code, facilitating a more efficient and cohesive workflow.

Installing Terraform

Hashicorp has made installing Terraform very easy. You download the Terraform binary to your client and then add a PATH statement to your executable. That’s it. There isn’t really an “installation” process per se aside from downloading the binary and the PATH configuration.

You can visit the Terraform download page here: Install | Terraform | HashiCorp Developer.

Downloading the terraform binary
Downloading the terraform binary

What is Terragrunt?

Terragrunt is a thin wrapper around Terraform that provides additional functionality to enhance Terraform’s capabilities. It’s a tool designed to solve some common challenges faced in managing multiple environments and large-scale infrastructure management.

It introduces features like enabling collaboration, reducing code duplication, and providing additional commands like terragrunt apply and terragrunt plan. Its integration with Terraform makes handling multiple Terraform modules more manageable and less error-prone.

Remote State Management

One key feature that sets Terragrunt apart is its emphasis on remote state management. Terragrunt’s ability to manage remote state files across different versions and environments brings an additional control layer. With commands such as terragrunt apply, managing your entire infrastructure becomes more accessible.

DRY (Don’t Repeat Yourself) Principles

Terragrunt focuses on reducing code duplication by enabling the reusability of terraform code and configurations. It offers a way to manage multiple modules in Terraform without repeating the same code.

Dependency Management

Terragrunt offers features for managing dependencies between different modules, ensuring that infrastructure components are applied in the correct order.

Working with Multiple Environments

Managing multiple environments, whether a dev environment or a production setup, becomes more convenient with Terragrunt. It allows for defining input variables and configurations that can be easily adapted across different environments.

Integration with Terraform

Terraform natively supports Terragrunt and acts as a seamless extension of it. It translates Terragrunt-specific configurations into Terraform-compatible ones, providing a cohesive experience for infrastructure management.

Installing Terragrunt

Installing the Terragrunt executable is easy. Like terraform, you download the Terragrunt file and add a PATH statement. The Terragrunt download is an executable. Copy the file where you want to reference it, then add the PATH statement for the Terragrunt executable like you would for the Terraform binary.

Download the latest Terragrunt binary from here: Releases · gruntwork-io/terragrunt (github.com).

Downloading terragrunt
Downloading terragrunt

Below, I have added the Terragrunt executable to the same directory where I have Terraform located mainly to take advantage of the PATH statement I already have in place for Terraform.

Terragrunt and Terraform downloaded
Terragrunt and Terraform downloaded

After getting the terragrunt executable downloaded and ensuring the PATH statement is working, you should be able to execute terragrunt and see the output of the command parameters.

Running terragrunt from the command line
Running terragrunt from the command line

Creating the Terragrunt.hcl file

To get started with Terragrunt, you need to create a Terragrunt.hcl file that configures Terragrunt. Below is an example of code I grabbed directly from the Terragrunt “Quick Start” page:

# Indicate where to source the terraform module from.
# The URL used here is a shorthand for
# "tfr://registry.terraform.io/terraform-aws-modules/vpc/aws?version=3.5.0".
# Note the extra `/` after the protocol is required for the shorthand
# notation.
terraform {
  source = "tfr:///terraform-aws-modules/vpc/aws?version=3.5.0"
}

# Indicate what region to deploy the resources into
generate "provider" {
  path = "provider.tf"
  if_exists = "overwrite_terragrunt"
  contents = <<EOF
provider "aws" {
  region = "us-east-1"
}
EOF
}

Terragrunt uses the same syntax essentially as terraform:

terragrunt init
terragrunt plan
terragrunt apply
terragrunt output
terragrunt destroy

Below, I am running a terragrunt init.

Running terragrunt init from the command line
Running terragrunt init from the command line

To get started with Terragrunt, follow these steps:

  1. Install Terraform: Begin by installing Terraform, the core tool that Terragrunt complements.
  2. Install Terragrunt: Next, install Terragrunt, the thin wrapper that enhances Terraform’s functionality.
  3. Create a Terragrunt Configuration: Place your specific Terragrunt configuration within a terragrunt.hcl file.

Now, you can use Terragrunt by running the same commands you would typically use with Terraform, but replace “terraform” with “terragrunt”:

  • terragrunt plan
  • terragrunt apply
  • terragrunt output
  • terragrunt destroy

Terragrunt operates by forwarding nearly all commands, arguments, and options directly to Terraform. However, it customizes the behavior according to the configurations found in your terragrunt.hcl file.

Comparing Terragrunt vs Terraform: Key Features and Differences

Managing Multiple Environments: Terragrunt’s Edge

While both tools offer robust solutions for handling multiple environments, Terragrunt specifically focuses on managing multiple environments and complex infrastructure. This gives it a unique advantage based on many opinions of those who have managed large environments with Terragrunt vs Terraform.

For most that may have a small, single-region infrastructure, or even multi-region infrastructure that is not very complex in nature, you may not see any benefits using Terragrunt vs Terraform.

As the complexity of your environment grows, and you are using more complex topologies where you need to segregate state files, Terragrunt will help organizations to simplify their structure time in managing their infrastructure as code.

Code Duplication and Complexity

Terragrunt helps to reduce the amount of code and the complexity of your environment and allows the use of separate state files and running these in parallel.

Dependency Management and Automated Testing

Both Terragrunt and Terraform provide essential features for dependency management and automated testing. These capabilities are critical in ensuring the stability and reliability of infrastructure deployments, whether running Terraform commands or utilizing Terragrunt’s specialized functions.

Latest versions of Terraform and DRY

Many have stated that the latest versions of Terraform have eliminated many of the issues that Terragrunt was solving vs those early releases of Terraform. It will be up to organizations to test and see if they gain benefits from using Terragrunt on top of Terraform.

Frequently asked questions

1. How Can I Manage Different Versions of Terraform with Terragrunt?

Terragrunt offers flexibility in managing different versions of Terraform configurations. By specifying the desired version in the Terragrunt configuration file (hcl file), you can easily switch between different versions. This feature is particularly valuable for organizations that require different configurations for various projects or environments.

2. What are the Benefits of Using Terraform Workspaces?

Terraform workspaces allow for the separation of state files for each environment (like production, staging, and development) within the same infrastructure code. Using separate state files and terraform workspaces, you can manage the same infrastructure in different environments without conflicts. It encourages modular design, enhances collaboration, and simplifies handling environment variables.

3. Is It Possible to Automate Testing in Terragrunt?

Terragrunt supports automated testing, enabling a more robust and reliable development process. By integrating with existing testing frameworks, Terragrunt can run tests on your infrastructure code to ensure that it meets the defined criteria. Automated testing with Terragrunt contributes to a more resilient infrastructure, reduces error-prone manual processes, and ensures that the infrastructure deployments meet the required standards.

4. How Does Terragrunt Plan Differ from Running Terraform Commands?

The terragrunt plan command offers similar functionality to the terraform plan command but with added benefits. Terragrunt integrates closely with Terraform, adding features like enhanced dependency management and easier handling of remote state. The terragrunt plan command gives a preview of changes without applying them, coupled with Terragrunt’s additional control over configurations, making it a powerful option for managing complex infrastructures.

5. Can I Use Terragrunt with Terraform Enterprise?

Yes, Terragrunt can be used in conjunction with Terraform Enterprise, providing an enriched experience. Terraform Enterprise offers advanced collaboration and governance features, while Terragrunt brings its unique capabilities like managing multiple Terraform modules and enhanced remote state management. This combination allows for scalable, efficient, and cohesive infrastructure management, suitable for organizations of all sizes.

These FAQs provide insights into some specific aspects of Terraform and Terragrunt, addressing unique features, compatibility, and ways to leverage both tools to their fullest potential. By understanding these nuances, you can make more informed decisions regarding your infrastructure management strategy and make the most of what Terraform and Terragrunt have to offer.

Wrapping up

There are mixed opinions in the community from what I have seen on using native Terraform vs Terragrunt. The general consensus seems to be that Terragrunt becomes very beneficial when you have very complex environments across many different accounts.

However, if you are managing small Infrastructure as Code environment configurations, native Terraform will likely do everything you need without the added complexity of adding the Terragrunt wrapper around Terraform.

Subscribe to VirtualizationHowto via Email 🔔

Enter your email address to subscribe to this blog and receive notifications of new posts by email.

Brandon Lee

Brandon Lee is the Senior Writer, Engineer and owner at Virtualizationhowto.com and has over two decades of experience in Information Technology. Having worked for numerous Fortune 500 companies as well as in various industries, Brandon has extensive experience in various IT segments and is a strong advocate for open source technologies. Brandon holds many industry certifications, loves the outdoors and spending time with family.

Related Articles

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.