Terraform如何遍历复杂对象列表动态生成CloudWatch告警metric_query块?
问题根因
- 动态块
metric_query的遍历对象错误:local.alarm_WithExpression是包含多个告警配置的元组,没有metrics属性,你需要遍历的是当前告警实例的metrics列表,也就是资源级for_each迭代到的each.value.metrics - 动态块内部取值错误:资源级
for_each的迭代变量是each,动态块的迭代变量默认和动态块同名,也就是这里要使用metric_query.value取当前遍历到的指标配置,不能用each.value - 额外配置错误:原代码中
evaluation_periods赋值为each.value.period是错误配置,evaluation_periods是告警评估的周期数,不是单周期时长,结合你配置的datapoints_to_alarm = 2,这里应该改为2,否则会传入21600个评估周期,不符合预期。
修正后的完整资源配置
resource "aws_cloudwatch_metric_alarm" "metrics-withExpression_alarm" { for_each = local.prefix == "production" ? {} : {for index,m in local.alarm_WithExpression : index => m} alarm_name = "${local.prefix}-${each.value.name}" comparison_operator = each.value.comparison_operator evaluation_periods = 2 # 可根据实际业务评估需求调整,需大于等于datapoints_to_alarm取值 threshold = each.value.threshold treat_missing_data = each.value.treat_missing_data datapoints_to_alarm = each.value.data_points metric_query { id = "e" expression = each.value.expression return_data = true # 布尔值无需加引号 } dynamic "metric_query" { # 遍历当前告警对应的metrics列表 for_each = {for index, metric in each.value.metrics : index => metric} content { id = metric_query.value.id metric { metric_name = metric_query.value.name namespace = "${local.prefix}-metrics" period = metric_query.value.period stat = metric_query.value.statistic } } } }
内容的提问来源于stack exchange,提问作者Akram Dhiabi
相关产品推荐
相关产品推荐

