EC2運用時に突然空き容量がなくなってサービス停止するといった事態を防ぐためにEC2の空き容量を監視して閾値を下回った場合にSlackへ通知するという機構を実装してみました。
参考にした公式資料はこちらです。
チュートリアル:Slackを使ってみる※英字ドキュメントのみですがChromeで日本語訳したら普通に読めます。
https://docs.aws.amazon.com/ja_jp/chatbot/latest/adminguide/slack-setup.html
Amazon SNS 通知の設定
https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/monitoring/US_SetupSNS.html
今回の構成図はこちら
CloudWatchAlarmで閾値超過を検知してSNSで拾い、Chatbot経由でSlackに通知するという流れです。この構成の良いところはサクッと作れるところです。悪いところは通知が全部英語でUTCになるところです。とはいえ、JSTはSlackへの通知時刻で確認できるしアラートに気付いて「むむむ」となってAWSコンソールを覗きにいってもUTC表記なので、通知だけJSTでもメリットはないかもです。
なお、作業する順序は、SNS⇒Chatbot⇒CloudWatchAlarmの順がやりやすいと思います。今回の作業もこの順序となります。
SNSトピックを作成する
CloudWatchAlarmとChatbotの登録の際にSNSトピックが必要になるため、先にSNSトピックを作成しておきます。
Amazon SNSのメニューからトピックを選択して「トピックの作成」をクリックします。
ChatbotのSlack通知ではFIFOタイプのトピックを設定できないため、タイプはスタンダードを選択します。
続いて、名前と表示名を入力してトピックの作成をクリックして作成します。
SlackにAWSアプリを追加して通知用チャネルを作成する
SlackへのAWSアプリの追加は、他のアプリと同じ方法です。
今回は通知用の専門チャネルを作成します。通知用チャネルを作成したらAWSアプリを追加しておきます。
ChatbotにSlackを追加する
Slackを立ち上げておきます。
AWSコンソールからAWS Chatbotを選択して「チャットクライアントを設定」でSalckを選択した後に「クライアントを設定」をクリックします。
ChatbotからSlackワークスペースへの接続権限を求める画面が表示されるので許可します。
AWSコンソールにSlackワークスペースが追加されます。
「新しいチャネルを設定」で通知先のチャネルを設定します。
設定名を入力ししたら、Slackチャネルを入力します。今回はプライベートチャネルに通知するので、そちらを選択します。
チャネルIDはSlackの対象チャネルの「チャネル詳細を取得する」ポップアップの一番下に記載されています。
アクセス許可では、今回はSlackへ通知するだけなので最小限のアクセス許可にします。
チャネルロールを選択して「テンプレートを使用してIAMロールを作成する」を選びます。ロール名もAWSChatbot-roleのままにします。
ポリシーテンプレートは「通知のアクセス許可」のみを選択します。
チャネルガードレールポリシーでは「CloudWatchReadOnlyAccess」を選択します。
通知では先ほど作成したSNSトピックを選択します。
なお、この作業で対象のSNSトピックにChatbot用のサブスクリプションが作成されます。SNSトピックを確認すると追加されているのが分かります。
CloudWatchアラームの作成
AWSコンソールからCloudWatchを選択してメニューからアラーム状態を選択します。「アラームの作成」をクリックします。
メトリクスの選択から監視対象のEC2のメトリクスを選択します。なお、1つのアラームに登録できるのは1のメトリクスのみです。
今回はメトリクスの設定は期間以外デフォルトのままにします。今回の期間は15分に設定します。
条件のしきい値は静的を選択し20以下に設定します。
通知ではアラーム状態を選択、既存のSNSトピックを選択を選び通知の送信先でSNSトピックを選択します。
続けて、「通知の追加」からOKとデータ不足の通知を追加します。
次ページで設定内容を確認したら「アラームの作成」のクリックでアラームを作成します。
テストメッセージの送信
ここまで設定が終わったら、送信テストをします。
Chatbotの設定済チャネルを選択して詳細画面を表示して「テストメッセージを送信」をクリックします。無事成功するとSlackの対象チャネルにAWSからメッセージが届きます。
なお、実際のアラートメッセージはこんな感じです。
なお「続きを見る」のクリックでメトリクスのグラフが表示されます。
おわりに
作業自体は、はまるポイントもなくサクサク作成することができました。
強いていうなら、多数のCloudWatchAlarmを1対1でSNSトピックに紐づけるかn対1で紐づけるかで迷いました。また、SNSトピックとSlackチャネルの紐づけ方も迷いました。あまり参考になりそうな資料がなかったので暫定として次のように設計しました。
CloudWatchAlarm:SNSトピック=n:1
SNSトピック:Slackチャネル=1:1
イメージはこんな感じです。
SNSトピックを複数にするメリットがなさそうな一方、複数にすると管理が煩わしそうなのでこの方法でいくことにしました。