Skip to main content

Terraform List Of Maps

Let's go one step further: A list of maps. Again in main.tf in the root module

List of Maps we use​

variable "LIST_OF_MAPS" {
type = list(map(string))
default = [
{
city = "Amsterdam"
country = "Netherlands"
},
{
city = "New York"
country = "United States of America"
},
{
city = "London"
country = "United Kingdom"
}
]
}

Get 'country' of second element​

In Javascript this would be an array of objects, which is very common there.

Suppose we need the country of the second element in the list.

output "LISTMAP_COUNTRY_OF_ELEMENT_2" {
value = var.LIST_OF_MAPS[1].country
}

Output​

LISTMAP_COUNTRY_OF_ELEMENT_2 = "United States of America"

Get all Countries, with a for loop​

output "LISTMAP_ALL_COUNTRIES_1" {
value = [for i in var.LIST_OF_MAPS: i.country]
}

Output​

LISTMAP_ALL_COUNTRIES_1 = [
"Netherlands",
"United States of America",
"United Kingdom",
]

Get all Countries, with a Splat Expression​

output "LISTMAP_ALL_COUNTRIES_2" {
value = var.LIST_OF_MAPS.*.country
}

Output​

LISTMAP_ALL_COUNTRIES_2 = tolist([
"Netherlands",
"United States of America",
"United Kingdom",
])

Use a Module to handle each element individually​

As with the previous examples, here also a Module to handle each element of the List individually

Calling the module from main.tf​

module "LIST_OF_MAPS" {
source = "./module_listofmap"
count = length(var.LIST_OF_MAPS)
LISTOFMAP_ELEMENT = var.LIST_OF_MAPS[count.index]
}

Since this is a List, we use the Count again.

Variable passed to the Module is "LISTOFMAP_ELEMENT"
and the value of that variable is each occurrence on the LIST_OF_MAPS variable.

Inside the Module​

The module, residing in "module_listofmap" subdirectory in a file called main.tf, has the following code:

variable "LISTOFMAP_ELEMENT" {
type = map(string)
}

output "COUNTRY" {
value = var.LISTOFMAP_ELEMENT.country
}

It receives a variable which is of type Map (of strings), and it sends back to the caller the value of the Country property in that Map.

Back in root module, main.tf​

main.tf picks up on that output and sends it back to the screen with an output of its own:

output "ALL_COUNTRIES" {
value = module.LIST_OF_MAPS[*].COUNTRY
}

Output​

ALL_COUNTRIES = [
"Netherlands",
"United States of America",
"United Kingdom",
]