You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Terraform for_each循环下如何配置diagnostic setting的target_resource_id

解决Terraform存储共享诊断设置与for_each联动的问题

因为你用for_each创建存储共享资源,所以azurerm_storage_share.storage_account_shares会变成一个键值对集合(键对应var.storage_share的键)。要让诊断设置和每个存储共享一一对应,直接在诊断设置资源里通过each.key关联对应的存储共享ID即可,不需要额外用local列表中转。

修改后的诊断设置代码如下:

resource "azurerm_monitor_diagnostic_setting" "storagemain_logs" {
  for_each             = var.storage_share
  name                 = "storagemain-logs"

  # 通过each.key关联当前循环对应的存储共享ID
  target_resource_id = azurerm_storage_share.storage_account_shares[each.key].id
  # 注意:如果存储账户也是用for_each创建的,需要对应关联正确的存储账户ID
  # 示例:如果存储账户的for_each键是处理后的account_name,可按下面方式引用
  storage_account_id = azurerm_storage_account.storage_accounts[replace("${var.resource_name_prefix}${each.value["account_name"]}", "-", "")].id

  dynamic "log" {
    iterator = entry
    for_each = local.storages_categories
    content {
      category = entry.value
      enabled  = true

      retention_policy {
        enabled = true
        days    = 30
      }
    }
  }
}

为什么之前的方法行不通?

你之前用local生成ID列表再通过index引用的方式存在两个问题:

  1. for_each是基于映射的,元素顺序不固定,当var.storage_share的元素顺序变化时,index会错位,导致诊断设置绑定到错误的存储共享。
  2. 用列表索引无法和for_each的键值对结构匹配,Terraform无法正确关联每个资源的依赖关系。

用each.key关联是最可靠的方式,它直接绑定了var.storage_share中每个元素的唯一标识,确保诊断设置和对应的存储共享一一对应。

内容的提问来源于stack exchange,提问作者user15824359

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 19:25:12