AWS DynamoDB Stream, запускающий 2 (почти) идентичных события для одного изменения в одной записи - PullRequest
0 голосов
/ 12 марта 2020

У меня есть таблица DynamoDB, настроенная с помощью Stream с использованием опции «new and old».

Затем я создаю лямбду и устанавливаю триггер для этой таблицы DynamoDB.

Если я внесу одно изменение в элемент таблицы DynamoDB, я сразу же увижу запись в журнале для лямбды ( т.е. работает как положено). Затем, после обновления лямбда-журнала, я вижу ВТОРОЙ вход для точно такого же события. Если я веду некоторые записи в консоли, я получаю следующий вывод:

{
  eventID: '993816ae020b3e179be01be3b6483818',
  eventName: 'MODIFY',
  eventVersion: '1.1',
  eventSource: 'aws:dynamodb',
  awsRegion: 'us-west-2',
  dynamodb: {
    ApproximateCreationDateTime: 1583960109,
    Keys: { Guid: [Object], Timestamp: [Object] },
    NewImage: {
      Brand: [Object],
      'aws:rep:updatetime': [Object],
      EntryType: [Object],
      RequestId: [Object],
      KnownClients: [Object],
      Guid: [Object],
      'aws:rep:deleting': [Object],
      EntryCount: [Object],
      Timestamp: [Object],
      'aws:rep:updateregion': [Object]
    },
    OldImage: {
      Brand: [Object],
      'aws:rep:updatetime': [Object],
      EntryType: [Object],
      RequestId: [Object],
      KnownClients: [Object],
      Guid: [Object],
      'aws:rep:deleting': [Object],
      EntryCount: [Object],
      Timestamp: [Object],
      'aws:rep:updateregion': [Object]
    },
    SequenceNumber: '156626400000000015112302820',
    SizeBytes: 604,
    StreamViewType: 'NEW_AND_OLD_IMAGES'
  },
  eventSourceARN: 'arn:aws:dynamodb:us-west-2:123456789123:table/dynamotabletest/stream/2020-02-07T19:24:06.547'
}

и вот вывод для ВТОРОГО события, которое регистрируется через 1 секунду после первого события:

{
  eventID: 'bdc5295c3eabf7e5fb036a9cbd4fcca9',
  eventName: 'MODIFY',
  eventVersion: '1.1',
  eventSource: 'aws:dynamodb',
  awsRegion: 'us-west-2',
  dynamodb: {
    ApproximateCreationDateTime: 1583960109,
    Keys: { Guid: [Object], Timestamp: [Object] },
    NewImage: {
      Brand: [Object],
      'aws:rep:updatetime': [Object],
      EntryType: [Object],
      RequestId: [Object],
      KnownClients: [Object],
      Guid: [Object],
      'aws:rep:deleting': [Object],
      EntryCount: [Object],
      Timestamp: [Object],
      'aws:rep:updateregion': [Object]
    },
    OldImage: {
      Brand: [Object],
      'aws:rep:updatetime': [Object],
      EntryType: [Object],
      RequestId: [Object],
      KnownClients: [Object],
      Guid: [Object],
      'aws:rep:deleting': [Object],
      EntryCount: [Object],
      Timestamp: [Object],
      'aws:rep:updateregion': [Object]
    },
    SequenceNumber: '156626500000000015112302880',
    SizeBytes: 604,
    StreamViewType: 'NEW_AND_OLD_IMAGES'
  },
  eventSourceARN: 'arn:aws:dynamodb:us-west-2:123456789123:table/dynamotabletest/stream/2020-02-07T19:24:06.547'
}

I сравнил ли текст, и ЕДИНСТВЕННАЯ разница - это eventID и SequenceNumber.

Кто-нибудь знает, что здесь происходит?

Вот мой код для lamdba, который прослушивает событие триггера:

'use strict';

const AWS = require('aws-sdk');
var parse = AWS.DynamoDB.Converter.output;
const firehose = new AWS.Firehose({ region: 'us-east-2' });

exports.handler = (event, context, callback) => {

    var fireHoseInput = [];

    event.Records.forEach((record) => {

        console.log(record);

        if ((record.eventName == "INSERT")||(record.eventName == "MODIFY")) {
            fireHoseInput.push({ Data: JSON.stringify(parse({ "M": record.dynamodb.NewImage })) });
        }
    });
    console.log('Firehose Input: ', fireHoseInput);
    var params = {
        DeliveryStreamName: 'test-dynamodb-stream',
        Records: fireHoseInput
    };
    if(fireHoseInput.length != 0)
    {
    firehose.putRecordBatch(params, function (err, data) {
        if (err) console.log(err, err.stack); // an error occurred
        else console.log(data);           // successful response
    });
    }
    else
        {
            console.log("No data to transmit");
        }
    callback(null, `Successfully processed records.`);
};

Есть идеи, почему одно изменение записи в моей таблице DynamoDB вызывает 2 идентичных события в лямбде, который прослушивает этот поток DynamoDB?

UPDATE : Ранее в лямбде я делал небольшую консольную запись в журнал, чтобы получить необработанные данные из события DynamoDB Stream, которые моя лямбда ожидает с помощью триггера. Вот что я обнаружил в событии FIRST, которое запускает: NewImage показывает обновление, которое я сделал для поля, в то время как OldImage показывает старое значение в поле.

Затем в событии SECOND, которое запускается, измененное поле отображается как одно и то же обновленное значение в NewImage и OldImage, но единственное измененное поле - aws:rep:updatetime. По-видимому, происходит то, что изменение в поле данных фиксируется в первом событии, затем второе событие больше не заботится об изменении этого поля данных, но обновляет метку времени репликации, в результате чего поток DynamoDB запускает второе событие с теми же данными (кроме того, что aws:rep:updatetime изменено). Похоже, мне нужно обновить свою лямбду, чтобы игнорировать это 2-е событие, если единственное поле, которое изменилось, было aws:rep:updatetime (что меня не волнует в моем потоке данных). Мысли?

1 Ответ

0 голосов
/ 12 марта 2020

Нашел ответ здесь: Проблемы с событием потока репликации глобальной таблицы

Похоже, что поток DDB Stream Lambda должен проверять поле aws:rep:updatetime на входящих event.Records[record.dynamodb.newImage] и event.Records[record.dynamodb.oldImage] и, если это так, обработайте запись. Если он другой, откажитесь от записи.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...