如何完成Amazon SNS HTTPS订阅确认及定位请求发送位置
解决Amazon SNS HTTPS订阅确认及请求排查问题
一、完成HTTPS URL的订阅确认
当你添加HTTPS订阅后,SNS会自动向你的HTTPS端点发送订阅确认POST请求,确认流程如下:
- 你的HTTPS服务(比如Lambda+API Gateway)需要接收这个POST请求,从请求体中提取
SubscribeURL字段 - 向该
SubscribeURL发送一个GET请求,完成订阅确认 - 端点必须返回200状态码,否则SNS会重复发送确认请求,多次失败后订阅会被标记为失效
以下是JavaScript Lambda的示例处理代码:
exports.handler = async (event) => { const requestBody = JSON.parse(event.body); // 处理订阅确认请求 if (requestBody.Type === 'SubscriptionConfirmation') { const subscribeUrl = requestBody.SubscribeURL; // 发送GET请求完成确认 await fetch(subscribeUrl); return { statusCode: 200, body: 'Subscription confirmed' }; } // 处理后续的通知消息 if (requestBody.Type === 'Notification') { // 这里写你的业务处理逻辑 return { statusCode: 200, body: 'Notification processed' }; } return { statusCode: 400, body: 'Invalid request type' }; };
二、排查订阅确认POST请求的发送位置
- CloudWatch日志(Lambda/API Gateway场景):如果你的HTTPS端点是Lambda+API Gateway,直接去对应Lambda函数的CloudWatch日志组,能找到SNS发送的POST请求的完整内容,包括请求头、请求体
- SNS控制台订阅状态:在SNS控制台的「订阅」列表中,查看对应订阅的状态:
PendingConfirmation表示未完成确认,Confirmed表示已成功 - 服务器抓包(自建服务场景):如果是自己托管的HTTPS服务,在服务器上用
tcpdump工具抓包,过滤目标端口的POST请求,命令示例:tcpdump -i any port 443 and host <你的服务器IP> -A - 死信队列(DLQ):如果Topic配置了死信队列,当确认请求发送失败时,SNS会将消息转发到DLQ,你可以在对应SQS队列中查看失败的请求内容
内容的提问来源于stack exchange,提问作者Laxman
相关产品推荐
相关产品推荐

