为何AWS SNS将订阅方返回的404等4xx响应判定为推送成功?
AWS SNS 4xx响应判定为交付失败配置方案
AWS SNS的HTTP/HTTPS订阅默认交付判定规则为:仅5xx服务端错误、连接超时、SSL握手失败等场景判定为交付失败,触发重试/推死信队列逻辑;4xx类状态码默认被判定为不可恢复的客户端永久错误,认为重试也无法解决问题,因此会直接标记为SUCCESS状态,不会触发重试流程,你遇到的404被标记为成功就是这个逻辑导致的。
配置方法
你可以通过自定义订阅的交付策略,指定需要判定为失败的4xx状态码,配置后对应状态码的响应会被识别为交付失败,走重试流程,重试次数耗尽后会推送到你配置的DLQ,状态也会标记为FAILED。
控制台配置步骤
- 进入AWS SNS控制台,找到对应主题下的目标HTTP/HTTPS订阅
- 开启「覆盖主题默认交付策略」选项
- 在交付策略的JSON配置中添加
4xxRetryPolicy字段,示例配置如下:
{ "http": { "defaultHealthyRetryPolicy": { "minDelayTarget": 20, "maxDelayTarget": 20, "numRetries": 3, "backoffFunction": "linear" }, "4xxRetryPolicy": { "retryOn4xxStatusCodes": [404, 403, 408, 429] } } }
- 保存配置即可生效。
AWS CLI配置命令
你也可以通过CLI快速配置,替换为你的订阅ARN和需要重试的4xx状态码即可:aws sns set-subscription-attributes --subscription-arn 你的订阅ARN --attribute-name DeliveryPolicy --attribute-value '{"http":{"4xxRetryPolicy":{"retryOn4xxStatusCodes":[404,403,429]}}}'
注意事项
- 按需配置需要重试的4xx状态码,不建议将所有4xx都加入重试列表,比如400(请求参数异常)这类SNS端触发的错误重试无效
- 可以配合SNS交付状态日志功能,直接过滤FAILED状态的请求做监控告警,无需手动核对每个请求的状态码
内容的提问来源于stack exchange,提问作者Farouq Aldori
相关产品推荐
相关产品推荐

