Terraform AWS Cloudwatch 警报

Posted

技术标签:

【中文标题】Terraform AWS Cloudwatch 警报【英文标题】:Terraform AWS Cloudwatch alarm 【发布时间】:2021-05-25 23:37:57 【问题描述】:

这是cloudwatch_metric_alarm resource 的示例:

    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
  

我仍然不明白警报操作参数。在 terraform 文档中,我们有:

alarm_actions - (可选)当此警报从任何其他状态转换为 ALARM 状态时要执行的操作列表。每个 action 被指定为 Amazon 资源名称 (ARN)。

谁能给我一个具体的例子,例如发送电子邮件/和/创建一个 SNS 主题(没有退出主题 ARN)。

非常感谢您的帮助。

【问题讨论】:

aws_cloudwatch_metric_alarm 资源不处理实际的消息传递,无论是通过电子邮件、SMS 还是其他方式。它唯一要做的就是将消息传递给在alarm_actions 中定义的 SNS 主题。 【参考方案1】:

如果您正在寻找一个示例,它看起来如下所示。

首先,您需要创建警报并在警报操作字段中引用您的 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 - 等....)。在我的项目中,我使用一个名为“Type”的标签将我的实例分类为 HTTP 或 APP 实例。有没有办法根据这些标签作为维度创建警报?意思是为带有标签“Http”的实例创建警报,并为标记为“App”的实例创建警报。提前非常感谢您 我以前从来没有这样做过,但是 afik 这可以用custom metrics 来完成,很抱歉我不能给你一个具体的例子。如果此解决方案不符合您的要求,请发布一个新问题,我相信 SO 社区中的某个人将能够帮助您。谢谢,

以上是关于Terraform AWS Cloudwatch 警报的主要内容,如果未能解决你的问题,请参考以下文章

用于查找和填充 AWS cloudwatch 警报本身的 Terraform

用于 ECS 任务/容器的 Terraform AWS CloudWatch 日志组

如何将 AWS cloudwatch 事件添加到基于具有 terraform 的容器映像的 aws_lambda_function?

如何编写 terraform 代码来为过多的数据库连接创建 aws_cloudwatch_metric_alarm?

使用 Terraform 的 CloudWatch 指标警报

当代码移动到模块时,Terraform 正在破坏 AWS 资源