【问题标题】:Iterate through list of servers and create alerts for each server?遍历服务器列表并为每个服务器创建警报?
【发布时间】:2021-04-08 06:50:13
【问题描述】:

我有一个服务器列表,如下所示,我需要为其创建 cloudwatch 警报。我似乎找不到很多这样的例子。

variable "vms" {

type = list

default = ["server1","server2","server3"]

}

我想将 for_each 用于我的 cloudwatch 警报:

resource "aws_cloudwatch_metric_alarm" "ec2-warning" {

count = length(var.vms)

for_each = {for vms in var.vms: vm.host => vms}

alarm_name = 

comparison_operator = "GreaterThanThreshold"

evaluation_periods = "1"

metric_name = "disk_used_percent"

namespace = "CWAgent"

dimensions = {

path = "/"

fstype = "xfs"

host = data.aws_instance.myec2.private_

dnsdevice = "xvda1"

}

编辑:我相信我需要做这样的事情

locals {
  my_list = [
    "server1",
    "server2",
    "server3",
    "server4"
  ]
}

resource "aws_cloudwatch_metric_alarm" "ec2-disk-space-warning-for" {
  for_each = toset(local.my_list)
  alarm_name          = {each.key}-"ec2-disk-space-warning"
  comparison_operator = "GreaterThanThreshold"
  evaluation_periods  = "1"
  metric_name         = "disk_used_percent"
  namespace           = "CWAgent"
  dimensions = {
    path   = "/"
    fstype = "xfs"
    host   = {each.key}
    device = "xvda1"
  }

【问题讨论】:

  • 您好,我还注意到您有很多问题。他们都有答案,但没有一个被接受。接受有帮助的答案是一种很好的做法,因为这会限制重复的数量,并在将来通知其他有类似或相同问题的用户,给出的答案是正确的。
  • 正确。不过,我在 17 小时内无法接受我的回答。

标签: amazon-web-services terraform amazon-cloudwatch cloudwatch-alarms


【解决方案1】:

如果需要,您可以使用您的 var.vms。不需要locals。但是,在您的第一次尝试中,您不能同时使用countfor_each。在您的第二次尝试中,您缺少一些参数statisticperiod)并错误地使用string interpolation

因此,应该尝试以下方法:

variable "vms" {
   type = list
   default = ["server1","server2","server3"]
}


resource "aws_cloudwatch_metric_alarm" "ec2-disk-space-warning-for" {
  for_each            = toset(var.vms)
  alarm_name          = "${each.key}-ec2-disk-space-warning"
  comparison_operator = "GreaterThanThreshold"
  evaluation_periods  = "1"
  metric_name         = "disk_used_percent"
  namespace           = "CWAgent"
  statistic           = "Average"
  period              = 60
  dimensions = {
    path   = "/"
    fstype = "xfs"
    host   = each.key
    device = "xvda1"
  }
}

如果您的自定义指标不存在,警报将不起作用,但我假设指标正常工作并且设置正确。

【讨论】:

  • 我也意识到我有维度 = { instanceid = data.aws_instance.myec2.instance_id instancename = data.aws_instance.myec2.private_dns } 但不确定这些将如何与 for_each 一起使用。看起来我需要一个 for_each 来存储数据?
  • @user2499710 我认为最好为这个新问题提出新问题并提供相关细节。
【解决方案2】:

这终于对我有用了

locals {
  my_list = [
    "server1",
    "server2",
    "server3",
    "server4"
  ]
}

resource "aws_cloudwatch_metric_alarm" "ec2-disk-space-warning" {
  for_each            = toset(local.my_list)
  alarm_name          = "ec2-disk-space-warning-for-${each.key}"
  comparison_operator = "GreaterThanThreshold"
  evaluation_periods  = "1"
  metric_name         = "disk_used_percent"
  namespace           = "CWAgent"
  dimensions = {
    path   = "/"
    fstype = "xfs"
    host   = each.key
    device = "xvda1"
  }

【讨论】:

  • 我很惊讶这个工作,因为我认为threshold 是必要的。
  • @John threshold 不是必需的,默认情况下将使用 0。但是statisticperiod 是必需的,所以警报不会像您注意到的那样部署。
  • 你们俩都是对的。这只是问题代码的一个 sn-p。为混乱道歉。
  • @user2499710 我能知道你为什么不同意我的回答并接受你自己的愿望是基于我的。此外,您的答案不会按照 cmets 中的说明进行部署。
  • @marcin ,抱歉那是错误的。修复。感谢您的帮助。
猜你喜欢
  • 2021-04-09
  • 1970-01-01
  • 1970-01-01
  • 2014-09-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多