CW告警仅触发1次SNS动作,关联Lambda却执行3次问题咨询
根因分析
这个现象的核心原因是消息投递/调用链路的重试机制,CloudWatch仅推送1次消息说明告警侧没有重复触发,重复调用完全来自链路下游的重试逻辑,常见两类情况:
- SNS侧重试:SNS向Lambda投递消息后,没有收到Lambda返回的成功响应(比如Lambda执行报错、超时、返回非2xx状态码),会按照默认重试策略重复投递消息,SNS默认最大重试次数为3次,且重试时会完全复用原始消息的请求ID、载荷,仅投递时间不同,完全匹配你遇到的现象。
- Lambda侧重试:SNS触发Lambda属于异步调用模式,Lambda收到消息后如果执行失败,自身的异步调用默认会重试2次,加上首次调用总共3次,这种情况SNS侧只会显示1次成功投递,重试动作完全发生在Lambda服务内部。
排查步骤
- 查看SNS主题的消息投递日志,核对对应消息的投递次数:如果日志显示投递了3次,说明是SNS侧触发的重试;如果仅显示1次成功投递,说明是Lambda侧的异步重试。
- 拉取Lambda对应3次执行的运行日志,查看前2次执行是否存在报错、超时、内存溢出等异常,确认未返回成功状态码的原因。
- 核对SNS主题的投递重试配置,确认最大重试次数是否为3次;同时核对Lambda的异步调用配置,确认异步重试次数是否为2次,匹配当前的调用次数。
解决方案
根据排查到的根因对应处理:
- 如果是Lambda执行异常导致的重试:优先修复代码中的异常逻辑、处理边界输入,若为执行超时可适当调大Lambda超时阈值或优化代码执行效率;同时建议在代码中增加幂等判断,以SNS消息的
MessageId作为唯一标识,同一个MessageId的消息仅执行1次业务逻辑,避免重复操作产生脏数据。 - 如果是重试策略配置不合理:根据业务需求调整SNS主题的最大重试次数,或调整Lambda异步调用的重试次数,不需要重试的场景可直接将重试次数设为0。
内容的提问来源于stack exchange,提问作者Tessa
相关产品推荐
相关产品推荐

