Lambda 函数在 DynamoDB 事件上触发两次

Viv*_*ble 5 amazon-dynamodb aws-lambda

我有附加到 DynamoDB 更改事件的 Lambda 函数。当我更改/修改 DynamoDB 中的测试机表中的项目时,Lambda 会触发两次。

我正在将IsMachineOn值从修改TrueFalse,它触发Test-Machine-On-alert-statusLambda 函数两次。

我不明白为什么两次 lambda 是触发器。

我观察到Lambda 参数records发生了微小变化。event

对于第一个触发器

NewImage["IsMachineOn"]["BOOL"]的值为False

OldImage["IsMachineOn"]["BOOL"]的值为True

对于第二个触发器

NewImage["IsMachineOn"]["BOOL"]的值为False

OldImage["IsMachineOn"]["BOOL"]的值为False

我打开了业务逻辑,NewImage["IsMachineOn"]["BOOL"]==False以便我的业务逻辑运行两次。

有两件事:

  1. 为什么 Lambda 运行了两次?
  2. 解决此问题的解决方法是什么?

bes*_*hes 1

我们在使用全局表在多个区域的 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 /sf/answers/1809638071/"""
    return ordered(json1) == ordered(json2)
Run Code Online (Sandbox Code Playgroud)