为啥我的失败事件没有发送到 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?的主要内容,如果未能解决你的问题,请参考以下文章

节点 AWS-SDK SES 电子邮件发送验证失败

为啥部署 django docker 容器后,邮件发送失败?

为啥在 AWS Redshift 中对密码进行 md5 哈希处理时密码身份验证失败?

为啥 MailKit SmtpClient.Send() 失败时我没有收到异常?

为啥我的 Rails 应用程序无法部署到 AWS Elastic Beanstalk?

EventLog来自哪里,为啥会出错?