AWS DataSync同步S3桶触发Lambda函数两次问题求助
解决AWS DataSync同步后触发S3 Lambda两次的问题
这问题挺常见的,根源在于你开启了DataSync的完整性校验——DataSync的工作流程是:
- 先将文件通过
Put操作写入桶B - 完成完整性校验后,会再发起一次
Put操作更新文件的元数据(比如校验和相关字段)
这两次操作都会触发ObjectCreated:Put事件,时间差刚好对应校验的耗时,所以Lambda会被触发两次。
给你几个可行的解决办法:
1. 给S3事件添加过滤规则
直接在S3桶B的Lambda触发器里配置过滤条件,把仅更新元数据的事件排除:
- 打开桶B的事件通知设置,找到绑定的Lambda触发器
- 添加过滤规则:设置
x-amz-metadata-directive不等于REPLACE
(DataSync更新元数据时会携带该请求头为REPLACE,首次上传文件时这个头要么是COPY要么不存在,实际测试后可微调)
2. 在Lambda内部实现去重逻辑
如果不想修改S3配置,可以在Lambda函数里加去重判断:
- 从触发事件中提取对象键和事件时间戳
- 用DynamoDB存储最近处理过的对象记录(比如保留30秒的窗口期),每次处理前先查询,若该对象在最近30秒内已经处理过,直接返回成功即可
- 也可以对比S3对象的ETag,两次触发事件对应的ETag是一致的,也能用来判断是否为重复触发
3. 关闭DataSync的完整性校验(不推荐)
如果业务对数据一致性要求不高,可以关闭DataSync的传输后校验,但这会失去数据完整性保障,除非你能接受这个风险,否则不建议采用此方案
内容的提问来源于stack exchange,提问作者Ziv M
相关产品推荐
相关产品推荐

