'How to create Iterative Loop in Terraform

I have around 50 resources that I create in a Terraform script. I need now to add diagnostic logging for each resource.

The following code is what I use:


data "azurerm_monitor_diagnostic_categories" "vnet-spoke01" {
  resource_id = module.MOD-VNET-SPOKE01.id
}

resource "azurerm_monitor_diagnostic_setting" "vnet-spoke01" {
  name                       = "diag-${module.MOD-VNET-SPOKE01.vnetName}"
  target_resource_id         = module.MOD-VNET-SPOKE01.id
  log_analytics_workspace_id = module.MOD-LOG-ANALYTICS-WORKSPACE.id

  dynamic "log" {
    for_each = data.azurerm_monitor_diagnostic_categories.vnet-spoke01.logs
    content {
      category = log.value
      retention_policy {
        days    = 0
        enabled = false
      }
    }
  }

  dynamic "metric" {
    for_each = data.azurerm_monitor_diagnostic_categories.vnet-spoke01.metrics
    content {
      category = metric.value
      retention_policy {
        days    = 0
        enabled = false
      }
    }
  }
}

As you can see, I'm adding VNET of spoke-1 diagnostic settings. Can someone kindly guide me as to how I can add a for-loop so it goes through each resource (that I'd put in an array or list) and run through it?

e.g. 

variable "myResources" {

type = list(string)
default = ["module.MOD-VNET-SPOKE01", "module.MOD-VNET-SPOKE02" etc...]
}

for a in myResources
{

.... execute diagnostic routine

}

How could I do this?

Many thanks



Solution 1:[1]

Sadly you can't do that. You can't dynamically resolve strings (e.g. "module.MOD-VNET-SPOKE01") into resource identifiers (e.g. module.MOD-VNET-SPOKE01.id.

Your variable would already have to contain all ids for your loop to work:

variable "myResources" {
   type = list(string)
   default = ["<id-SPOKE01>", "<id-SPOKE02>", etc...]
}

or through locals:

locals {
   myResources  = [module.MOD-VNET-SPOKE01.id, module.MOD-VNET-SPOKE02.id etc...]
}

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 Marcin