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
相关产品推荐
相关产品推荐

