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

时间:2017-03-24 11:14:31

标签: amazon-web-services amazon-dynamodb aws-lambda amazon-sqs

我有一个AWS Lambda函数,它订阅DynamoDB流并配置了SQS dead letter queue (DLQ)。我可以看到在管理控制台中配置了正确的队列。另外,我注意在我的DLQ上为sqs:SendMessage提供我的功能权限。

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

我想要的是失败的消息被转发到我的DLQ并且订阅继续到下一条消息。有什么想法吗?

修改

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

2 个答案:

答案 0 :(得分:9)

我相信这是因为DynamoDB流是基于流的事件源。 lambda documentation表示在处理基于流的事件源时“如果Lambda函数失败,AWS Lambda会尝试处理错误的一批记录,直到数据到期为止”

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

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

答案 1 :(得分:2)

使用此功能,您可以在发生故障时配置目标。此目标可以是SNS主题,SQS队列,另一个lambda函数或EventBridge事件总线。

要通过控制台用户界面添加它,

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

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

LambdaTrigger:
  Type: AWS::Lambda::EventSourceMapping
  Properties:
    FunctionName: !GetAtt Lambda.Arn
    EventSourceArn: !GetAtt TableName.StreamArn
    DestinationConfig:
      OnFailure:
        Destination: !GetAtt DLQ.Arn
相关问题