Введение
Приложение должно перестать выдавать временные записи сеансов по истечении срока действия, даже если очистка хранилища ещё не произошла. Вы включите TTL, исправите неверный тип атрибута срока действия и настроите предоставленное приложение так, чтобы оно исключало просроченные данные при реальном чтении из сервиса.
Сначала выполните лабораторные работы «Создание таблицы DynamoDB для заказов» и «Запрос заказов по ключу раздела и ключу сортировки». В свежей среде подготовлены независимая таблица сеансов, три синтетические записи и каркас приложения чтения. Вам предстоит настроить TTL и фильтр чтения. Используйте /home/labex/project, официальный AWS CLI и AWS View. В этой работе проверяются настройка TTL и чтение с учётом срока действия; срок фонового удаления AWS не гарантируется.
Связь с сертификацией
| Сертификация | Задача экзамена | Практика |
|---|---|---|
| Developer – Associate (DVA-C02) | Задача 1.3 | Настройка TTL DynamoDB и чтение с учётом истечения срока. |
| Data Engineer – Associate (DEA-C01) | Задача 2.3 | Базовая практика: Настройка TTL DynamoDB и чтение с учётом истечения срока. |
Обзор работы

Включите срок действия для подготовленной таблицы сеансов
На этом шаге вы настроите атрибут срока действия таблицы. Time to Live (TTL) позволяет DynamoDB со временем удалять просроченные элементы. Это асинхронная очистка, а не таймер, который удаляет каждый элемент точно в секунду истечения срока. Приложения должны отказывать в выдаче просроченных данных, пока удаление сервисом ещё не произошло.
Для этого считывателя сессий допустимость выдачи записи и её удаление из хранилища — разные результаты. Вы проверите статус TTL, исправите тип срока действия и сравните ответ приложения с прямым чтением. ENABLED подтверждает настройку; исключение просроченной сессии подтверждает политику чтения, а не удаление элемента сервисом.
В свежей среде есть таблица сеансов с активной, просроченной и бессрочной синтетическими записями. Перед включением TTL проверьте их типы и убедитесь, что 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
Включите TTL для expires_at. Каждый элемент содержит собственное время истечения срока; настройка таблицы определяет, какой атрибут проверяет сервис 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, повторяйте команду describe вместо многократного изменения настройки. Посмотрите на AWS View вверху и разверните запись TTL в карточке сеансов.
Исправьте тип атрибута просроченной записи
На этом шаге вы сохраните допустимое значение срока действия. TTL DynamoDB требует значение 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 не заключён в кавычки, поэтому оболочка заменяет $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": "..."} со временем в прошлом и сохраняет своё назначение. Время активного элемента остаётся в будущем; у бессрочного элемента по-прежнему нет срока действия. В 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.
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.
Резюме
Вы включили TTL для expires_at, заменили строковую временную метку числовым временем Unix в секундах и исключили просроченные сеансы из реального пути чтения приложения. Вы различили логическое истечение срока и асинхронное физическое удаление и намеренно сохранили бессрочные записи. В завершение вы удалили принадлежащую работе таблицу и сохранили независимую эталонную таблицу.
Подробнее см. в документации AWS: Срок TTL и асинхронное удаление элементов.



