Kinesis与SQS DLQ缺失事件数据

6

我正在尝试为Kinesis设置DLQ。

我使用了SQS,并将其设置为Kinesis的失败目的地。

Kinesis连接到一个总是会抛出错误的lambda函数,以便事件可以立即传输到SQS DLQ。

我可以在SQS中看到事件,但是事件负载(我作为事件的一部分发送的JSON)丢失了,在lambda中,如果在抛出异常之前打印事件,则可以看到base64编码的数据,但在我的DLQ中没有看到数据。

是否有办法也将事件数据发送到DLQ? 我想能够正确检查错误原因并在lambda中修复问题后将事件放回到Kinesis中。


面临相同的问题。 - Vipul Sharma
1个回答

11

https://docs.aws.amazon.com/lambda/latest/dg//with-kinesis.html#services-kinesis-errors

实际记录不包含在内,因此您必须处理此记录并在其过期并且丢失之前从流中检索它们。

根据上述内容,事件负载将不会发送到DLQ事件,因此“缺少事件数据”应该是正常的。

因此,为了检索实际记录,您可以尝试以下步骤:

1) 假设我们有以下Kinesis批次信息

{
  "KinesisBatchInfo": {
    "shardId": "shardId-000000000001",
    "startSequenceNumber": "49601189658422359378836298521827638475320189012309704722",
    "endSequenceNumber": "49601189658422359378836298522902373528957594348623495186",
    "approximateArrivalOfFirstRecord": "2019-11-14T00:38:04.835Z",
    "approximateArrivalOfLastRecord": "2019-11-14T00:38:05.580Z",
    "batchSize": 500,
    "streamArn": "arn:aws:kinesis:us-east-2:123456789012:stream/mystream"
  }
}

2) 我们可以通过类似以下的方式获取记录

import AWS from 'aws-sdk';

const kinesis = new AWS.Kinesis();

const ShardId = 'shardId-000000000001';
const ShardIteratorType = 'AT_SEQUENCE_NUMBER';
const StreamName = 'my-awesome-stream';
const StartingSequenceNumber =
  '49601189658422359378836298521827638475320189012309704722';

const { ShardIterator } = await kinesis
  .getShardIterator({
    ShardId,
    ShardIteratorType,
    StreamName,
    StartingSequenceNumber,
  })
  .promise();

const records = await kinesis
  .getRecords({
    ShardIterator,
  })
  .promise();

console.log('Records', records);

注意:不要忘记确保您的进程有权限访问 1) kinesis:GetShardIterator 2) kinesis:GetRecords

希望这可以帮到你!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接