为啥我的失败事件没有发送到 AWS Dead Letter Queue DLQ?
Posted
技术标签:
【中文标题】为啥我的失败事件没有发送到 AWS Dead Letter Queue DLQ?【英文标题】:Why my failed event is not sent to AWS Dead Letter Queue DLQ?为什么我的失败事件没有发送到 AWS Dead Letter Queue DLQ? 【发布时间】:2019-06-07 20:02:54 【问题描述】:我正在尝试设置 DLQ 以从 Lambda 函数中捕获失败的事件。
这是我所做的:
-
在 SQS 中创建了 DeadLetterQueue (QueueX),
将我的 lambda 函数 DLQ 资源设置为“Amazon SQS”
将 SQS 队列设置为 QueueX
创建了一个策略,将所有权限 (sqs:*) 授予所有资源 (*); VisibilityTimeout=5 分钟,MessageRetentionPeriod=3 天
将策略附加到执行 lambda 函数的角色
现在通过“队列操作”,我可以发送一条消息并看到它显示在“可用消息”中。但是,如果我向 lambda 函数发送一个 http 请求——我故意创建了一个未捕获异常的格式错误的 JSON——我在 CloudWatch 中看到了错误消息,但没有发送到 QueueX。
我错过了什么?
【问题讨论】:
第一点是错字吗?Created a DeadLetterQueue (QueueX) in SNS
,你的意思是在 SQS 中吗?另外,Lambda 的事件源是什么?
哎呀,这是一个错字。应该是SQS。我只是通过将来自 Postman 的 HTTP 请求直接发布到 lambda 的 Api 网关来进行测试。
【参考方案1】:
根据您的最新评论:
通过将来自 Postman 的 HTTP 请求直接发布到 lambda 的 Api 网关进行测试
这是您所面临问题的原因。
解释一下,当您有一个到 Lambda 的 API 网关代理时,API 网关会处理 Lambda 发回的错误情况(而不是 Lambda 服务本身,它具有 DLQ 配置),并且错误不会在 DLQ 中结束.为了实现 DLQ,您需要一个不同的设计,可能类似于调用 SNS -> Lambda,然后在失败时 Lambda 会将这些消息发送到 DLQ。
如果您没有代理集成,您也可以解决此问题,但我没有亲自测试过,我不确定这是否可行。
【讨论】:
@Deiv 如果不需要响应调用者,API 网关可以异步调用 Lambda 函数。在 Lambda 重试用尽后,这将与 DLQ 一起使用。仅限非代理集成。 docs.aws.amazon.com/apigateway/latest/developerguide/…以上是关于为啥我的失败事件没有发送到 AWS Dead Letter Queue DLQ?的主要内容,如果未能解决你的问题,请参考以下文章
为啥部署 django docker 容器后,邮件发送失败?
为啥在 AWS Redshift 中对密码进行 md5 哈希处理时密码身份验证失败?
为啥 MailKit SmtpClient.Send() 失败时我没有收到异常?