Learn different ways to effectively iterate through map variables in your Terraform projects for efficient and dynamic resource provisioning.
In Terraform, iterating through a map variable involves using the for_each
meta-argument along with the keys
function. This combination enables you to dynamically create resources or perform actions based on the key-value pairs within your map.
To iterate through a map variable in Terraform, you can utilize the for_each
meta-argument in conjunction with the keys
function.
Let's break down how this works:
variable "my_map" {
default = {
"key1" = "value1",
"key2" = "value2",
"key3" = "value3"
}
}
for_each
with keys
: In a resource or module block, use the for_each
meta-argument and pass in keys(your_map_variable)
to iterate over the keys of your map.resource "some_resource" "example" {
for_each = keys(var.my_map)
# Access the key using each.key
name = each.key
# Access the corresponding value using each.value
value = var.my_map[each.key]
}
In this example:
for_each = keys(var.my_map)
instructs Terraform to iterate over each key in the my_map
variable.each.key
represents the current key being iterated over.var.my_map[each.key]
retrieves the value associated with the current key.This approach allows you to create multiple instances of a resource, each customized based on the key-value pairs in your map variable.
The code defines a Terraform configuration that creates S3 buckets in multiple AWS regions. It uses a map variable to store region codes and names. The code iterates over the map keys to create a bucket in each region, with the bucket name and tags dynamically generated based on the region information from the map.
# Define a map variable
variable "aws_regions" {
type = map(string)
default = {
"us-east-1" = "US East (N. Virginia)",
"us-west-2" = "US West (Oregon)",
"eu-west-1" = "Europe (Ireland)"
}
}
# Create an S3 bucket in each region defined in the map
resource "aws_s3_bucket" "example" {
for_each = keys(var.aws_regions)
bucket = "my-bucket-${each.key}"
region = each.key
tags = {
Name = "My bucket in ${var.aws_regions[each.key]}"
Environment = "Dev"
}
}
Explanation:
aws_regions
containing key-value pairs representing AWS regions and their full names.aws_s3_bucket
resource uses for_each = keys(var.aws_regions)
to iterate over the keys of the aws_regions
map.bucket
: The bucket name is dynamically generated using the current key (each.key
) from the iteration.region
: The bucket's region is set to the current key (each.key
).tags
: We add tags to the bucket, including the region's full name retrieved from the map using var.aws_regions[each.key]
.This code will create three S3 buckets, one in each of the specified AWS regions, with names and tags derived from the aws_regions
map.
Understanding for_each
:
for_each
is a special argument used within resource and module blocks to create multiple instances based on a collection.for_each
iterates over the keys by default.Beyond keys()
:
values()
Function: While keys()
is common, you can use values(your_map_variable)
with for_each
if you only need the values.for_each
loops or other techniques to access data effectively.Important Considerations:
name
, bucket
, etc.) within the for_each
loop are unique. Use interpolation with each.key
or other variables to achieve this.for_each
loop. Terraform's implicit dependency management might not always be sufficient, and you might need to use explicit dependencies (depends_on
).count
with conditional logic might be an alternative to for_each
, especially when dealing with lists. However, for_each
is generally preferred for maps due to its clarity and ability to reference keys directly.Debugging and Best Practices:
output
to inspect the values of each.key
and each.value
during iteration to help with debugging.for_each
loop and how you are using the key-value pairs.This table summarizes how to iterate through a map variable in Terraform:
Concept | Description | Example |
---|---|---|
Map Variable | Stores key-value pairs. | variable "my_map" { default = { "key1" = "value1", "key2" = "value2" } } |
for_each Meta-Argument |
Enables iteration over collections, including map keys. | for_each = keys(var.my_map) |
keys Function |
Returns a list of keys from a map. | keys(var.my_map) |
each.key |
Represents the current key during iteration. | name = each.key |
each.value |
Represents the current value during iteration (can be accessed using the key). | value = var.my_map[each.key] |
Key Points:
for_each
with keys(your_map)
to iterate over map keys.each.key
.your_map[each.key]
.Iterating through map variables in Terraform is essential for managing dynamic infrastructure configurations. By combining the for_each
meta-argument with the keys
function, you can create and manage multiple resources based on key-value pairs within your map. This approach enhances code flexibility, reduces redundancy, and simplifies the management of complex infrastructure deployments. Understanding how to effectively utilize map iteration unlocks powerful automation capabilities within Terraform, enabling you to build scalable and maintainable infrastructure as code solutions.