AWS Lambda调用错误未触发SQS死信队列

Eag*_*eak 11 amazon-sqs amazon-web-services amazon-dynamodb aws-lambda

我有一个AWS Lambda函数,它订阅DynamoDB流并配置了SQS死信队列(DLQ).我可以看到在管理控制台中配置了正确的队列.我也小心翼翼地sqs:SendMessage在我的DLQ上赋予我的功能权限.

订阅有效,但仍然"挂起"调用错误,就像没有配置DLQ一样.即,如果有消息导致未处理的异常,则该函数继续重试此消息,直到它从流中删除.我可以看到调用错误的数量增加,并且函数的Cloudwatch仪表板中没有显示DLQ错误.SQS队列保持为空.

我想要的是失败的消息转发到我的DLQ并且订阅继续到下一条消息.有任何想法吗?

编辑

正如Jonathan Seed在下面所说,DLQ目前不适用于基于流的订阅.AWS Support确认他们正在努力实现这一点.

Jon*_*eed 13

我相信这是因为DynamoDB流是基于流的事件源.lambda 文档指出,在处理基于流的事件源时"如果Lambda函数失败,AWS Lambda会尝试处理错误的一批记录,直到数据到期为止"

根据我的理解,lambda函数将重试,直到事件处理成功或者到期并从流中消失,事件永远不会被lambda函数"丢弃",因为它们在非基于流的事件源中.

如果您希望丢弃某些事件,手动将事件发布到队列/主题并成功返回,则可能必须将自己的故障处理实现为主lambda函数的一部分.

  • 这仍然是真的吗?我面临同样的问题,基于 kinesis 数据流的 lambda 没有将记录放入 dlq 中。 (2认同)

pri*_*zel 8

  • 使用 DynamoDB 流触发 lambda 意味着您正在使用同步调用。但是,DLQ 仅适用于异步调用
  • 好消息是,2019 年 11 月,AWS 发布了针对 Kinesis 和 DynamoDB 事件源的新错误处理机制。

使用此功能,您可以配置失败时的目标。此目标可以是 SNS 主题、SQS 队列、另一个 lambda 函数或 EventBridge 事件总线。

要通过控制台 UI 添加此内容,

  1. 转到 lambda 函数
  2. 点击Add Destination按钮
  3. 选择流调用
  4. 根据故障情况选择
  5. 选择 SQS 队列作为目标,并将其指向您要像 DLQ 一样使用的 SQS。

要通过 cloudformation 添加它,请遵循此文档
我将为您需要附加到 lambda 函数的触发器提供一个基本示例:

LambdaTrigger:
  Type: AWS::Lambda::EventSourceMapping
  Properties:
    FunctionName: !GetAtt Lambda.Arn
    EventSourceArn: !GetAtt TableName.StreamArn
    DestinationConfig:
      OnFailure:
        Destination: !GetAtt DLQ.Arn
Run Code Online (Sandbox Code Playgroud)