如何设置DynamoDB条目TTL 启用后未自动删除问题排查
问题描述
通过批量操作向采用复合主键(分区键+排序键)结构的DynamoDB表写入数据,已为该表启用time to live(TTL)自动过期删除功能,但监控指标deletedItemsCount始终无变化,已写入的过期条目未被自动删除。
使用的写入代码如下:
def generate_item(data): item = { "pk": data['pk'], "ttl": str(int(time.time())), # 测试时设置为当前时间 "data": json.dumps({"data": data}), "sk": data['sk'] } return item def put_input_data(input_data, table_name): dynamodb = boto3.resource('dynamodb') table = dynamodb.Table(table_name) data_list = input_data["data"] try: with table.batch_writer() as writer: for index, data in enumerate(data_list): writer.put_item(Item=generate_item(data)) except ClientError as exception_message: raise
执行写入后可在表中查询到成功写入的条目,但deletedItemsCount指标始终无数据变动,TTL功能未按预期生效。
核心问题原因
TTL功能未生效的根本原因是TTL字段类型不符合DynamoDB要求:
DynamoDB TTL机制要求配置的过期时间字段必须为数字类型(Number),存储值为秒级Unix epoch时间戳。代码中通过str(int(time.time()))将时间戳转为了字符串类型,TTL后台扫描进程无法识别该字段的过期时间,不会触发删除逻辑。
除了字段类型错误外,还有两个常见的TTL不生效诱因可以逐一排查:
- 表的TTL配置中指定的过期属性名与实际写入的字段名不匹配(DynamoDB属性名大小写敏感,比如配置为
TTL但实际写入ttl会导致识别失败) - TTL删除是后台异步执行操作,条目到达过期时间后,通常会在48小时内完成删除,删除动作完成后
deletedItemsCount指标才会更新,不会在过期瞬间立刻触发删除和指标上报。
修复方案
- 修改代码中TTL字段的赋值逻辑,去掉字符串转换,直接写入数字类型的时间戳:
def generate_item(data): item = { "pk": data['pk'], "ttl": int(time.time()), # TTL字段必须为数字类型秒级Unix时间戳,禁止转字符串 "data": json.dumps({"data": data}), "sk": data['sk'] } return item
- 之前写入的TTL值为字符串类型的存量条目,无法被TTL进程自动识别删除,需要手动清理或重新写入正确类型的TTL值。
- 进入DynamoDB控制台确认表的TTL状态为「已启用」,且配置的过期属性名与代码中写入的字段名完全一致。
- 写入新的测试条目后耐心等待后台异步删除执行,无需反复写入测试数据。
内容的提问来源于stack exchange,提问作者Vineet
相关产品推荐
相关产品推荐

