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

Terraform根/子模块for_each配置:多Prometheus告警规则实例创建

配置Terraform根模块与子模块的for_each以生成多组Prometheus告警规则

根据需求,分两种常见场景给出配置方案,核心是明确根模块与子模块的参数传递逻辑,以及for_each的正确使用方式:

场景1:根模块创建多个子模块实例(每个实例对应一个告警规则组)

这种方式下,每个告警规则组对应独立的子模块实例,便于单独管理资源的生命周期或依赖关系。

根模块配置

先定义存储告警规则的变量,再通过for_each遍历该变量创建子模块实例:

# 定义Prometheus工作区ID变量
variable "prometheus_id" {
  type = string
}

# 定义告警规则集合变量,key为规则组名称,value为规则配置
variable "alert_rules" {
  type = map(object({
    alert     = string
    expr      = string
    period    = string
    severity  = string
    summary   = string
  }))
}

# 创建多个子模块实例,每个实例对应一条告警规则
module "alert-rules" {
  source = "./module/alert-rules"

  prometheus_id   = var.prometheus_id
  for_each        = var.alert_rules  # 遍历告警规则集合,每个key-value对应一个子模块实例
  rule_group_name = each.key         # 传递规则组名称给子模块
  alert_config    = each.value       # 传递规则具体配置给子模块
}

子模块配置

子模块接收根模块传入的单个规则参数,无需使用for_each,直接创建对应资源:

# 接收根模块传入的Prometheus工作区ID
variable "prometheus_id" {
  type = string
}

# 接收根模块传入的规则组名称
variable "rule_group_name" {
  type = string
}

# 接收根模块传入的单个告警规则配置
variable "alert_config" {
  type = object({
    alert     = string
    expr      = string
    period    = string
    severity  = string
    summary   = string
  })
}

# 创建单个Prometheus规则组命名空间资源
resource "aws_prometheus_rule_group_namespace" "alert-rules" {
  name         = var.rule_group_name
  workspace_id = var.prometheus_id
  data         = <<EOF
groups:
  - name: ${var.rule_group_name}
    rules:
    - alert: ${var.alert_config.alert}
      expr: ${var.alert_config.expr}
      for: ${var.alert_config.period}
      labels:
        severity: ${var.alert_config.severity}
      annotations:
        summary: ${var.alert_config.summary}
EOF
}

场景2:单个子模块实例生成多个告警规则组

如果所有告警规则组属于同一逻辑集合,可在子模块内部使用for_each遍历根模块传入的规则集合:

根模块配置

直接将完整的规则集合传递给子模块,无需在根模块使用for_each:

variable "prometheus_id" {
  type = string
}

variable "alert_rules" {
  type = map(object({
    alert     = string
    expr      = string
    period    = string
    severity  = string
    summary   = string
  }))
}

module "alert-rules" {
  source = "./module/alert-rules"

  prometheus_id = var.prometheus_id
  alert_rules   = var.alert_rules  # 传递完整的规则集合给子模块
}

子模块配置

在子模块内部使用for_each遍历传入的规则集合,生成多个规则组资源:

variable "prometheus_id" {
  type = string
}

variable "alert_rules" {
  type = map(object({
    alert     = string
    expr      = string
    period    = string
    severity  = string
    summary   = string
  }))
}

# 遍历规则集合,每个key-value对应一个规则组资源
resource "aws_prometheus_rule_group_namespace" "alert-rules" {
  name         = each.key
  workspace_id = var.prometheus_id
  for_each     = var.alert_rules  # 子模块内部使用for_each遍历规则集合
  data         = <<EOF
groups:
  - name: ${each.key}
    rules:
    - alert: ${each.value.alert}
      expr: ${each.value.expr}
      for: ${each.value.period}
      labels:
        severity: ${each.value.severity}
      annotations:
        summary: ${each.value.summary}
EOF
}

关键说明

  • 场景1适合需要对单个规则组做独立配置(如不同的lifecycle规则)的场景;场景2适合规则组逻辑统一、无需单独管理的场景。
  • 根模块中无需将规则集合包装在data键下,直接传递原始的规则map即可,这样for_each能正确识别每个独立的规则项。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 07:32:24