首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在一个资源中查找两个列表

在一个资源中查找两个列表
EN

Stack Overflow用户
提问于 2021-01-04 18:34:36
回答 2查看 192关注 0票数 0

我正在为UnHealthyHostCountmetric的aws中的一个北草坪会议大楼创建云监视警报

我的NLB的定义如下:

代码语言:javascript
运行
复制
variable "lb" {
  type    = list
  default = [
"net/lb01/bb087",
"net/lb01/bb088"
]
}

我的目标群体如下:

代码语言:javascript
运行
复制
variable "lb_tg" {
  type    = list
  default = [
    "targetgroup/newtargetlkinjk/3dac",
    "targetgroup/newtargetlkinjk/3d0d"
  ]
}

然后,我对它们使用数据源如下:

代码语言:javascript
运行
复制
data "aws_lb_target_group" "my_lb_target_group" {

  for_each = toset(var.lb_tg)

  tags = {
    name = each.key
  }
}

data "aws_lb" "my_lbs" {

  for_each = toset(var.lb)

  tags = {
    name = each.key
  }
}

然后,我试着用这两种方法来报警。

代码语言:javascript
运行
复制
resource "aws_cloudwatch_metric_alarm" "nlb-target-unhealthy-warning" {

  for_each = data.aws_lb_target_group.my_lb_target_group

  alarm_name          = "nlb-target-unhealthy-warning-for-${each.key}"
  comparison_operator = "GreaterThanThreshold"
  evaluation_periods  = "3"
  metric_name         = "UnHealthyHostCount"
  namespace           = "AWS/NetworkELB"
  dimensions = {
    TargetGroup  = each.key
    LoadBalancer = ???
  }
  period                    = "60"
  statistic                 = "Average"
  threshold                 = "0"
  alarm_description         = "This warning metric monitors unhealthy hosts behind the NLB for ${each.key}"
  actions_enabled           = true
  alarm_actions             = [data.aws_sns_topic.my_sns.arn]
  insufficient_data_actions = []
  treat_missing_data        = "notBreaching"
}

由于警报已经在使用for_each = data.aws_lb_target_group.my_lb_target_group,我如何同时提供data.aws_lb.my_lbs中的值,这是维度负载均衡器所需要的。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-01-04 23:50:35

我不相信您的数据源是有效的,因为它们似乎不正确,因为您无法从我所能知道的范围内通过标记搜索LBs或TGs。

但是无论如何,我试图复制这个问题,并且我假设每个都有一个目标组,并且您的变量lblb_tg在结对中是匹配的,即nlb1 - tg1nlb2 - tg2

在这种情况下,可以使用count创建警报。

代码语言:javascript
运行
复制
resource "aws_cloudwatch_metric_alarm" "nlb-target-unhealthy-warning" {

  count               =  length(var.lb)

  alarm_name          = "nlb-target-unhealthy-warning-for-${var.lb_tg[count.index]}"
  comparison_operator = "GreaterThanThreshold"
  evaluation_periods  = "3"
  metric_name         = "UnHealthyHostCount"
  namespace           = "AWS/NetworkELB"  
   
  dimensions = {
    TargetGroup  = data.aws_lb_target_group.my_lb_target_group[var.lb_tg[count.index]].arn_suffix
    LoadBalancer = data.aws_lb.my_lbs[var.lb[count.index]].arn_suffix
  }  
  
  period                    = "60"
  statistic                 = "Average"
  threshold                 = "0"
  alarm_description         = "This warning metric monitors unhealthy hosts behind the NLB for ${var.lb_tg[count.index]}"
  actions_enabled           = true
  alarm_actions             = [data.aws_sns_topic.my_sns.arn]
  insufficient_data_actions = []
  treat_missing_data        = "notBreaching"
}
票数 1
EN

Stack Overflow用户

发布于 2021-01-06 01:17:20

考虑到这些负载均衡器和目标组对是相互关联的,我建议将它们表示为一个单一变量,以便它们之间的相关性更加明确,如下所示:

代码语言:javascript
运行
复制
variable "target_groups" {
  type = map(object({
    load_balancer = string
    target_group  = string
  }))
}

因此,在调用方中定义此变量的语法如下:

代码语言:javascript
运行
复制
  target_groups = {
    lb01 = {
      load_balancer = "net/lb01/bb087"
      target_group  = "targetgroup/newtargetlkinjk/3dac"
    }
    lb02 = {
      load_balancer = "net/lb01/bb088"
      target_group  = "targetgroup/newtargetlkinjk/3d0d"
    }
  }

这不仅使将来的读者更容易看到哪些负载平衡器与哪个目标组相对应,还提供了一个将它们与模块内两者关联起来的关键。

代码语言:javascript
运行
复制
resource "aws_cloudwatch_metric_alarm" "nlb-target-unhealthy-warning" {
  for_each = var.target_groups

  alarm_name          = "nlb-target-unhealthy-warning-for-${each.key}"
  comparison_operator = "GreaterThanThreshold"
  evaluation_periods  = "3"
  metric_name         = "UnHealthyHostCount"
  namespace           = "AWS/NetworkELB"
  dimensions = {
    TargetGroup  = each.value.target_group
    LoadBalancer = each.value.load_balancer
  }
  period                    = "60"
  statistic                 = "Average"
  threshold                 = "0"
  alarm_description         = "This warning metric monitors unhealthy hosts behind the NLB for ${each.key}"
  actions_enabled           = true
  alarm_actions             = [data.aws_sns_topic.my_sns.arn]
  insufficient_data_actions = []
  treat_missing_data        = "notBreaching"
}

如果您有充分的理由需要将这两个列表单独保存在输入中,则可以在模块中以如下的本地值组合这两个列表:

代码语言:javascript
运行
复制
locals {
  target_groups = [
    for i, lb in var.lb : {
      load_balancer = lb
      target_group  = var.lb_tg[i]
    }
  ]
}

然后,您可以在我在上面的第一个示例中使用local.target_groups的地方使用var.target_groups,效果是相同的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65567986

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档