Kinesis 与 SQS DLQ 丢失事件数据

Ita*_*dry 6 amazon-sqs amazon-kinesis aws-lambda

我正在尝试为 Kinesis 设置 DLQ。我使用了 SQS 并将其设置为失败时的 Kinesis 目标。

Kinesis 附加到始终抛出错误的 lambda,因此事件将立即发送到 SQS DLQ。

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

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

小智 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"
  }
}
Run Code Online (Sandbox Code Playgroud)

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);
Run Code Online (Sandbox Code Playgroud)

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

希望有帮助!