AWSからSlackに通知する方法についてまとめた

2021.12.07

こんにちは、CX事業本部の夏目です。

案件でAWSからSlackに通知を行う方法について調べる必要があったので、ブログにまとめてみました。

結論 (2021/12/07 17時追記)

  • AWS Chatbot <- SNS Topic (<- CloudWatch Alarm / EventBridge): Slackに投げる部分までAWSにおまかせ。任意の文字列を送ることは多分無理。
  • Slack <- Lambda: 手段が2つある
    • Incomming Webhook: 手軽。外部ライブラリは不要。任意の文字列を送信可能。
    • SDK (API): 任意の文字列の送信に加えて、ユーザー名やアイコンの変更も可能。
  • Slack <- EventBridge: EventBridgeでSlackのAPIにPostする。

何かを通知したいとき、CloudWatch MetricsやEventBridgeで検知できるのであればChatBotが一番簡単。
任意の文字列を送信したいならLambdaでやる必要があるけど、とりあえず文字列だけ遅れればいいのであれば Incomming Webhookでいい。ただ、アイコンなどを変更したいならSDKを使う必要がある。

(2021/12/07 17時追記) EventBridgeの機能を使ってHTTPのPostができるっぽいのでそれでも行けそう。

AWS Chatbot <- SNS Topic (<- CloudWatch Alarm / EventBridge)

Slackにメッセージを飛ばすのをAWSにまるっとおまかせする方法。
Slackにメッセージを送信する部分もAWSにまかせるから送信時のエラーとか気にしなくてよくなる。

CloudWatch AlarmやEventBridgeなどからSNS Topicへイベントが送信され、SNS TopicをサブスクライブしているAWS ChatBotがSlackに通知を行う。

それ以外にも対応しているイベント元はいっぱいある。

[アップデート] ついに AWS Chatbot が 200を超える Amazon EventBridge イベントに対応しました!

ついに来た! AWS Chatbot が一般公開(GA)になりました! Slack連携が捗ります!

Slack <- Lambda

Lambdaを使ってSlackにメッセージを送信する。
そのため、メッセージの内容の組み立てや送信などを自分で実装しないといけないが、好きなようにカスタマイズできる。

基本的にはSlack APIの次のエンドポイントを使用する。

主な実装方法は次の2つ。

  • Incomming Webhook: HTTPでPOSTを行いメッセージを送信する
  • SDK (API): SDKやAPIを使ってメッセージを送信する

前者はURLさえわかっていれば簡単に使用できるものの、いくつかの制限がある。

You cannot override the default channel (chosen by the user who installed your app), username, or icon when you're using Incoming Webhooks to post messages. Instead, these values will always inherit from the associated Slack app configuration.
advanced_message_formattingの末尾 (https://api.slack.com/messaging/webhooks#advanced_message_formatting)

そういったことをしようと思えば SDK (API)を使用する必要がある。

Slack <- EventBridge (2021/12/07 17時追記)

どうやら、EventBridgeでHTTPのPostができるから、それで直接Slackに送信することができるらしい。 (CM社内からの情報を得て知った)

【アップデート】EventBridgeのターゲットにHTTPのエンドポイントが指定可能になったので、EventBridgeから直接SlackのAPIを叩いてみた

CloudTrailなどのイベントを検知して動かし、入力トランスフォーマーでJSONを作って送信するみたい。

AWS ChatBotがEventBridgeのイベントに対応する前の記事だから、今だとChatBotで代替できるかも。
(入力トランスフォーマーで何かを埋め込みたいときに使うとかそんな感じかな?)

Boto3とかからイベントを発火させられるのであれば使いみちが結構ありそうな予感。
(SDKやAPIを使わずに送信できそう) (未検証)

まとめ

AWSからSlackにメッセージを送信する方法はこんな感じです。

  • AWS Chatbot <- SNS Topic (<- CloudWatch Alarm / EventBridge): Slackに投げる部分までAWSにおまかせ。任意の文字列を送ることは多分無理。
  • Slack <- Lambda: 手段が2つある
    • Incomming Webhook: 手軽。外部ライブラリは不要。任意の文字列を送信可能。
    • SDK (API): 任意の文字列の送信に加えて、ユーザー名やアイコンの変更も可能。
  • Slack <- EventBridge: EventBridgeでSlackのAPIにPostする。