Terraform模块内传递for_each创建的App Insights ID至诊断设置
同一模块内为App Insights配置诊断设置的正确姿势
完全不需要用Terraform output——output的作用是把模块内部的资源属性暴露给模块外部用,同一模块里直接引用已创建资源的属性就够了。
具体实现代码
假设你已经用for_each创建了一批App Insights实例:
resource "azurerm_application_insights" "app_insights" { for_each = var.app_insights_instances # 这个变量是你定义的,存着所有要创建的实例配置 name = each.value.name location = each.value.location resource_group_name = each.value.resource_group_name application_type = each.value.application_type }
给每个实例加诊断设置时,只要把诊断设置的for_each和上面的App Insights资源绑定,直接通过each.value.id拿到对应实例的ID:
resource "azurerm_monitor_diagnostic_setting" "app_insights_diag" { for_each = azurerm_application_insights.app_insights name = "${each.key}-diag-setting" target_resource_id = each.value.id # 直接引用同一模块内App Insights的ID,一步到位 log_analytics_workspace_id = var.log_analytics_workspace_id # 替换成你的日志工作区ID变量 # 下面是示例日志和指标配置,按需调整 log { category = "AppAvailabilityResults" enabled = true retention_policy { enabled = false } } metric { category = "AllMetrics" enabled = true retention_policy { enabled = false } } }
关键注意点
- 用
for_each = azurerm_application_insights.app_insights可以让诊断设置和App Insights实例一一对应,不会出现漏配或错配的情况。 - 如果你的
var.app_insights_instances是列表类型,记得先转成映射(比如用toset()或者for表达式生成唯一键的map),因为for_each要求遍历的集合是键唯一的映射或集合。
内容的提问来源于stack exchange,提问作者uniholos
相关产品推荐
相关产品推荐

