メインコンテンツにスキップ
aws

AWS Chatbotでカスタム通知がエラーに?Lambdaから直接Slackに通知する構成への変更

タグ: 🏷 aws ,lambda ,sns ,chatbot ,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)を呼び出すようなシンプルな構成が、かえって最適解になることもあるという教訓になりました。