如何自动按创建时间每2个月删除DynamoDB中的记录?
自动化实现DynamoDB记录创建后2个月自动删除的方案
要实现记录创建后每2个月自动删除,核心是自动给每条记录设置TTL时间戳,以下是几种实用的自动化方案:
方案1:写入数据时直接计算TTL(最推荐)
在应用层写入DynamoDB的时候,直接计算当前时间加2个月的秒级时间戳,作为TTL字段的值存入。这种方式最直接高效,不需要额外的服务依赖。
示例代码(Python)
import time from datetime import datetime, timedelta # 计算2个月后的秒级时间戳(按60天近似,或用更精确的月份计算) two_months_later = datetime.now() + timedelta(days=60) ttl_timestamp = int(two_months_later.timestamp()) # 构造写入DynamoDB的项 item = { 'item_id': 'unique-item-id', 'content': 'your-data-content', 'expire_at': ttl_timestamp # 这个字段需要在DynamoDB表中开启TTL功能 } # 执行写入操作(此处省略DynamoDB SDK调用代码)
前置配置
在DynamoDB控制台或通过CLI,将表中的expire_at字段设置为TTL属性,DynamoDB会自动周期性清理该字段值小于当前时间的记录。
方案2:用DynamoDB Streams + Lambda补全TTL
如果数据由其他系统写入,无法在写入时设置TTL,可以通过DynamoDB流捕获新写入的记录,再用Lambda自动计算并更新TTL字段。
步骤
- 给目标DynamoDB表开启DynamoDB Streams,选择捕获"新图像"(New Image)。
- 创建Lambda函数,将触发源配置为上述DynamoDB流。
- 在Lambda中解析流记录,计算TTL时间戳并更新对应记录。
示例代码(Node.js)
const AWS = require('aws-sdk'); const docClient = new AWS.DynamoDB.DocumentClient(); exports.handler = async (event) => { for (const record of event.Records) { if (record.eventName !== 'INSERT') continue; const newItem = record.dynamodb.NewImage; // 从流中获取记录的近似创建时间,或使用item自带的创建时间字段 const createTimestamp = record.dynamodb.ApproximateCreationDateTime; const twoMonthsLater = new Date(createTimestamp * 1000); twoMonthsLater.setMonth(twoMonthsLater.getMonth() + 2); const ttlTimestamp = Math.floor(twoMonthsLater.getTime() / 1000); // 更新记录的TTL字段 const updateParams = { TableName: 'your-table-name', Key: { item_id: newItem.item_id.S }, // 替换为你的表主键 UpdateExpression: 'SET expire_at = :ttl', ExpressionAttributeValues: { ':ttl': ttlTimestamp } }; await docClient.update(updateParams).promise(); } };
权限配置
确保Lambda角色拥有:
- 读取DynamoDB流的权限
- 更新目标DynamoDB表的权限
方案3:定期扫描补全TTL(适合存量数据)
如果有存量未设置TTL的记录,或者需要定期校验,可以用EventBridge(原CloudWatch Events)触发Lambda,定期扫描表并补全TTL字段。
步骤
- 在EventBridge中创建定时规则(比如每天执行一次)。
- 关联Lambda函数,函数逻辑为扫描表中未设置
expire_at的记录,计算创建时间+2个月的TTL并更新。
注意事项
- 扫描大表时建议用分段扫描(Paginate)避免超时
- 这种方式效率低于前两种,仅作为补充方案
关键注意点
- TTL时间戳必须是秒级(不是毫秒),否则DynamoDB无法识别
- DynamoDB的TTL清理不是实时的,一般会在24-48小时内完成,大部分场景下几小时内即可处理
- 若使用月份计算,注意跨月和闰年问题,可根据业务需求选择按60天近似或精确计算月份
内容的提问来源于stack exchange,提问作者user20986502
相关产品推荐
相关产品推荐

