Using ‘count’ in Terraform to create multiple resources

Updated: February 3, 2024 By: Guest Contributor Post a comment

Overview

Terraform by HashiCorp is a highly popular Infrastructure as Code (IaC) tool that allows developers and operations teams to define infrastructure through code to automate deployment, management, and scaling of cloud and on-premises resources. One powerful feature Terraform offers is the count parameter, which enables users to create multiple instances of a resource without having to duplicate code. This tutorial will guide you through using count in Terraform with various examples, ranging from basic to advanced.

Basic Usage of count

The count parameter in Terraform allows for the creation of multiple resources based on a numerical count. It is particularly useful when you need several instances of the same resource but don’t wish to create each one manually. This not only saves time but also keeps your configurations dry (Don’t Repeat Yourself).

Basic Usage of count

Let’s start with a simple example where we create multiple instances of an AWS EC2 instance.

resource "aws_instance" "example" {
  count         = 3
  ami           = "ami-0c55b159cbfafe1f0"
  instance_type = "t2.micro"
}

In this example, the count parameter is set to 3, which tells Terraform to create three instances of the AWS EC2 resource. Each instance will be identical, having the same AMI and instance type.

Accessing Individual Resources

When you create multiple resources using count, you may need to access each resource individually. This can be done using the syntax resource_type.resource_name[count_index].

For instance, to output the IP address of the first EC2 instance created above, you would use:

output "first_instance_ip" {
  value = aws_instance.example[0].public_ip
}

Conditionally Creating Resources

Another powerful feature of count is its ability to conditionally create resources. This enables you to control the creation of resources based on variables or conditions within your configuration.

resource "aws_instance" "conditional_example" {
  count         = var.create_instances ? 3 : 0
  ami           = var.ami_id
  instance_type = var.instance_type
}

In the example above, the number of instances created is determined by the boolean variable create_instances. If create_instances is true, three instances are created; otherwise, no instances are created.

Advanced Usage of count

As we progress to more advanced examples, let’s examine how to use count with loops and dynamically configure each instance.

Creating Unique Resources with Loops

Loops in Terraform can be used in combination with count to create uniquely configured resources. For example, let’s create multiple EC2 instances with unique tags.

resource "aws_instance" "loop_example" {
  count         = 3
  ami           = "ami-0c55b159cbfafe1f0"
  instance_type = "t2.micro"

  tags = {
    Name = "Instance-${count.index+1}"
  }
}

In this example, each EC2 instance will have a unique tag with its numbering starting from 1. This demonstrates how you can dynamically configure resources using count and looping constructs.

Complex Conditional Creation

For more complex conditions, we can integrate count with Terraform’s powerful expressions to fine-tune the creation of our resources. Let’s create instances based on a list of provided AMIs, but only if the list isn’t empty.

resource "aws_instance" "complex_conditional" {
  count         = length(var.amis) > 0 ? length(var.amis) : 0
  ami           = var.amis[count.index]
  instance_type = "t2.micro"
}

This example highlights how count combined with Terraform expressions can provide a flexible and powerful way to manage the creation of your infrastructure.

Conclusion

Understanding and utilizing the count parameter in Terraform can significantly streamline your infrastructure as code practices. By enabling the creation of multiple resources through a single declaration, count helps maintain clean and efficient configurations. Whether you’re looking to simplify repetitive resource definitions, introduce conditional resource creation, or dynamically configure resources, count is a tool that should be in every Terraform practitioner’s toolkit.