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引用的方式存在两个问题:
for_each是基于映射的,元素顺序不固定,当var.storage_share的元素顺序变化时,index会错位,导致诊断设置绑定到错误的存储共享。- 用列表索引无法和
for_each的键值对结构匹配,Terraform无法正确关联每个资源的依赖关系。
用each.key关联是最可靠的方式,它直接绑定了var.storage_share中每个元素的唯一标识,确保诊断设置和对应的存储共享一一对应。
内容的提问来源于stack exchange,提问作者user15824359
相关产品推荐
相关产品推荐

