Search code examples
regexdynamicterraformcloudterraform-provider-azure

Automatically create multiple resources in terraform using count and regex


I want to be able to create multiple resources in terraform using the "count" meta-argument and regex. Like for example in the below code, I want terraform to automatically look for vn1_name, vn2_name, and vn3_name in my tfvars file, without me having to declaring all those variables by hardcoding. Is there any way ?

resource "azurerm_virtual_network" "poc_vn" {
   count = 3
   name                = var.virtual_network.vn[1-3]_name ***(This is not valid syntax)***
   location            = azurerm_resource_group.poc_rg.location
   resource_group_name = azurerm_resource_group.poc_rg.name
   address_space       = var.virtual_network.vn1_address_space

     tags = {
      environment = var.virtual_network.env1_name
     }
  }

Solution

  • The typical way to model something like this in Terraform is to declare a single variable that will capture all of the settings about the virtual network in a single data structure. For example:

    variable "virtual_networks" {
      type = map(object({
        environment   = string
        address_space = string
      }))
    }
    
    variable "environments" {
      type = map(object({
        name = string
      }))
    }
    
    resource "azurerm_virtual_network" "poc_vn" {
      for_each = var.networks
    
      name                = each.key
      location            = azurerm_resource_group.poc_rg.location
      resource_group_name = azurerm_resource_group.poc_rg.name
      address_space       = each.value.address_space
    
      tags = {
        environment = var.environments[each.value.environment].name
      }
    }
    

    The top-level namespace of variables is not a value itself, and so you can't treat it as one. However, you can declare a particular variable as having a collection type, such as the two map variables I showed above, and then you can dynamically look up elements in those maps using the indexing syntax.