
AWS Chatbotでカスタム通知がエラーに?Lambdaから直接Slackに通知する構成への変更
目次
AWSのコスト管理やサービスのアラートをSlackで受け取りたいというニーズは非常に多いかと思います。私も当初、Lambda -> SNS -> AWS Chatbot -> Slack という構成で、カスタムのコスト通知システムを構築しようとしました。しかし、この構成ではうまくいかず、最終的に Lambda -> Slack (Incoming Webhook) というシンプルな構成に落ち着きました。
本記事では、その過程で発生した問題と解決策について解説します。
発生した問題: Event received is not supported
ある日、AWS Chatbotと連携しているSlackチャンネルで、以下のようなエラーメッセージを受け取りました。
Event received is not supported (see https://docs.aws.amazon.com/chatbot/latest/adminguide/related-services.html ):
{
"subscribeUrl": null,
"type": "Notification",
"signatureVersion": "1",
"signature": "...",
"topicArn": "arn:aws:sns:ap-northeast-1:ACCOUNT_ID:aws-cost",
"signingCertUrl": "...",
"messageId": "...",
"message": "AWS Cost Report (2025-07)...",
"subject": "AWS Cost Notification",
"unsubscribeUrl": "...",
"timestamp": "2025-07-18T01:04:42.071Z",
"token": null
}
エラーメッセージにある公式ドキュメントのリンク を確認すると、AWS Chatbotがサポートしているのは、CloudWatchアラームやGuardDutyの検出結果など、特定のAWSサービスからの標準的な通知形式のみであることがわかります。
今回のように、Lambdaで整形した独自のJSONメッセージをSNSトピック経由で送信しても、Chatbotはそれを解釈できずにエラーとなってしまうのです。
解決策の模索
この問題を解決するために、いくつかのアプローチを検討しました。
代替案1: SNSから直接Slack Webhookをサブスクライブする
次に試したのが、Lambda -> SNS -> Slack (Incoming Webhook) という構成です。
これは、SNSトピックのサブスクリプションとして、SlackのIncoming WebhookのURLをHTTPSエンドポイントとして登録する方法です。しかし、この方法には「サブスクリプションの確認」というハードルがありました。
SNSはサブスクリプションを有効化するために、確認用のPOSTリクエストをエンドポイントに送信し、特定の形式で応答を返すことを要求します。しかし、SlackのIncoming Webhookは、この確認リクエストに正しく応答できないため、サブスクリプションを有効化することができませんでした。
最終的な解決策: Lambdaから直接Incoming Webhookを呼び出す
最終的に、Lambda -> Slack (Incoming Webhook) という最もシンプルな構成にたどり着きました。
Lambda関数内で、Pythonのrequestsライブラリなどを使って、直接SlackのIncoming Webhook URLにPOSTリクエストを送信します。
この方法には、以下のようなメリットがあります。
- 構成がシンプル: 登場するAWSサービスがLambdaのみになり、管理やデバッグが容易になります。
- メッセージの自由度が高い: SlackのAPI仕様に沿っていれば、ブロックキット などを使って非常に表現力豊かな通知を自由に作成できます。
- トラブルシューティングが容易: 問題が発生した場合、Lambdaのログを確認するだけで原因を特定しやすくなります。
まとめ
AWSのサービス連携は非常に強力ですが、各サービスの仕様や制約を正しく理解することが重要です。AWS Chatbotは設定が簡単で便利なサービスですが、今回のようにカスタム通知を送信したい場合には向いていないケースもあります。
要件によっては、AWSのサービスを多段に組み合わせるよりも、Lambdaから直接外部API(今回はSlackのIncoming Webhook)を呼び出すようなシンプルな構成が、かえって最適解になることもあるという教訓になりました。


