确认AWS SNS主题订阅:Slack Webhook订阅待确认问题求助
解决AWS SNS订阅Slack Webhook处于PendingConfirmation的问题
这个问题很常见,核心原因是Slack的Incoming Webhook并不兼容AWS SNS默认的HTTP订阅确认机制——SNS会向你的Webhook URL发送一个带确认Token的POST请求,但Slack只会处理符合自身消息格式的请求,完全不会响应这个确认请求,所以订阅会一直卡在PendingConfirmation状态。
下面给你两种可行的解决方法:
方法一:手动确认订阅(适合快速测试)
如果只是想先搞定订阅确认,后续再处理消息格式,可以用AWS CLI手动完成:
获取订阅的ARN和确认Token
- 登录AWS控制台,进入SNS服务,找到目标主题,切换到「订阅」标签页,复制那条状态为
PendingConfirmation的订阅ARN。 - 打开终端,运行以下命令列出该主题下的所有订阅,从返回结果里提取对应订阅的
Token字段:aws sns list-subscriptions-by-topic --topic-arn <你的主题ARN>
- 登录AWS控制台,进入SNS服务,找到目标主题,切换到「订阅」标签页,复制那条状态为
执行确认命令
- 把刚才拿到的主题ARN和Token代入下面的命令,运行后订阅状态就会变成
Confirmed:aws sns confirm-subscription --topic-arn <你的主题ARN> --token <提取到的Token> - 注意:这种方法只是解决了订阅确认问题,后续SNS发送的原始消息格式Slack还是无法识别,你依然看不到消息,所以更推荐下面的生产级方案。
- 把刚才拿到的主题ARN和Token代入下面的命令,运行后订阅状态就会变成
方法二:用Lambda作为中间层(推荐)
这是生产环境的标准做法,既能自动完成订阅确认,还能把SNS消息转换成Slack能识别的格式:
创建Lambda函数
- 进入AWS Lambda控制台,新建一个函数,选择你熟悉的运行时(比如Python 3.11)。
- 编写处理代码,示例Python代码如下:
import json import requests SLACK_WEBHOOK_URL = "你的Slack Webhook URL" def lambda_handler(event, context): # 解析SNS消息内容 sns_message = event['Records'][0]['Sns']['Message'] # 构造Slack接受的消息格式 slack_payload = { "text": f"来自AWS SNS的通知:\n{sns_message}" } # 发送到Slack Webhook response = requests.post( SLACK_WEBHOOK_URL, data=json.dumps(slack_payload), headers={"Content-Type": "application/json"} ) response.raise_for_status() return { 'statusCode': 200, 'body': json.dumps('消息已转发到Slack') } - 补充:如果Lambda部署在私有子网,需要配置NAT网关让它能访问公网的Slack Webhook;用Python的话,要确保
requests库能被Lambda加载(可以通过Lambda层或者打包部署)。
添加SNS触发器
- 在Lambda函数的「配置」->「触发器」里,点击「添加触发器」,选择「SNS」。
- 选中你的目标SNS主题,勾选「启用触发器」后点击「添加」。
- 这时候AWS会自动创建SNS订阅,Lambda会自动响应SNS的确认请求,订阅状态直接变成
Confirmed,无需手动操作。
测试验证
- 在SNS控制台给主题发送一条测试消息,稍等片刻就能在Slack频道看到格式化后的通知了。
内容的提问来源于stack exchange,提问作者Manoj Acharya
相关产品推荐
相关产品推荐

