通过Lambda函数内部逻辑判断和异常处理来解决AWS DataSync在Lambda事件中引起的双重触发。
代码示例:
import json
import boto3
def lambda_handler(event, context):
# 只处理s3:ObjectCreated事件
if event['Records'][0]['eventName'] != 'ObjectCreated:Put':
return
# 获取文件名
key = event['Records'][0]['s3']['object']['key']
# 防止重复触发
if 'datalake' in key:
return
# 在文件名中添加标识
new_key = 'datalake/' + key
# 复制文件到datalake目录下
s3 = boto3.resource('s3')
s3.Object('mybucket', new_key).copy_from(
CopySource={'Bucket': 'mybucket', 'Key': key})
# 删除源文件
s3.Object('mybucket', key).delete()
在上述代码示例中,我们通过检查事件记录的eventName属性,只处理s3:ObjectCreated:Put事件。通过在文件名中添加标识,防止AWS DataSync在Lambda事件中二次触发。最后,处理完复制和删除操作后,Lambda函数将退出。这样就可以避免因AWS DataSync引起的问题而导致的多次重复执行Lambda函数的问题。