Is there a way in Terraform to loop through a given range?

Viewed 31

I'm fairly new to Terraform and managed to create a firewall, public IP prefix and public IP's. Now I want to attach 8 public IP's to my firewall. I did it with the code given below, but I think that it can be done shorter. Is there a way how I can code it that it will create an ip configuration while looping through [0-7] with a smaller amount of code?

data "azurerm_public_ip" "firewall_public_ip_address" {
  count               = 8
  name                = "firewall-public-ip-address-${var.env_name}-test-${var.region}-${count.index}"
  resource_group_name = var.common_resource_group_name
}    

resource "azurerm_firewall" "test_firewall" {
      name                      = "firewall-${var.env_name}-test-${var.region}"
      resource_group_name       = "${var.resource_group_name}"
      location                  = "${var.region}"
    
      ip_configuration {
        name                    = "test-azure-firewall-config-0"
        subnet_id               = "${var.firewall_subnet_id}"
        public_ip_address_id    = data.azurerm_public_ip.firewall_public_ip_address[0].id
      }
    
      ip_configuration {
        name                    = "test-azure-firewall-config-1"
        subnet_id               = null
        public_ip_address_id    = data.azurerm_public_ip.firewall_public_ip_address[1].id
      }
    
      ip_configuration {
        name                    = "test-azure-firewall-config-2"
        subnet_id               = null
        public_ip_address_id    = data.azurerm_public_ip.firewall_public_ip_address[2].id
      }
    
      ip_configuration {
        name                    = "test-azure-firewall-config-3"
        subnet_id               = null
        public_ip_address_id    = data.azurerm_public_ip.firewall_public_ip_address[3].id
      }
    
      ip_configuration {
        name                    = "test-azure-firewall-config-4"
        subnet_id               = null
        public_ip_address_id    = data.azurerm_public_ip.firewall_public_ip_address[4].id
      }
    
      ip_configuration {
        name                    = "test-azure-firewall-config-5"
        subnet_id               = null
        public_ip_address_id    = data.azurerm_public_ip.firewall_public_ip_address[5].id
      }
    
      ip_configuration {
        name                    = "test-azure-firewall-config-6"
        subnet_id               = null
        public_ip_address_id    = data.azurerm_public_ip.firewall_public_ip_address[6].id
      }
    
      ip_configuration {
        name                    = "test-azure-firewall-config-7"
        subnet_id               = null
        public_ip_address_id    = data.azurerm_public_ip.firewall_public_ip_address[7].id
      }
1 Answers

You can use Terraform dynamic blocks if all the parameters follow the same pattern (e.g. subnet_id is always var.firewall_subnet_id).

resource "azurerm_firewall" "test_firewall" {
  name                      = "firewall-${var.env_name}-test-${var.region}"
  resource_group_name       = var.resource_group_name
  location                  = var.region

  dynamic "ip_configuration" {
    for_each = data.azurerm_public_ip.firewall_public_ip_address
    content {
      name                    = ip_configuration.value.name
      subnet_id               = var.firewall_subnet_id
      public_ip_address_id    = ip_configuration.value.id
    }
  }
}
Related