CloudWatch AlarmをAWS Chatbotを使ってSlackに通知する
はじめに
今回は表題通り、CloudWatch AlarmとSNS、AWS Chatbotを利用したSlack通知の実現方法を記載していきます。 私自身はIaC(Infrastructure as Code)としてはTerraformを利用します。 ただし、現在TerraformはAWS Chatbotに対応しておりません。 そのため、AWS ChatbotだけはAWS マネジメントコンソールで作成していきます。 また、通知先となるSlack Channelについてはすでに作成済みであることとします。
アーキテクチャ
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となります。 これらを指定するのに必要な設定値としては、namespace、dimensions、metric_nameです。
しきい値の指定方法
しきい値を指定する設定はthresholdとcomparison_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する必要があります。
設定を実施すると、Slackへのアクセス許可を求められるので、問題なければ承認を実施します。 問題無く連携が完了したら、新たなChannelを追加することで連携することができます。
さいごに
いかがだったでしょうか。シンプルな内容で学びもそれほど多くはないかもしれませんが、備忘のために記載しました。 引き続き、よろしくお願い致します。