Измените счетчик на for_each Terraform

Как заменить эту строку на for_each? Я хочу получить идентификатор ресурса azurerm_network_connection_monitor. Все эти ресурсы повторяются через for_each.

azurerm_network_connection_monitor.monitor[element(keys(var.names), count.index)].id

Модули

resource "azurerm_network_connection_monitor" "monitor" {
  for_each             = var.names
  name                 = each.value.name
  network_watcher_name = var.network_watcher_name
  resource_group_name  = var.resource_group_name
  location             = var.location

  interval_in_seconds = each.value.interval_in_seconds

  source {
    virtual_machine_id = each.value.virtual_machine_id
    port               = var.source_port
  }

  destination {
    port    = each.value.port
    address = each.value.address
  }

  tags = var.tags
  }
}



resource "azurerm_monitor_metric_alert" "rtt_alert" {
  depends_on = [azurerm_network_connection_monitor.monitor]

  for_each            = var.rtt_criteria
  name                = "HPG-ALRT-${lookup(azurerm_network_connection_monitor.monitor, each.value["name"], null)}-001-${each.value.name}"
  resource_group_name = var.resource_group_name
  scopes              = [azurerm_network_connection_monitor.monitor[element(keys(var.names), count.index)].id]
  enabled             = each.value.enabled
  auto_mitigate       = var.auto_mitigate
  description         = each.value.description
  frequency           = each.value.frequency
  severity            = each.value.severity
  window_size         = each.value.window_size

  dynamic_criteria {
    metric_namespace         = each.value.metric_namespace
    metric_name              = each.value.metric_name
    aggregation              = each.value.aggregation
    operator                 = each.value.operator
    alert_sensitivity        = each.value.alert_sensitivity
    evaluation_total_count   = each.value.evaluation_total_count
    evaluation_failure_count = each.value.evaluation_failure_count
  }

  action {
    action_group_id = var.action_group_id
  }

  tags = var.tags
}

Я не знаю, как получить идентификатор каждого индекса azurerm_network_connection_monitor.monitor.


person Bater55    schedule 14.12.2020    source источник


Ответы (2)


Ресурс azurerm_network_connection_monitor включает for_each аргумент, значением которого является карта или набор строк, Terraform создаст по одному экземпляру для каждого члена этой карты или набора.

Вы можете использовать функцию values ​​, чтобы взять карту и вернуть список содержащие значения элементов на этой карте.

Вы можете попробовать установить это так:

scopes              = [values(azurerm_network_connection_monitor.monitor)[*].id]

Аналогичный результат теста

введите описание изображения здесь

person Nancy Xiong    schedule 15.12.2020
comment
Вероятно, он мог бы работать с scopes = [values(azurerm_network_connection_monitor.monitor)[0].id], но я хочу получать каждый идентификатор для каждого предупреждения. - person Bater55; 15.12.2020
comment
Как вы определяете var.names и var.rtt_criteria? - person Nancy Xiong; 15.12.2020
comment
var.names и var.rtt_criteria относятся к типу карты (объекта). variable "names" { type = map(object({})) } - person Bater55; 15.12.2020
comment
Существует отдельный for_each для разных мониторов ресурсов и разных предупреждений о ресурсах. Невозможно получить каждый идентификатор монитора для каждого предупреждения в отдельном цикле, если вы не используете локальное выражение для построения результата монитора и передачи его в цикл предупреждения. Или вы можете повторно сгенерировать общую переменную, чтобы использовать ее в обоих ресурсах. Не уверен, но я попробую. - person Nancy Xiong; 15.12.2020
comment
Я попробую, спасибо! - person Bater55; 15.12.2020

На самом деле я получаю сообщение об ошибке:  введите описание изображения здесь

потому что я хочу использовать идентификатор в области метрических предупреждений

person Bater55    schedule 15.12.2020