AWS SNS HTTPS订阅自动删除问题分析与解决方案
1. AWS SNS HTTPS订阅自动删除问题概述最近在项目中遇到一个棘手的问题配置在AWS SNSSimple Notification Service中的HTTPS订阅会莫名其妙地被自动删除。这个问题直接导致我们的消息通知系统出现严重漏洞——部分终端用户收不到关键的业务通知。经过一周的深入排查终于找到了根本原因和解决方案。HTTPS订阅是SNS中常用的一种消息推送方式它允许SNS将消息通过HTTPS协议推送到我们指定的Webhook地址。相比SQS队列订阅HTTPS订阅更适合需要实时推送且接收端为Web服务的场景。但在实际使用中HTTPS订阅的稳定性问题经常让开发者头疼。2. 问题现象与初步排查2.1 异常现象描述我们的系统架构中SNS负责将订单状态变更通知推送到多个微服务。突然有一天运维团队发现部分服务的订阅关系消失了。具体表现为在AWS控制台的SNS订阅列表中部分HTTPS订阅状态显示为DeletedCloudWatch日志中出现Subscription deleted的记录但没有人工操作记录问题呈现间歇性出现约每周发生1-2次被删除的订阅都是HTTPS类型SQS和Lambda订阅不受影响2.2 初步排查步骤首先我们按照AWS的标准排查流程进行了检查检查IAM权限确认没有自动化脚本或第三方服务拥有sns:Unsubscribe权限查看CloudTrail日志过滤sns:Unsubscribe API调用确实没有找到相关记录检查订阅终端点Endpoint所有HTTPS端点均运行正常返回2xx状态码检查重试策略SNS默认重试3次我们的端点响应时间在300ms以内不太可能触发重试失败3. 深入分析与根本原因定位3.1 SNS订阅健康检查机制通过查阅AWS文档和联系技术支持我们了解到SNS有一个不为人知的重要机制自动订阅健康检查。这个机制的工作原理是SNS会定期约每天一次向HTTPS订阅端点发送确认请求端点需要在规定时间内返回200 OK响应如果连续多次通常是3次检查失败SNS会自动标记并删除该订阅3.2 实际问题根源通过进一步分析我们发现问题的根本原因有两个端点响应格式不符要求SNS的健康检查请求是特殊的确认请求非普通消息我们的端点没有区分普通消息和确认请求对所有请求都返回相同的业务响应虽然返回200状态码但响应体不符合SNS期望的格式网络中间件干扰公司最近部署了新的API网关某些健康检查请求被网关拦截并修改了头部信息导致SNS无法正确验证响应4. 解决方案与实施步骤4.1 修复端点逻辑我们修改了Webhook端点的处理逻辑app.route(/sns-webhook, methods[POST]) def handle_sns(): # 检查是否为订阅确认请求 if request.headers.get(x-amz-sns-message-type) SubscriptionConfirmation: # 获取订阅确认URL subscribe_url request.json.get(SubscribeURL) # 访问确认URL完成订阅 requests.get(subscribe_url) # 返回空200响应 return , 200 # 正常消息处理逻辑 process_message(request.json) return , 200关键改进点明确区分订阅确认请求和普通消息对确认请求按照SNS要求进行处理保持响应简洁避免多余内容4.2 网络架构调整针对网络中间件问题我们做了以下调整将SNS的源IP范围AWS官方公布加入API网关白名单配置网关规则不对SNS相关请求进行修改为SNS健康检查请求设置专用路由4.3 监控与告警增强为防止问题再次发生我们增加了以下监控措施CloudWatch警报监控SNS订阅数量的异常变化设置订阅删除事件的告警自定义健康检查每5分钟检查所有订阅状态发现异常自动触发修复流程5. 验证与效果评估5.1 测试方案我们通过以下方式验证修复效果手动触发SNS订阅确认请求aws sns confirm-subscription \ --topic-arn arn:aws:sns:us-west-2:123456789012:my-topic \ --token 2336412f37...使用SNS测试通知功能发送测试消息aws sns publish \ --topic-arn arn:aws:sns:us-west-2:123456789012:my-topic \ --message 测试消息模拟网络故障观察系统行为5.2 实施效果修复后经过一个月观察订阅自动删除问题完全消失消息投递成功率从92%提升到99.99%系统稳定性显著提高6. 经验总结与最佳实践6.1 关键教训不要忽视SNS的健康检查机制这是AWS文档中不太强调但非常重要的功能必须正确处理SubscriptionConfirmation和UnsubscribeConfirmation请求网络中间件的影响网关、代理等中间件可能修改请求/响应需要为SNS通信设置专用规则监控订阅状态SNS订阅变化应该纳入核心监控指标建议设置订阅数量变化的告警阈值6.2 推荐实践基于这次经验我们总结出以下最佳实践端点实现规范必须支持三种SNS请求类型SubscriptionConfirmationNotificationUnsubscribeConfirmation每种类型需要不同的处理逻辑错误处理建议对SNS请求实现完善的日志记录对失败请求实施指数退避重试设置死信队列收集无法处理的消息架构设计考虑对于关键业务建议使用SQS轮询作为备用方案考虑在客户端实现消息本地缓存重要通知应该实现多通道冗余投递7. 高级配置与优化建议7.1 重试策略配置虽然SNS有默认的重试机制但我们可以通过订阅属性进行优化aws sns set-subscription-attributes \ --subscription-arn arn:aws:sns:us-west-2:123456789012:my-topic:... \ --attribute-name DeliveryPolicy \ --attribute-value { healthyRetryPolicy: { minDelayTarget: 20, maxDelayTarget: 60, numRetries: 5, numNoDelayRetries: 1, backoffFunction: linear }, throttlePolicy: { maxReceivesPerSecond: 10 } }7.2 死信队列设置为处理无法投递的消息建议配置死信队列首先创建专用SQS队列aws sqs create-queue --queue-name sns-dlq然后将其配置为SNS订阅的死信队列aws sns set-subscription-attributes \ --subscription-arn arn:aws:sns:us-west-2:123456789012:my-topic:... \ --attribute-name RedrivePolicy \ --attribute-value { deadLetterTargetArn: arn:aws:sqs:us-west-2:123456789012:sns-dlq }7.3 消息过滤优化对于大型系统可以使用SNS的消息过滤功能减少不必要的推送aws sns subscribe \ --topic-arn arn:aws:sns:us-west-2:123456789012:my-topic \ --protocol https \ --notification-endpoint https://example.com/endpoint \ --attributes { FilterPolicy: {\eventType\:[\orderUpdate\]} }8. 常见问题解决方案速查表问题现象可能原因解决方案订阅被自动删除健康检查失败检查端点是否正确处理SubscriptionConfirmation请求收不到消息但订阅存在端点响应超时优化端点性能确保500ms内响应重复收到相同消息端点返回非2xx状态码确保正确处理消息后返回200控制台显示订阅PendingConfirmation未完成订阅确认手动访问SubscribeURL或重新订阅部分消息丢失订阅属性配置不当检查DeliveryPolicy和RedrivePolicy设置

相关新闻

基于BiLSTM+Attention的蓝牙耳机评论情感分析系统

基于BiLSTM+Attention的蓝牙耳机评论情感分析系统

1. 项目背景与核心价值 蓝牙耳机作为近年来消费电子领域的爆款产品,线上销售占比已超过70%。各大电商平台每天产生数以万计的购买评论,这些UGC内容蕴含着消费者对产品功能、音质表现、佩戴舒适度等维度的真实反馈。传统的人工抽检方式不仅效率低下&#…

2026/9/23 22:11:40 阅读更多 →
操作系统期末高效复习:如何自主整理选择、填空、判断题库

操作系统期末高效复习:如何自主整理选择、填空、判断题库

1. 项目概述:为什么期末复习需要自己整理题目? 又到了期末季,操作系统这门课是不是让你感觉头大?进程、线程、死锁、内存管理、文件系统……概念又多又抽象,教材和PPT看了一遍又一遍,合上书还是感觉一片空白…

2026/9/28 20:54:43 阅读更多 →
STM32 GPIO八种工作模式深度解析:从电路原理到实战配置

STM32 GPIO八种工作模式深度解析:从电路原理到实战配置

1. 项目概述:为什么GPIO模式是嵌入式开发的基石 刚接触STM32这类微控制器时,很多人都是从点灯开始的。你照着教程,在CubeMX里配置一个引脚为输出模式,写一句 HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_SET) ,L…

2026/9/28 19:58:55 阅读更多 →

最新新闻

tweens运动:让运动数据活起来的插值引擎

tweens运动:让运动数据活起来的插值引擎

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/30 6:16:50 阅读更多 →
Unity AI感知系统设计:Trigger、Raycast与FOV协同实现真实感

Unity AI感知系统设计:Trigger、Raycast与FOV协同实现真实感

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/30 6:16:50 阅读更多 →
Java实现SHA-256的真正难点:字符编码、字节一致性与生产级落地

Java实现SHA-256的真正难点:字符编码、字节一致性与生产级落地

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/30 6:16:49 阅读更多 →
单片机控制板故障排查六步法:从供电、复位到看门狗与堆栈溢出

单片机控制板故障排查六步法:从供电、复位到看门狗与堆栈溢出

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/30 6:16:49 阅读更多 →
从Linux到QNX:微内核与消息传递的实时操作系统入门

从Linux到QNX:微内核与消息传递的实时操作系统入门

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/30 6:16:49 阅读更多 →
Linux硬件信息溯源:9个分层命令精准诊断CPU内存存储网络

Linux硬件信息溯源:9个分层命令精准诊断CPU内存存储网络

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/30 6:15:49 阅读更多 →

日新闻

Base64 图片头部特征识别:从文件头到格式判断的完整指南

Base64 图片头部特征识别:从文件头到格式判断的完整指南

1. 项目概述:为什么说看懂 base64 图片头部是基本功这几年跟 base64 打交道的机会越来越多,后端接口返回图片、前端渲染验证码、小程序里存小图、还有一些老系统导出报表,动不动就给你一段长到怀疑人生的 base64 字符串。很多人拿到字符串就直…

2026/9/30 0:00:35 阅读更多 →
Java公交站牌广告管理系统:JSP+Servlet+MySQL实战落地指南

Java公交站牌广告管理系统:JSP+Servlet+MySQL实战落地指南

简介:本资源是一份面向Java初学者与课程设计学生的公交站牌广告灯箱管理系统毕业设计文档,聚焦城市公共广告资源信息化管理痛点,提供从需求分析到技术实现的完整方案。文档采用标准学术论文结构,含摘要、英文摘要、目录及五章正文…

2026/9/30 0:00:35 阅读更多 →
用 Redis Lua 构建大模型 API 多租户原子配额治理体系

用 Redis Lua 构建大模型 API 多租户原子配额治理体系

我去年年底接了一个内部 AI 平台的治理需求,背景很直接:公司把 DeepSeek、MiniMax 这类大模型 API 统一封装成内部网关,开放给几个业务团队用。结果第一个月账单出来,额度直接超了 4 倍。仔细查日志,发现原因并不复杂—…

2026/9/30 0:00:35 阅读更多 →

周新闻

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解 【免费下载链接】spirula-studio Cross-vendor 3D Gaussian Splatting trainer - video to splat to mesh, Vulkan or CUDA. 项目地址: https://gitcode.com/GitHub_Trending/sp/spirula-studio Sp…

2026/9/29 8:16:59 阅读更多 →
SEO怎么推广速查手册新手避坑实战指南

SEO怎么推广速查手册新手避坑实战指南

SEO怎么推广速查手册新手避坑实战指南 模板网站太丑不够用?别急着加滤镜,那是治标不治本。很多老板盯着后台流量掉得眼红,却还在纠结首页Banner的圆角是不是3像素。这就像穿着西装去挖土,姿势不对,努力白费。我整理这份 速查手册…

2026/9/29 16:41:41 阅读更多 →
FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏

FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏

FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏 【免费下载链接】FireRed-OpenStoryline FireRed-OpenStoryline is an AI video editing agent that transforms manual editing into intention-driven directing through natural language …

2026/9/29 8:24:48 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/29 19:29:29 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/29 5:58:00 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/29 3:55:56 阅读更多 →