我们在python中开发了两个lambda函数,如下所示:
用于RDS写入的Lambda函数-此函数解析在S3上上传的.csv文件并写入AWS Aurora数据库。文件处理日志将转储到cloudwatch中。
Lambda函数已订阅从第一个写入RDS的lambda函数创建的cloudwatch组-每次将新日志添加到RDS write lambda日志组时都会触发该事件。
我们已经订阅了cloudwatch组的第二个lambda函数。它在大多数情况下都能正确解析cloudwatch日志,但在某些情况下,我们注意到,即使在第一个lambda函数完成将所有日志写入日志组之前,lambda函数也会被触发。单次执行第一个lambda函数会触发第二个lambda函数多次,并且每次执行都会获取部分日志组数据以进行解析。
上述行为不一致,大多数情况下,每次执行第一个lambda函数时,都会执行一次第二个lambda函数。
我有以下代码用于收集日志流
def lambda_handler(event, context):
print(f'Logging Event: {event}')
print(f"Awslog: {event['awslogs']}")
cw_data = event['awslogs']['data']
print(f'data: {cw_data}')
print(f'type: {type(cw_data)}')
compressed_payload = base64.b64decode(cw_data)
uncompressed_payload = gzip.decompress(compressed_payload)
payload = json.loads(uncompressed_payload)
messagelst=[]
for log_event in payload:
data_log=json.loads(json.dumps(log_event))
messagelst.append(re.split(r'\t',data_log['message'])
messagelst收集完整的日志以进行解析并将其发送到解析器功能。我们注意到解析器功能有时无法获取完整的日志数据。
答案 0 :(得分:0)
我认为问题与以下事实有关:从CloudWatch的角度来看,输出中的每一行都是单独的记录/事件。
根据此问题(How does Amazon CloudWatch batch logs when streaming to AWS Lambda?),当前行为是调用PutLogEvents时将触发您的“第二个” lambda(AWS文档中也未说明,因此可能会更改或更改已经)。
跟随面包屑,问题是AWS如何处理“第一” lambda的输出(就内部调用PutLogEvents而言)。我找不到确切的答案。这个问题(Lambda log and CloudWatch PutLogEvents limit)表明它可能在执行结束时仅调用一次,但是没有对该声明的确认。我怀疑这种行为会随所产生的输出量和产生它的时间而变化。
该问题的一个简单解决方案是对记录的数据进行编码以确保它始终是一行-有很多方法可以做到这一点(例如,只需删除换行符,对其进行转义,或者仅进行base64编码即可)整个过程)。