使用Terraform创建AWS Cloudwatch警报

4
这是一个关于cloudwatch_metric_alarm资源的示例:
    resource "aws_cloudwatch_metric_alarm" "nlb_healthyhosts" {
  alarm_name          = "alarmname"
  comparison_operator = "LessThanThreshold"
  evaluation_periods  = "1"
  metric_name         = "HealthyHostCount"
  namespace           = "AWS/NetworkELB"
  period              = "60"
  statistic           = "Average"
  threshold           = var.logstash_servers_count
  alarm_description   = "Number of healthy nodes in Target Group"
  actions_enabled     = "true"
  alarm_actions       = [aws_sns_topic.sns.arn]
  ok_actions          = [aws_sns_topic.sns.arn]
  dimensions = {
    TargetGroup  = aws_lb_target_group.lb-tg.arn_suffix
    LoadBalancer = aws_lb.lb.arn_suffix
  }
}

我仍然不理解Alarm Actions参数。在terraform文档中,我们有:
告警动作 - (可选)此告警转换为从任何其他状态的ALARM状态时执行的操作列表。每个操作都指定为Amazon资源名称(ARN)。
能否举一个具体的例子,例如发送电子邮件/和/创建SNS主题(没有现有主题ARN)。
非常感谢您的帮助。

3
aws_cloudwatch_metric_alarm 资源不处理实际的消息传递,无论是通过电子邮件、短信或其他方式。它唯一要做的就是将消息传递到在 alarm_actions 中定义的 SNS 主题。 - jellycsc
1个回答

5
如果您需要一个例子,它可能看起来像下面这样。
首先,您需要创建您的警报,并在警报操作字段中引用您的 SNS 主题 ARN:
resource "aws_cloudwatch_metric_alarm" "nlb_healthyhosts" {
  alarm_name          = "alarmname"
  comparison_operator = "LessThanThreshold"
  evaluation_periods  = "1"
  metric_name         = "HealthyHostCount"
  namespace           = "AWS/NetworkELB"
  period              = "60"
  statistic           = "Average"
  threshold           = var.logstash_servers_count
  alarm_description   = "Number of healthy nodes in Target Group"
  actions_enabled     = "true"
  alarm_actions       = [aws_sns_topic.alarm.arn]
  dimensions = {
    TargetGroup  = aws_lb_target_group.lb-tg.arn_suffix
    LoadBalancer = aws_lb.lb.arn_suffix
  }
}

然后创建SNS主题并将您的电子邮件订阅到该主题中:
# SNS topic to send emails with the Alerts
resource "aws_sns_topic" "alarm" {
  name              = "my-alarm-topic"
  kms_master_key_id = aws_kms_key.sns_encryption_key.id
  delivery_policy   = <<EOF
{
  "http": {
    "defaultHealthyRetryPolicy": {
      "minDelayTarget": 20,
      "maxDelayTarget": 20,
      "numRetries": 3,
      "numMaxDelayRetries": 0,
      "numNoDelayRetries": 0,
      "numMinDelayRetries": 0,
      "backoffFunction": "linear"
    },
    "disableSubscriptionOverrides": false,
    "defaultThrottlePolicy": {
      "maxReceivesPerSecond": 1
    }
  }
}
EOF
  ## This local exec, suscribes your email to the topic 
  provisioner "local-exec" {
    command = "aws sns subscribe --topic-arn ${self.arn} --protocol email --notification-endpoint ${var.your_email} --region ${var.main_region}"
  }
}


## KMS Key to encrypt the SNS topic (security best practises)
resource "aws_kms_key" "sns_encryption_key" {
  description             = "alarms sns topic encryption key"
  deletion_window_in_days = 30
  enable_key_rotation     = true
}

你好。我有一个问题想问。在AWS文档中,我看到在维度下仅提供了一些EC2实例可用的维度(如实例ID等)。在我的项目中,我使用了一种名为“类型”的标签来对我的实例进行分类,以HTTP或APP实例为例。是否有任何方法可以基于这些标记创建警报作为维度?即创建标记为“Http”的实例的警报和标记为“App”的实例的警报。非常感谢您的帮助。 - Nidorino94
我以前从未这样做过,但据我所知,可以使用自定义指标来完成。很抱歉我无法给您一个具体的例子。如果这个解决方案不符合您的要求,请发布一个新问题,我相信SO社区中的某个人一定能够帮助您。谢谢。 - Jaime S

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接