我有一个AWS Lambda函数,它订阅DynamoDB流并配置了SQS dead letter queue (DLQ)。我可以看到在管理控制台中配置了正确的队列。另外,我注意在我的DLQ上为sqs:SendMessage
提供我的功能权限。
订阅有效,但仍然“挂起”调用错误,就好像没有配置DLQ一样。即,如果存在导致未处理异常的消息,则该函数继续重试该消息,直到从流中删除该消息。我可以看到调用错误的数量增加,并且函数的Cloudwatch仪表板中没有显示DLQ错误。 SQS队列保持为空。
我想要的是失败的消息被转发到我的DLQ并且订阅继续到下一条消息。有什么想法吗?
正如Jonathan Seed在下面所说,DLQ目前不适用于基于流的订阅。 AWS Support确认他们正在努力实现这一目标。
答案 0 :(得分:9)
我相信这是因为DynamoDB流是基于流的事件源。 lambda documentation表示在处理基于流的事件源时“如果Lambda函数失败,AWS Lambda会尝试处理错误的一批记录,直到数据到期为止”
根据我的理解,lambda函数将重试,直到事件处理成功或过期并从流中消失,事件永远不会被lambda函数“丢弃”,因为它们在非基于流的事件源中。
如果您希望丢弃某些事件,手动将事件发布到队列/主题并成功返回,则可能必须将自己的故障处理作为主lambda函数的一部分来实现。
答案 1 :(得分:2)
使用此功能,您可以在发生故障时配置目标。此目标可以是SNS主题,SQS队列,另一个lambda函数或EventBridge事件总线。
要通过控制台用户界面添加它,
Add Destination
按钮要通过cloudformation添加它,请遵循以下documentation。
我将为您需要附加到lambda函数的触发器提供一个基本示例:
LambdaTrigger:
Type: AWS::Lambda::EventSourceMapping
Properties:
FunctionName: !GetAtt Lambda.Arn
EventSourceArn: !GetAtt TableName.StreamArn
DestinationConfig:
OnFailure:
Destination: !GetAtt DLQ.Arn