配置SNS触发Lambda的DLQ并实现失败邮件通知
解决Lambda执行失败后触发邮件通知的问题
核心误解澄清
你当前配置的SNS订阅死信队列(DLQ),仅针对SNS无法将消息交付给Lambda的场景(比如Lambda不存在、权限不足导致消息无法送达Lambda)。而你的情况是消息已成功送达Lambda,但Lambda执行报错,此时SNS会判定交付成功,不会将消息转入DLQ。这是功能逻辑的核心区别。
正确实现方案
方案一:利用Lambda目的地(Destinations)转发失败事件到SQS
此方案可直接将Lambda执行失败的事件发送到指定SQS队列,再通过SQS告警触发邮件通知:
- 进入Lambda控制台,打开目标函数,切换到「配置」标签页,选择「目的地」
- 点击「添加目的地」,在「触发条件」中选择「失败的执行」,「目标类型」选择「SQS队列」,选中你的DLQ队列
- 为Lambda执行角色添加权限:在IAM控制台找到该角色,添加一条允许
sqs:SendMessage动作、资源为你的DLQ ARN的策略,示例策略如下:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "sqs:SendMessage", "Resource": "arn:aws:sqs:us-east-1:123456789012:myproj-sns-topic-dlq" } ] }
方案二:通过CloudWatch告警触发邮件通知
直接监控Lambda的错误指标,当出现执行失败时触发SNS发送邮件:
- 进入CloudWatch控制台,点击「告警」-「创建告警」
- 在「选择指标」中,找到Lambda服务下的目标函数,选择
Errors指标(按时间统计的错误次数) - 设置告警阈值(比如当1分钟内错误次数≥1时触发)
- 在「通知」环节,选择一个已配置好邮件订阅的SNS主题(若没有则先创建主题并订阅你的邮箱)
补充:SQS权限验证
若后续需用到SNS向SQS发送消息的场景,正确的SQS访问策略应设置Principal为SNS服务,示例如下:
{ "Effect": "Allow", "Principal": { "Service": "sns.amazonaws.com" }, "Action": "sqs:SendMessage", "Resource": "arn:aws:sqs:us-east-1:123456789012:myproj-sns-topic-dlq", "Condition": { "ArnEquals": { "aws:SourceArn": "arn:aws:sns:us-east-1:123456789012:myproj-snstopic" } } }
内容的提问来源于stack exchange,提问作者Dave
相关产品推荐
相关产品推荐

