如何在DynamoDB记录因TTL过期删除时触发Lambda函数并获取相关记录信息
如何在DynamoDB记录因TTL过期删除时触发Lambda函数并获取相关记录信息
我来帮你搞定这个问题!其实AWS专门提供了针对TTL删除事件的DynamoDB流特性,能完美满足你的需求,下面一步步拆解实现方案:
一、启用DynamoDB流并配置正确的视图类型
首先要给你的DynamoDB表开启流,并且选择合适的视图类型,这样才能拿到被删除记录的完整数据:
- 登录DynamoDB控制台,找到目标表,进入「流」标签页
- 点击「启用」,在视图类型中选择
OLD_IMAGE或者NEW_AND_OLD_IMAGES(前者只返回被删除的旧记录,后者会包含新旧数据,按需选择即可) - 保存配置后,DynamoDB就会把包括TTL删除在内的所有数据变更事件发送到流中
二、配置Lambda触发器并精准识别TTL删除事件
接下来把DynamoDB流绑定到你的Lambda函数,然后在代码里过滤出TTL触发的删除操作:
- 在Lambda控制台,找到你的函数,进入「触发器」标签页,点击「添加触发器」
- 选择「DynamoDB」作为触发器类型,选择刚才配置了流的表,设置合适的批量大小(比如100)和起始位置(建议选「最新」),保存配置
- 在Lambda代码里,通过流事件的
userIdentity字段判断是否为TTL删除:
当记录是被TTL自动删除时,eventName会是REMOVE,同时userIdentity.type为Service,userIdentity.principalId为dynamodb.amazonaws.com。下面是Node.js的示例代码:exports.handler = async (event) => { for (const record of event.Records) { // 精准过滤TTL触发的删除事件 if (record.eventName === 'REMOVE' && record.userIdentity?.type === 'Service' && record.userIdentity?.principalId === 'dynamodb.amazonaws.com') { // 获取被删除的记录完整数据 const deletedItem = record.dynamodb.OldImage; console.log('TTL过期删除的记录详情:', deletedItem); // 在这里编写你的业务处理逻辑 } } return { statusCode: 200, body: '处理完成' }; };
三、关于你之前尝试方案的补充说明
- 普通DynamoDB触发器:你之前觉得没法区分删除原因,其实是没注意到流事件里的
userIdentity标识,这个字段是区分TTL自动删除和手动/其他删除的关键,用上面的判断逻辑就能解决 - CloudWatch告警:这个方案确实不适合,因为告警没法直接传递具体的删除记录数据,还容易出现重复触发的问题,完全没必要用
- 自定义日志组:处理日志的成本远高于直接用DynamoDB流,流已经提供了结构化的事件数据,能直接拿到删除记录的详情,所以不需要折腾日志组
备注:内容来源于stack exchange,提问作者Tarkeshwar Kumar
相关产品推荐
相关产品推荐

