Лямбда-функция запускается дважды при событии DynamoDB - PullRequest
1 голос
/ 12 марта 2019

У меня есть лямбда-функция, которая прикреплена к событию изменения DynamoDB.Лямбда запускается дважды, когда я меняю / изменяю элемент в таблице Test-machines в DynamoDB.

Я изменяю значение IsMachineOn с True до False, это триггер Test-Machine-On-alert-statusЛямбда-функция в два раза.

Я не понимаю, почему двукратная лямбда является триггером.

Я наблюдал небольшое изменение records в параметре event в Lambda.

Для первого запуска ,

Значение NewImage["IsMachineOn"]["BOOL"] равно False

Значение OldImage["IsMachineOn"]["BOOL"] равно True

ДляВторой триггер ,

Значение NewImage["IsMachineOn"]["BOOL"] равно False

Значение OldImage["IsMachineOn"]["BOOL"] равно False

У меня есть бизнес-логика NewImage["IsMachineOn"]["BOOL"]==Falseтак что моя бизнес-логика запускается дважды.

Есть две вещи:

  1. Почему Lambda работает дважды?
  2. Каким будет обходной путь для устранения этой проблемы?

1 Ответ

1 голос
/ 13 марта 2019

Мы наблюдали эту проблему, когда использовали глобальные таблицы для синхронизации данных между таблицами DynamodB в нескольких регионах.И мы предполагали, что второй толчок делается глобальной таблицей после синхронизации данных между регионами.Я написал простой код, чтобы проверить, действительно ли старые и новые изображения действительно отличаются, и обработать событие, только если они отличаются

def check_if_dynamo_entities_are_same(dyanmoStreamEvent):
    '''copying so that we dont change the incoming event'''
    dyanmoStreamEventCopy = copy.deepcopy(dyanmoStreamEvent)
    if( not 'NewImage' in dyanmoStreamEventCopy['dynamodb'] or not 'OldImage' in dyanmoStreamEventCopy['dynamodb']):
        logger.info("one of newimage or oldimage is not present returning true")
        return False
    remove_aws_keys(dyanmoStreamEventCopy['dynamodb']['NewImage'])
    remove_aws_keys(dyanmoStreamEventCopy['dynamodb']['OldImage'])
    return compare_two_json(dyanmoStreamEventCopy['dynamodb']['NewImage'], dyanmoStreamEventCopy['dynamodb']['OldImage'])

def remove_aws_keys(dic):
    for k in dic.copy():
        if k.startswith('aws:'):
            logger.info("poping key=%s", k)
            dic.pop(k)

def ordered(obj):
    if isinstance(obj, dict):
        return sorted((k, ordered(v)) for k, v in obj.items())
    if isinstance(obj, list):
        return sorted(ordered(x) for x in obj)
    else:
        return obj


def compare_two_json(json1, json2):
    """This method return true or false if the given jsons are equal or not.
    This has been taken from https://stackoverflow.com/a/25851972/3892213"""
    return ordered(json1) == ordered(json2)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...