使用 TTL 使临时记录过期

AWSBeginner
立即练习

介绍

临时会话记录到期后,即使存储清理尚未完成,也应停止向用户提供。你将启用 TTL,修复类型错误的过期属性,并配置提供的应用,使它在实际读取服务数据时排除过期记录。

请先完成“为订单创建 DynamoDB 表”和“使用分区键和排序键查询订单”。全新环境提供一张独立的会话表、三条合成记录和一个读取器框架,供你配置 TTL 和读取过滤条件。使用 /home/labex/project、官方 AWS CLI 和 AWS View。本实验评估 TTL 配置和识别过期数据的读取行为,不承诺 AWS 后台删除的完成期限。

认证考点

认证 考点 本实验练习
Developer – Associate (DVA-C02) 任务 1.3 DynamoDB TTL 配置与识别过期数据的读取。
Data Engineer – Associate (DEA-C01) 任务 2.3 基础练习:DynamoDB TTL 配置与识别过期数据的读取。

实验概览

使用 AWS4 图标并由 draw.io 导出的概念图:TTL 使用以秒为单位的 Number 过期属性;提供的会话读取应用排除过期记录,返回有效和永久记录,这与异步存储删除是不同的结果。

在准备好的会话表上启用过期功能

本步骤中,你将配置表的过期属性。生存时间(Time to Live,TTL)让 DynamoDB 最终移除过期项目。它是异步清理机制,并非在每个项目到期的那一秒精确删除它的计时器。在服务尚未完成删除时,应用仍必须拒绝返回过期数据。

对本实验的会话读取器,记录是否可提供给应用与是否已从存储删除是两个结果。你将检查 TTL 状态、修复有效期类型,再对比应用结果与原始读取。ENABLED 证明配置;应用排除过期会话证明读取策略,并不证明服务已删除项目。

全新环境中的会话表包含有效、过期和永久的合成记录。启用任何功能之前,先检查记录的类型以及处于禁用状态的 TTL 配置。

cd /home/labex/project
aws dynamodb scan --table-name labex-d05-sessions --consistent-read
aws dynamodb describe-time-to-live --table-name labex-d05-sessions

在 expires_at 上启用 TTL。每个项目提供自己的到期时间;表配置决定 TTL 服务检查哪个属性。缺少该属性表示这个项目没有 TTL 到期时间。

aws dynamodb update-time-to-live \
  --table-name labex-d05-sessions \
  --time-to-live-specification Enabled=true,AttributeName=expires_at
aws dynamodb describe-time-to-live --table-name labex-d05-sessions

描述结果显示 ENABLED 和 expires_at 后再继续。在 AWS 上,启用可能需要一段时间;处于 ENABLING 状态时,应重复执行描述命令,而不是反复更改配置。查看上方的 AWS View,展开会话卡片中的 TTL 条目。

修复过期记录的属性类型

本步骤中,你将存储有效的到期值。DynamoDB TTL 要求 Number 类型的 Unix 纪元秒数,也就是自 1970-01-01 UTC 起经过的秒数。使用毫秒会表示遥远的未来时间。看起来像时间戳的字符串仍然是 String 类型,TTL 进程会忽略它。

通过精确的键检查预置的过期记录。它的 expires_at 被故意编码为 S;启用 TTL 并不会修复这个类型。

aws dynamodb get-item \
  --table-name labex-d05-sessions \
  --key '{"session_id":{"S":"expired"}}' \
  --consistent-read

使用 Linux 的 date 命令计算一小时前的到期时间。+%s 输出 Unix 秒数,$(...) 将该输出保存到 EXPIRED 中。每次运行的值都不同,但它必须早于当前时间。

EXPIRED=$(date -u -d '1 hour ago' +%s)
echo "$EXPIRED"

将带类型的值写入一个小型 JSON 文件。这里的 heredoc 使用不带引号的 JSON 分隔符,因此 shell 会将 $EXPIRED 替换为你的时间戳;此前带引号的分隔符会保留原始文本。把 JSON 放入文件可以避免转义其中的引号。

cat > expiry-values.json <<JSON
{":expires":{"N":"$EXPIRED"}}
JSON

使用 UpdateItem 仅替换过期属性。file:// 加载值文件;存在条件可以避免在异步删除已经移除记录时重新创建它。

aws dynamodb update-item \
  --table-name labex-d05-sessions \
  --key '{"session_id":{"S":"expired"}}' \
  --update-expression 'SET expires_at = :expires' \
  --condition-expression 'attribute_exists(session_id)' \
  --expression-attribute-values file://expiry-values.json \
  --return-values ALL_NEW

返回的过期项目具有 expires_at: {"N": "..."},其时间位于过去,且 purpose 保持不变。有效项目的到期时间仍在未来;永久项目仍然没有到期属性。在 AWS 上,如果记录在后续读取或更新前已被移除,只有成功的服务响应才能证明它已删除,连接失败不能作为证据。

在应用读取流程中排除过期数据

本步骤中,你将在 TTL 清理尚未完成时保护读取行为。提供的 session-reader 应用读取普通的 session-reader.json 设置,并实际发送 Scan 请求。它的默认配置故意也返回过期数据。你可以查看应用源代码,但无需编写 Python。

./session-reader

在这个环境中,未过滤的读取器仍会返回全部三条记录,包括 expired。这不能证明 TTL 配置错误。AWS 后台删除可能稍后发生,本实验的验收不包含精确的删除时间安排。

启用应用的过期过滤功能。带引号的 heredoc 按原样写入 JSON,替换设置文件。

cat > session-reader.json <<'JSON'
{
  "table": "labex-d05-sessions",
  "filter_expired": true
}
JSON
./session-reader

应用使用 attribute_not_exists(expires_at) OR expires_at > :now,传入 Number 类型的当前秒数,并沿着 Scan 的续读键读取后续页面。现在它只返回 active 和 permanent,Count 为 2,FilterExpired 为 true。永久记录被有意保留,因为它没有过期策略。过滤可以防止应用提供过期数据,但不会减少已经执行的扫描读取工作。

启用应用过滤后,即使存储中的记录仍然存在,过期数据也会被排除。

比较按键直接读取的原始结果与应用结果。

aws dynamodb get-item \
  --table-name labex-d05-sessions \
  --key '{"session_id":{"S":"expired"}}' \
  --consistent-read

直接读取的结果可能仍包含 expired,而应用会排除它。如果 AWS 已经删除它,成功但没有项目的 GetItem 响应也符合 TTL 的行为。AWS View 显示 TTL 配置和读取器实际返回的两个项目,不会把过滤描述为对存储记录的物理删除。

TTL 已启用,同时应用从实际读取结果中排除了过期数据。

删除本实验的会话表

本步骤中,你将在验证过期配置和应用行为后,明确执行表清理。不要等待 TTL 删除整张表:TTL 删除项目,不会删除表本身。删除这张临时表也会移除它的 TTL 配置。

aws dynamodb delete-table --table-name labex-d05-sessions
aws dynamodb wait table-not-exists --table-name labex-d05-sessions
aws dynamodb list-tables
aws dynamodb get-item \
  --table-name labex-d05-reference \
  --key '{"id":{"S":"platform"}}' \
  --consistent-read

只剩下参考表,其中的 note 为 keep unchanged。成功的表清单查询和参考记录读取,证明删除后连接仍正常。AWS View 会移除会话表和读取器结果。临时连接随本 VM 结束。

总结

你在 expires_at 上启用了 TTL,将字符串时间戳替换为数字形式的纪元秒数,并在实际应用的读取流程中排除了过期会话。你区分了逻辑过期与异步物理删除,并有意保留了永久记录。最后,你删除了本实验的表,并保留了无关的参考表。

进一步阅读 AWS 官方资料:TTL 过期与异步项目删除。