DevOps, Day - 69
Meta-Arguments in Terraform

💻 Python | Docker | Jenkins | Networking | Git | Linux 💻
Passionate about leveraging technology to drive efficiency and deliver innovative solutions. Proficient in Python development, Docker containerization, Jenkins automation, computer networking, Git version control, and Linux administration. Skilled in collaborating with diverse teams to deliver high-quality software products. Proficient in AWS EC2 instance management and deployment.
Seeking new opportunities to apply my expertise and contribute to impactful projects. Let's connect and explore how we can work together!
Inter-personal Skills:
Communication, Adaptability, Emotional intelligence, Active listening, Collaboration.
Happy To Connect🔗😊
Feel free to reach me out😃@ --> vrishnishreevb531@gmail.com 📬
Count
The count meta-argument accepts a whole number and creates the number of instances of the resource specified.
When each instance is created, it has its distinct infrastructure object associated with it, so each can be managed separately. When the configuration is applied, each object can be created, destroyed, or updated as appropriate.
eg.
terraform {
required_providers {
aws = {
source = "hashicorp/aws"
version = "~> 4.16"
}
}
required_version = ">= 1.2.0"
}
provider "aws" {
region = "us-east-1"
}
resource "aws_instance" "server" {
count = 4
ami = "ami-08c40ec9ead489470"
instance_type = "t2.micro"
tags = {
Name = "Server ${count.index}"
}
}
for_each
Like the count argument, the for_each meta-argument creates multiple instances of a module or resource block. However, instead of specifying the number of resources, the for_each meta-argument accepts a map or a set of strings. This is useful when multiple resources are required that have different values. Consider our Active Directory groups example, with each group requiring a different owner.
terraform {
required_providers {
aws = {
source = "hashicorp/aws"
version = "~> 4.16"
}
}
required_version = ">= 1.2.0"
}
provider "aws" {
region = "us-east-1"
}
locals {
ami_ids = toset([
"ami-0b0dcb5067f052a63",
"ami-08c40ec9ead489470",
])
}
resource "aws_instance" "server" {
for_each = local.ami_ids
ami = each.key
instance_type = "t2.micro"
tags = {
Name = "Server ${each.key}"
}
}
Multiple key value iteration
locals {
ami_ids = {
"linux" :"ami-0b0dcb5067f052a63",
"ubuntu": "ami-08c40ec9ead489470",
}
}
resource "aws_instance" "server" {
for_each = local.ami_ids
ami = each.value
instance_type = "t2.micro"
tags = {
Name = "Server ${each.key}"
}
}

Our main.tf looks something like this...
terraform {
required_providers {
aws = {
source = "hashicorp/aws"
version = "5.22.0"
}
}
required_version = ">= 1.2.0"
}
provider "aws" {
region = "us-east-1"
}
locals {
ami_ids_list = toset([
"ami-0b0dcb5067f052a63",
"ami-08c40ec9ead489470",
])
}
resource "aws_instance" "server_for_each_list" {
for_each = local.ami_ids_list
ami = each.key
instance_type = "t2.micro"
tags = {
Name = "Server ${each.key}"
}
}
locals {
ami_ids_map = {
"linux" = "ami-0b0dcb5067f052a63",
"ubuntu" = "ami-08c40ec9ead489470",
}
}
resource "aws_instance" "server_for_each_map" {
for_each = local.ami_ids_map
ami = each.value
instance_type = "t2.micro"
tags = {
Name = "Server ${each.key}"
}
}

Run terraform init command

Run terraform apply command


we can see, 4 added
Go to EC2 and check the 4 instances created.

Meta-arguments and their use in Terraform.
Meta-arguments in Terraform are special directives that are used to control and manipulate the behaviour of resources and modules within your configuration. These meta-arguments provide flexibility and automation, enabling you to manage resources more dynamically and efficiently.
Some common meta-arguments in Terraform include count, for_each, and depends_on. Let's focus on the use of count and for_each since those are the ones demonstrated in your provided Terraform code.
Count Meta-Argument:
The
countmeta-argument is used to create a specified number of instances of a resource or module. You specify the desired count, and Terraform will generate that many instances.It is useful when you need to create multiple similar resources with the same configuration but a different name or index. Each instance created has its own distinct infrastructure object associated with it, so they can be managed separately.
In your example, the "server_count" resource creates four AWS instances using the
countmeta-argument. Each instance has a unique name based on thecount.index.
For Each Meta-Argument:
The
for_eachmeta-argument is used to create multiple instances of a resource or module, but instead of specifying the number of instances, it accepts a map or a set of values. Each value in the map or set corresponds to a separate instance.It is especially useful when you need to create multiple resources with different configurations based on a list of values or a map of values.
In your example, you demonstrated the use of
for_eachwith both a list and a map of AMI IDs. The "server_for_each_list" resource creates instances for each item in the list, and the "server_for_each_map" resource creates instances for each key-value pair in the map.
Thank you so much for reading
Follow me on LinkedIn to see interesting posts like this : )




