Viv*_*ble 5 amazon-dynamodb aws-lambda
我有附加到 DynamoDB 更改事件的 Lambda 函数。当我更改/修改 DynamoDB 中的测试机表中的项目时,Lambda 会触发两次。
我正在将IsMachineOn值从修改True为False,它触发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以便我的业务逻辑运行两次。
有两件事:
我们在使用全局表在多个区域的 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)
| 归档时间: |
|
| 查看次数: |
2397 次 |
| 最近记录: |