😎

CloudWatch Alarm から Slack チャンネルへの投稿

2022/05/16に公開

AWS Chatbot を利用

これまでも CloudWatch から AWS SNS を経由して Slack に投稿することはできましたが、AWS Chatbot を利用すると簡単に実現できましたので、行ったことをまとめました。

EC2 死活監視

最も基本的なパターンの EC2 死活監視を行い、問題が発生したときに Slack のチャンネルにメッセージが送られるように設定します。

SNS 準備編

AWS SNS の設定

まずは、SNS(Simple Notification Service) の設定が必要です。コンソールから SNS を選択します。

トピックの作成

最初にトピックの作成が必要です。タイプは「スタンダード」で、後はデフォルトのままでよいです。トピックの名前は今回 "test" としています。

サブスクリプションの作成

次に、サブスクリプションの作成が必要になります。選択する連絡先を E-Mail にしますので、プロトコルで EMAIL を選択し、エンドポイントにメールアドレスを記述します。後はデフォルトで問題ありません。

設定を行うと指定したメールアドレスに確認メールが送られてきますので、"Comfirm subscription" をクリックして確認状態にします。

これで、SNS の設定は完了です。

CloudWatch アラームの設定

設定したい EC2 インスタンスを選択します。
[詳細] などの並びに [ステータスチェック] タブがあるので、それを選択します。

表示された画面の [アクション] ドロップダウンリストから [ステータスチェックアラームを作成] を選択するとCloudWatch アラームの管理 画面が表示されます。

アラームの追加または編集では、[アラームを作成] を選択します。編集の場合は [アラームを検索] ドロップダウンリストにこれまで作成したアラームのリストが表示されますので、そこから選択します。

アラーム通知はドロップダウンリストに作成した AWS SNS のリストが表示されますので、そこから "test" を選択します。

アラームアクションは今回設定しないので、何も設定しません。

アラームのしきい値は [Type of data to sample] から [ステータスチェックの失敗:いずれか] を選択します。[連続した期間] や [期間] はテスト用なので "1" と "5分" を設定し、[アラーム名] はそれと分かる名前をつけます。今回は "test-StatusCheckFailed" としています。

[ステータスチェックの失敗:いずれか] ですが、EC2 は基本的に2つのレベルでステータスのチェックが行われているそうです。1つはインスタンスレベルでインスタンスの状態を監視し、もう1つはシステムレベルでインスタンスより下の AWS のシステムレベルで状態を監視しています。

https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/monitoring-system-instance-status-check.html

今回はどちらの場合でも連絡がほしいので、"いずれか" を選んでいます。
最後に [作成] を選択してアラームの作成は完了です。

SNS テスト編

Chatbot を設定する前に、SNS がちゃんと発砲されるかテストしておきます。

NIC 無効化

ネットで調べるとインスタンスの NIC を無効化することでインスタンスステータスが確認できずアラームが発行されるとのことでしたので、これを試してみました。
インスタンスに SSH 等でログインして、次のコマンドを発行します(インスタンスは Amazon Linux が稼働しているもので試しました)。

$ ifdown eth0

正しく設定されていれば、SNS で設定したメールアドレスにアラームメールが届きます。
ですが、NIC を無効化しているのでその後操作ができません。自分は復旧に EC2 再起動をかけましたが、イマイチ面倒です。

aws cli

次に、aws cli で CloudWatch へ set-alarm-state を用いることでステータスを強制的に変えることができるとのことでしたので、こちらを試しました。

% aws cloudwatch set-alarm-state --alarm-name "test-StatusCheckFailed" --state-value ALARM --state-reason "alarm_test" 

set-alarm-state を使用して --alarm-name オプションでアラーム名を指定し、--state-value オプションで設定したい状態を指定します。今回は ALARM です。コマンド発行後、想定通りアラームメールが送られてきました。
その後のインスタンスのステータスチェックが走るタイミングで最新ステータスが反映されるので、OK 状態に戻ります。確認であればこちらのほうが簡単です。

Chatbot 準備編

次に、Chatbot の設定を行います。

Chatbot の設定

コンソールから Chatbot を選択します。今回は Slack 連携するのでチャットクライアントで Slack を選択します。

初めての場合、ワークスペースにサインインするための画面が出ますので、ワークスペースを指定しその後アクセス権限を許可する画面に遷移するので [許可] を選択します。

次に、Slack チャネルでメッセージを送るチャネル名を入力します。

アクセス許可では、まずはメッセージを送るだけの想定なので [チャネルIAMロール] を選択し、同様の理由で [チャネルガードレールポリシー] も [CloudWatchReadOnlyAccess] を設定しました。

最後に通知 - オプションで SNS トピックを指定します。今回は先にある "test" を設定しました。

これで設定は終了です。

Chatbot テスト編

テストは "SNS テスト編" 同様に aws cli を用いてステータスを変更してテストしました。今回はメールとともに Slack への投稿も確認できました。

SNS の設定ができていれば、Chatbot の設定のみなので非常に短時間で Slack 投稿が実現可能です。

番外編

Discussion