深夜の怠惰な技術ブログ

日々の技術的な話題などを徒然なるままに

CloudWatch AlarmをAWS ChatbotによりSlackに通知する方法

はじめに

今回は表題通り、CloudWatch AlarmSNSAWS Chatbotを利用したSlack通知の実現方法を記載していきます。 私自身はIaC(Infrastructure as Code)としてはTerraformを利用します。ただし、現在TerraformはAWS Chatbotに対応しておりません。 そのため、AWS ChatbotだけはAWS マネジメントコンソールで作成していきます。また、通知先となるSlack Channelについてはすでに作成済みであることとします。

アーキテクチャ

f:id:ymyuta:20211204145251p:plain
CloudWatch AlarmからSlack ChannelへのAWS Chatbotを利用した通知

CloudWatch Alarmの作成

まずは、CloudWatch Alarmの作成となります。 ここでは、ALB(Application Loadbalancer)TargetgroupにおけるHealthyHostCountに対して、しきい値を設けていきます。 なお、Targetgroupでは1つのHost(ECSにおけるTask)が実行されている状況が正常とします。

resource "aws_cloudwatch_metric_alarm" "sample" {
  alarm_name          = "SampleAlarm"
  alarm_description   = "Sample Alarm Verify For Slack Notification"
  comparison_operator = "LessThanThreshold"
  evaluation_periods  = 1
  datapoints_to_alarm = 1
  metric_name         = "HealthyHostCount"
  namespace           = "AWS/ApplicationELB"
  dimensions = {
    "LoadBalancer" = "app/<alb_name>/exmaple8e4b2d09"
    "TargetGroup"  = "targetgroup/<targetgroup_name>/exampled7739b8e7"
  }
  period        = 60
  statistic     = "Average"
  threshold     = 1
  alarm_actions = [var.cloudwatch_alarm_sns_topic_arn] // 後ほど作成するSNS Topicに対するARNとなります。 
  ok_actions    = [var.cloudwatch_alarm_sns_topic_arn] // 後ほど作成するSNS Topicに対するARNとなります。 
}

上記は、該当のCloudWatch Alarmを作成する上でのTerraformコードになります。ここで重要なポイントにしぼって説明します。

対象となるCloudWatch Metricsの指定方法

今回は先述の通り、対象のCloudWatch MetricsはALB(Application Loadbalancer)TargetgroupにおけるHealthyHostCountとなります。 これらを指定するのに必要な設定値としては、namespacedimensionsmetric_nameです。

しきい値の指定方法

しきい値を指定する設定はthresholdcomparison_operatorになります。 正常なHost数は1であるため、Host数が1未満となったら異常状態とするために、comparison_operatorはLEssThanThresholdとしています。

SNSとの連携

CloudWatch Alarmが取り得る状態としては、異常(Alarm)正常(OK)No Dataの3種類です。 それぞれの状態に遷移した際に、SNSへトピックを発行することができます。 状態ごとに発行先のSNSを指定することができますが、今回はすべて同じSNSを指定しています。 Terraformコードでは対象SNSのARNを記述することになります。

SNSの作成

CloudWatch Alarmがトピックを発行するためのSNSを作成します。

resource "aws_sns_topic" "sample" {
  name = "cloudwatch-alarm-topic"
}

resource "aws_sns_topic_policy" "sample" {
  arn = aws_sns_topic.sample.arn
  policy = jsonencode({
    Version = "2012-10-17"
    Statement = [
      {
        Effect = "Allow"
        Action = ["sns:Publish"]
        Principal = {
          Service = "cloudwatch.amazonaws.com"
        }
        Resource = aws_sns_topic.sample.arn
        Condition = {
          ArnLike = {
            "aws:SourceArn" = "arn:aws:cloudwatch:<region>:<account_id>:alarm:<alarm_name>"
          }
        }
      }
    ]
  })
}

AWS Chatbotの作成

AWS Chatbotの設定については先述の通りAWS マネジメントコンソールにて実施していきます。 まずは、チャットクライアントの設定にてSlackを指定します。

SlackのPrivate Channelにおける対応について

ひとつだけ、対象のSlack ChannelがPublicの場合には設定はAWS Chatbotのみで完結します。 ただし、Private Channelの場合には対象のChannelに対してAWSユーザをInviteする必要があります。

f:id:ymyuta:20211205144847p:plain
AWS Chatbotにおけるチャットクライアントの設定
f:id:ymyuta:20211205144929p:plain
チャットクライントにおけるSlackの指定
設定を実施すると、Slackへのアクセス許可を求められるので、問題なければ承認を実施します。 問題無く連携が完了したら、新たなChannelを追加することで連携することができます。

さいごに

いかがだったでしょうか。シンプルな内容で学びもそれほど多くはないかもしれませんが、備忘のために記載しました。 引き続き、よろしくお願い致します。