5
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Ateam LifeDesignAdvent Calendar 2024

Day 18

AWSからSlackへの通知はChatbotを使おう!

Last updated at Posted at 2024-12-18

AWSからSlackへの通知はChatbotを使おう!

Slackの一定プランではチャンネルごとにメールアドレスを払い出せるため、私用で利用しているチャンネル以外はシステム通知に利用していました

AWSで利用していたときはLambdaのエラー通知やSQSでのデッドレターキューにたまったことや、EC2を利用していた環境が落ちた時の検知などです

AWSにはChatbotサービスがあり、これを利用するとより込み入った設定が行える他にSlack側からアクションを取れることを知ったので詳細に見ていきます :eyes:

とりあえず、何かしらの通知を送る目的で一通り設定して進めていきましょう

チャンネル単位で作成できる

一通りの流れ

  1. 適当なSNSトピックを作成
  2. Chatbotからクライアントの設定としてSlackを選択
  3. Slackのアプリ連携画面で許可をだす
  4. チャンネルの追加・設定諸々実施
  5. 送信をテストする

適当なSNSトピックを作成

ChatbotからSlackへ通知を飛ばす際にトリガーとしてSNSを利用します

なのでまずはAWSのSNSからトピックの作成を行います
この後Lambda経由で通知するのも行なっていくので LambdaNotifyと付けておきます
スクリーンショット 2024-12-18 0.32.36.png

サブスクリプションはChatbotの方で作成するので、トピックが作られたかどうかだけ確認しておきましょう

image.png

Chatbotのクライアント設定としてSlackを選択

次はAWS Chatbotの画面へ移動し、ChatbotのクライアントとしてSlack連携を進めましょう

画面右のチャットクライアントからSlackを選択し、「クライアントを設定」へ進みます
01.png

ブラウザ側でSlackにログインしている場合はこのように表示されると思います
02.png

許可するを選択するとSlackのワークスペースが追加されます
03.png

チャンネルの追加を行う

続いてはチャンネルへの連携を行ないます

ここでは下記のことを設定していきます

  • 設定名(自由記述可)
  • Slackチャンネル名
  • IAMロール名
  • SNSのトピック

それぞれ

  • notification-only
  • あらかじめ自身のSlackで作成しておいたチャンネルの「awsのためのチャンネル」
  • AWSChatbot-role
  • LambdaNotify

を設定します

スクリーンショット 2024-12-18 0.41.05.png

名称未設定.png

image.png

チャネルロール:チャンネル単位(今回は「awsのためのチャンネル」単位)でロールを割り当てるため、どのSlackアカウントだろうと一律で同じことができる

ユーザーレベルのロール: Slackのチャンネルにて↓のようなメッセージが表示され、チャンネルに参加しているユーザー単位で権限を柔軟に変更できる

スクリーンショット 2024-12-18 23.28.38.png

チャネルガードレールポリシー: チャネルロールおよびユーザーロールで実施する動作が
誤って予想していないような動作をすることを防ぐ目的のため設定した枠組みから超えないようにするポリシー
(名前の通りガードレール的な役割)

各種入力後にチャンネルの作成を押して↓のようにチャンネルに紐つくChatbotが作成されます

スクリーンショット 2024-12-18 22.43.43.png

送信をテストする

このままテストメッセージを送信してみます

このようにSlackメッセージが受信できれば確認完了です

スクリーンショット 2024-12-18 22.46.06.png

つぎはLambdaが失敗した時の通知を設定していきます

Lambdaが失敗したときの通知について

Lambdaの失敗通知についてはCloudwatchAlarm経由で行います

先ほどはこの順番で処理を行っていましたが

何かしらのイベントとして作用するのがCloudwatchAlarmで、そのAlarmが参照する指標としてLambdaを設定する形になります

追加で必要なことはLambdaを作ってCloudwatchAlarmを設定し、通知先をSNSのLambdaNotifyに設定を行うだけなので詳細は省きます

あらかじめLambdaが1分間に5回以上Errorを検出したときにCloudwatchAlarmが鳴るように設定しておき、意図的にLambdaでエラーを発生させると下記のようなSlackメッセージが届きます

スクリーンショット 2024-12-18 23.19.03.png

これで通知が届くことを確認できます、さらにshow logsやshow error logsを選択するとSlack上でLambdaのログを見れます

実際に show logsを選択すると↓の画像のようにログが表示されます
スクリーンショット 2024-12-18 23.23.14.png

実際にlogを取得する場合
このSlackチャンネルに送信するChatbotの権限として「CloudWatch Logsへのアクセス権限」が必要です
今回だとnotification-onlyという設定名に紐つく AWSChatbot-roleを変更してあげる必要がある

CloudwatchAlarmを介して通知する理由

↓の画像はLambdaの送信先設定画面です、こちらにSNSトピックが送信先として存在するのにわざわざCloudwatchAlarmを経由させるのはなぜでしょうか?

image.png

それは送るメッセージがChatbotの認識できるメッセージ形式の必要があります
仮に意図しないデータ形式の場合は下記のように not supported と言われてメッセージが飛んでこないままになります

cloudwatch log
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などには費用がかかるのでそこだけ気にしておきましょう

5
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?