🐈

【障害検知】EC2のCPU使用率上昇時にSlack通知を行う

2022/08/28に公開約3,200字

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コマンドをインストールします。

https://gist.github.com/mikepfeiffer/d27f5c478bef92e8aff4241154b77e54
$ 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アラームを変更すれば、他のリソースの障害検知もできるので汎用的に使えそうです。

参考

https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/monitoring/ConsoleAlarms.html

https://aws.amazon.com/jp/builders-flash/202006/slack-chatbot/?awsf.filter-name=*all

Discussion

ログインするとコメントできます