AWSからSlackへの通知はChatbotを使おう!
Slackの一定プランではチャンネルごとにメールアドレスを払い出せるため、私用で利用しているチャンネル以外はシステム通知に利用していました
AWSで利用していたときはLambdaのエラー通知やSQSでのデッドレターキューにたまったことや、EC2を利用していた環境が落ちた時の検知などです
AWSにはChatbotサービスがあり、これを利用するとより込み入った設定が行える他にSlack側からアクションを取れることを知ったので詳細に見ていきます
とりあえず、何かしらの通知を送る目的で一通り設定して進めていきましょう
チャンネル単位で作成できる
一通りの流れ
- 適当なSNSトピックを作成
- Chatbotからクライアントの設定としてSlackを選択
- Slackのアプリ連携画面で許可をだす
- チャンネルの追加・設定諸々実施
- 送信をテストする
適当なSNSトピックを作成
ChatbotからSlackへ通知を飛ばす際にトリガーとしてSNSを利用します
なのでまずはAWSのSNSからトピックの作成を行います
この後Lambda経由で通知するのも行なっていくので LambdaNotifyと付けておきます
サブスクリプションはChatbotの方で作成するので、トピックが作られたかどうかだけ確認しておきましょう
Chatbotのクライアント設定としてSlackを選択
次はAWS Chatbotの画面へ移動し、ChatbotのクライアントとしてSlack連携を進めましょう
画面右のチャットクライアントからSlackを選択し、「クライアントを設定」へ進みます
ブラウザ側でSlackにログインしている場合はこのように表示されると思います
許可するを選択するとSlackのワークスペースが追加されます
チャンネルの追加を行う
続いてはチャンネルへの連携を行ないます
ここでは下記のことを設定していきます
- 設定名(自由記述可)
- Slackチャンネル名
- IAMロール名
- SNSのトピック
それぞれ
- notification-only
- あらかじめ自身のSlackで作成しておいたチャンネルの「awsのためのチャンネル」
- AWSChatbot-role
- LambdaNotify
を設定します
チャネルロール:チャンネル単位(今回は「awsのためのチャンネル」単位)でロールを割り当てるため、どのSlackアカウントだろうと一律で同じことができる
チャネルガードレールポリシー: チャネルロールおよびユーザーロールで実施する動作が
誤って予想していないような動作をすることを防ぐ目的のため設定した枠組みから超えないようにするポリシー
(名前の通りガードレール的な役割)
各種入力後にチャンネルの作成を押して↓のようにチャンネルに紐つくChatbotが作成されます
送信をテストする
このままテストメッセージを送信してみます
このようにSlackメッセージが受信できれば確認完了です
つぎはLambdaが失敗した時の通知を設定していきます
Lambdaが失敗したときの通知について
Lambdaの失敗通知についてはCloudwatchAlarm経由で行います
先ほどはこの順番で処理を行っていましたが
何かしらのイベントとして作用するのがCloudwatchAlarmで、そのAlarmが参照する指標としてLambdaを設定する形になります
追加で必要なことはLambdaを作ってCloudwatchAlarmを設定し、通知先をSNSのLambdaNotifyに設定を行うだけなので詳細は省きます
あらかじめLambdaが1分間に5回以上Errorを検出したときにCloudwatchAlarmが鳴るように設定しておき、意図的にLambdaでエラーを発生させると下記のようなSlackメッセージが届きます
これで通知が届くことを確認できます、さらにshow logsやshow error logsを選択するとSlack上でLambdaのログを見れます
実際に show logsを選択すると↓の画像のようにログが表示されます
実際にlogを取得する場合
このSlackチャンネルに送信するChatbotの権限として「CloudWatch Logsへのアクセス権限」が必要です
今回だとnotification-onlyという設定名に紐つく AWSChatbot-role
を変更してあげる必要がある
CloudwatchAlarmを介して通知する理由
↓の画像はLambdaの送信先設定画面です、こちらにSNSトピックが送信先として存在するのにわざわざCloudwatchAlarmを経由させるのはなぜでしょうか?
それは送るメッセージがChatbotの認識できるメッセージ形式の必要があります
仮に意図しないデータ形式の場合は下記のように not supported と言われてメッセージが飛んでこないままになります
Event received is not supported (see https://docs.aws.amazon.com/chatbot/latest/adminguide/related-services.html ):
{
"subscribeUrl": null,
"type": "Notification",
"signatureVersion": "1",
"signature": ........
カスタム通知のイベントスキーマに沿って送信するとChatbotが認識できるメッセージ形式で好きなメッセージを送信できます
まとめ
Slackの無料プランでもAWSからの通知を受け取れる方法でした
「どんなメッセージでも簡単に送れるし受け取れる!」というわけではないものの、一定AWSが気を利かせてSlackメッセージを送信してくれるのでとりあえずで使っていきたいですね
後、料金について書いてませんでしたがChatbotを利用するだけは費用がかからず
その周辺のSNSやCloudwatchAlarmなどには費用がかかるのでそこだけ気にしておきましょう