AWS Chatbot仅推送测试消息至Slack,正常SNS消息无法送达问题咨询
我配置了一个SNS主题,包含两个订阅者:
- AWS Chatbot
- 邮箱地址
通过AWS控制台的AWS Chatbot UI点击「发送测试消息」按钮时,两个订阅者都能收到消息:Slack频道能看到消息,邮箱也能收到邮件。但如果用AWS CLI或SNS主题UI的「发布消息」按钮发送消息,只有邮箱订阅者能收到,Slack始终收不到AWS Chatbot推送的消息。
我发现AWS Chatbot发送的测试消息是如下JSON格式(已格式化便于阅读):
{ "source":"chatbot", "notificationType":"ChatbotSystemTest", "notificationSource":"sns", "configurationName":"awschat-bot-slack-engineering", "workspaceId":"1231231231231" }
如果我在AWS控制台或AWS CLI中发送完全相同的这条消息,就能推送到Slack。以下是推送至Slack的示例CLI命令:
aws sns publish \ --topic-arn arn:aws:sns:xxxxx:xxxxxxx:topicName \ --message '{"source":"solr","notificationType":"ChatbotSystemTest","notificationSource":"sns","configurationName":"awschat-bot-slack-engineering","workspaceId":"xxxxxxx"}'
但只要修改消息里的source或notificationType字段,消息就无法显示在Slack中,而邮箱订阅者始终能收到消息。
请问为何AWS Chatbot会有如此严格的限制?
AWS Chatbot针对SNS订阅设置这类限制,核心是为了过滤非预期消息、维持Slack频道的消息有效性,具体原因如下:
测试功能的专属逻辑
ChatbotSystemTest是AWS Chatbot测试流程的专属标识,只有携带该notificationType且匹配对应source字段的消息,才会被识别为测试验证消息并转发到Slack——这是测试连通性的专用规则,仅用于确认Chatbot与Slack的链路正常。默认的消息过滤机制
AWS Chatbot对SNS订阅的消息有默认过滤规则:仅转发来自AWS官方服务(如CloudWatch告警、CodePipeline通知等)的标准化消息,或是符合Chatbot预定义格式的消息。自定义普通文本、不符合格式的JSON消息会被自动拦截,不会推送到Slack;而邮箱订阅者不受此限制,因为SNS会直接将所有消息转发到邮箱端点。防止消息滥用与干扰
这类限制能避免误操作或第三方程序随意向Slack频道推送无关消息,确保Slack频道仅接收经过授权的、与AWS资源相关的通知,维持频道的专业性和可读性。
如果需要推送自定义消息到Slack,需配置AWS Chatbot的自定义消息格式规则,或是通过Chatbot支持的AWS服务(如CloudWatch Events)触发消息推送,而非直接通过SNS发布任意格式的消息。
内容的提问来源于stack exchange,提问作者chubbsondubs

