CloudWatch Alarm と Slack の連携は SNS + Lambda ではなく SNS + AWS Chatbot が簡単で管理も楽
CloudWatch AlarmはCloudWatchのメトリクスを監視し、それが事前に決めた条件を満たすと通知してくれる便利なサービスです。
例えば、CPU利用率が80%を超えたら通知するといったことができます。
CloudWatch Alarmでの通知にはSNS(Simple Notification Service)のトピックを指定することができ、そのトピックと連携することが様々な通知を実現できます。
通知の方法としてよくあるのはSlackへの通知です。
CloudWatch Alarmによる監視の結果をSlackへ通知するようにすることで、異常にすぐに気が付きます。
そんなSlackとの連携ですが、調べるとよく出てくるのが、サブスクライバーとしてLambdaを使い、LambdaからSlackにIncoming Webhookを用いて情報を送るというものです。
Lambdaの関数を作る際に指定できるテンプレート(設計図)にも「cloudwatch-alarm-to-slack-python」というものが用意されており、これらを使えば簡単に作成し設定することはできます。
ですが、より簡単な方法があります。
それがAWS Chatbotを使う方法です。
aws.amazon.com
AWS Chatbotは現在ベータ版ではありますが、コードを一切書かずに、SNSをトリガーにしてSlackに通知するということがとても簡単に実現できます。
まずは、チャットクライアントとしてSlackを選択して「クライアントを設定」を押します。
そうすると、ブラウザでログインしているSlackのワークスペースについて権限を求められるので、ワークスペースと内容をしっかりと確認しつつ許可します。
これでChatbotとSlackの連携は完了です。
あとは、「新しいチャネルを設定」から、CloudWatch Alarmが通知しているSNSトピックとSlackの好きなチャンネルを組み合わせるだけで、CloudWatch Alarm + SNS + Chatbot + Slackの連携は完了です。
Lambdaで設定する場合は、テンプレートをそのまま使うにしてもWebhook URLの設定などが必要ですし、何よりLambda自体の管理が必要になってくるので、少し煩わしいです。
それに比べてChatbotを使う場合は、コードを一切書く必要がなく、メンテナンスも基本的に不要なので、管理もとても楽です。
ただ、Chatbotの場合は通知の内容や表現方法を変更することができないので、CloudWatch Alarmからの情報をいい感じに組み立てて独自のやり方と見せ方で通知したいという場合には向いていません。
また、現時点でベータ版なので今後どうなるかわかりませんし、AWSのGoのSDKでのサポートがまだであるためには現時点ではterraformで利用することもできません。
github.com
これらの違いを比べて、どちらを使うか決めればよいかと思います。