【障害検知】EC2のCPU使用率上昇時にSlack通知を行う
3つのサービスを利用して、Slackに通知を飛ばしてみました。
- CloudWatchアラーム
- SNS
- Chatbot
EC2を起動する
CPU使用率を上昇させるためにsshするので、sshできるEC2を起動しておきます。OSはAmazonLinux2、インスタンスタイプはt3.nanoにしました。
SNSトピックの作成
スタンダードに設定し、それ以外はデフォルトのママで作成します。
CloudWatchアラームの作成
Cloudwatchのコンソール画面からアラームの作成を行います。
メトリクスの選択で作成したEC2インスタンスのCPUUtilizationを選択します。
次に通知を受け取りたいメトリクスのしきい値などを設定します。今回はCPU使用率が70%以上になったときに通知するようにしました。
通知先に先程作成したSNSトピックを指定します。
最後にアラーム名を入れ、アラームを作成します。
Chatbotのチャネルガードレールポリシーを作成する
Chatbotのチャネルガードレールポリシーに1つ以上IAMロールを指定しないといけないので作成します。
Cloudwatchのメトリクスをslack通知で閲覧できるように設定します(後ほど作成するチャンネルロールも同じ)
※IAMポリシーなのにみすって、lightkun-ec2-chatbot-test-role
という名前をつけてしまいました。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "VisualEditor0",
"Effect": "Allow",
"Action": [
"cloudwatch:Describe*",
"cloudwatch:Get*",
"cloudwatch:List*"
],
"Resource": "*"
}
]
}
チャネルガードレールポリシーで許可されていない権限は、後ほど作成するチャンネルロールで権限付与していても実行不可のようです。チャネルガードレールポリシーってなくてもよくね?と思うんですが、必須指定する必要あるんですかねぇ(ちょっとワカンナイ)、、、
Chatbotを作成する
Chatbotのコンソール画面から、[新しいクライアントを設定]をポチりslackを選択して、ワークスペースを作成します。
作成したワークスペースから、[新しいチャンネルを設定]をポチります。
チャネルIDには通知先のslackチャンネルのIDを指定します。
チャンネルロールは新規で作成します。
チャネルガードレールポリシーは先程作成したIAMポリシー(lightkun-ec2-chatbot-test-role
)を選択します。
先程作成したSNSトピックを指定し、設定をポチります。
※SNSトピックがFIFOの場合FIFO SNS Topics are not supported とエラーになり、作成できません。
作成できたら、[テストメッセージを送信]で疎通確認をしておきます。
通知が飛ぶか確認
EC2のCPU使用率を上げて、通知がslackに飛ぶことを確認していきます。
AmazonLinux2の場合、yum install stress
だけだと上手く行かなかったので、以下のようにstressコマンドをインストールします。
$ sudo amazon-linux-extras install epel -y
$ sudo yum install stress -y
負荷をかけてみます。
$ stress -c 4
通知がちゃんと来ました。
CPU使用率が下がったときにも通知を飛ばす
70%以下に下がった時は通知が来ないので、CloudWatchアラームの設定追加をします。
ちょっとここで躓いたのですが、同じCloudWatchアラームで[通知の追加]をポチって、OKの場合を追加すれば設定できました。
Alarmの通知が来たところで、stressコマンドを停止し,70%以下になったときにOKの通知が飛びました。
Cloudwatchアラームを変更すれば、他のリソースの障害検知もできるので汎用的に使えそうです。
参考
Discussion