You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何设置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指标才会更新,不会在过期瞬间立刻触发删除和指标上报。
修复方案
  1. 修改代码中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
  1. 之前写入的TTL值为字符串类型的存量条目,无法被TTL进程自动识别删除,需要手动清理或重新写入正确类型的TTL值。
  2. 进入DynamoDB控制台确认表的TTL状态为「已启用」,且配置的过期属性名与代码中写入的字段名完全一致。
  3. 写入新的测试条目后耐心等待后台异步删除执行,无需反复写入测试数据。

内容的提问来源于stack exchange,提问作者Vineet

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 17:09:25