У меня есть таблица 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
(что меня не волнует в моем потоке данных). Мысли?