Введение
Приложение читает каталог из DynamoDB при каждом запросе. Добавьте узел Amazon ElastiCache с Valkey, чтобы повторно использовать данные товара. Докажите результат по источнику ответа и реальному числу обращений к базе.
Сначала пройдите AWS Foundations for Beginners и базовые операции с элементами в AWS DynamoDB for Beginners. Эта независимая среда предоставляет приложение, каталог и сеть. Выполняйте команды в Terminal, наблюдайте узел, записи и ответы в AWS View. AWS CLI уже настроен; личный аккаунт и ресурсы предыдущих работ не нужны.
Связь с сертификацией
| Сертификация | Задача экзамена | Практика |
|---|---|---|
| Cloud Practitioner (CLF-C02) | Task 3.4 | Отличать кэш в памяти от достоверных исходных данных и наблюдать поведение приложения. |

Наблюдение за источником товаров
Кэш хранит повторно используемые данные в памяти. База остаётся источником достоверных данных: потеря копии в кэше не должна удалять запись каталога. Сначала изучите приложение без кэша.
Перейдите в каталог проекта и подтвердите настроенную идентификацию:
cd /home/labex/project
aws sts \
get-caller-identity
ARN оканчивается на labex-ca01-operator и обозначает эту среду. Прочитайте товар 101 прямо из DynamoDB. S обозначает строки, N — числа:
aws dynamodb \
get-item \
--table-name product-catalog \
--key '{"product_id":{"S":"101"}}' \
--consistent-read
Travel mug стоит 20.00. Независимый товар 202, Notebook, должен остаться неизменным. HTTP-приложение возвращает JSON товара. Запросите его дважды:
curl -sS http://127.0.0.1:8080/api/products/101
curl -sS http://127.0.0.1:8080/api/products/101
Оба ответа содержат "served_from":"source". В AWS View счётчик чтений увеличился на два, а карточка ElastiCache пока не содержит кластера. Чтение означает реальный запрос к DynamoDB, а не измеренную стоимость AWS. Send request также отправляет настоящий запрос и может изменить счётчик. Сравнивайте его изменение, а не фиксированное итоговое значение.

Создание узла Valkey
Amazon ElastiCache управляет механизмами кэширования в памяти. Valkey хранит значения по ключу; здесь ID товара определяет его копию. Используется один автономный узел. Предоставленная группа подсетей задаёт подготовленное размещение, а группа безопасности — сетевую конфигурацию. Проектирование правил рассматривается в курсе VPC.
Прочитайте сетевые идентификаторы этой новой среды:
cat resources.json
Сохраните и выведите ID группы безопасности. $(...) сохраняет вывод команды для следующей операции:
CACHE_GROUP_ID=$(jq -r .security_group_id resources.json)
echo "$CACHE_GROUP_ID"
Создайте небольшой кэш из одного узла с идентификатором product-cache. Механизм и количество узлов выбирают конфигурацию Valkey этого курса:
aws elasticache \
create-cache-cluster \
--cache-cluster-id product-cache \
--engine valkey \
--engine-version 7.2 \
--cache-node-type cache.t3.micro \
--num-cache-nodes 1 \
--cache-subnet-group-name product-cache-network \
--security-group-ids "$CACHE_GROUP_ID"
Наблюдайте CacheClusterStatus и запросите endpoint — адрес и порт подключения:
aws elasticache \
describe-cache-clusters \
--cache-cluster-id product-cache \
--show-cache-node-info \
--query 'CacheClusters[0].{Status:CacheClusterStatus,Nodes:CacheNodes}'
Продолжайте, когда кластер имеет статус available, а узел 0001 — endpoint. Если создание продолжается, немного подождите и повторите запрос. Сохраните и выведите реальный адрес:
CACHE_HOST=$(aws elasticache \
describe-cache-clusters \
--cache-cluster-id product-cache \
--show-cache-node-info \
--query 'CacheClusters[0].CacheNodes[0].Endpoint.Address' \
--output text)
echo "$CACHE_HOST"
Проверьте соединение предоставленным клиентом Valkey:
valkey-cli -h "$CACHE_HOST" -p 6379 PING
PONG доказывает ответ механизма кэша, но пока не его использование приложением. AWS View показывает реальный узел и endpoint.
Подключение приложения и попадание в кэш
При cache-aside приложение сначала ищет product:101 в кэше. Отсутствующий ключ — промах: приложение читает DynamoDB и сохраняет товар. Последующее попадание возвращает копию без нового чтения базы.
app.json содержит обычные настройки. Измените режим и endpoint через jq, запишите временный файл и замените конфигурацию:
jq --arg host "$CACHE_HOST" \
'.mode = "cache-aside" | .cache_host = $host' \
app.json > app.next.json
mv app.next.json app.json
Проверьте новые настройки:
cat app.json
Они перечитываются при каждом запросе, перезапуск не нужен. ttl_seconds — срок жизни копии; следующая работа рассматривает истечение и актуальность. Запросите товар один раз:
curl -sS http://127.0.0.1:8080/api/products/101
Первый ответ содержит served_from: source, поскольку новый кэш пуст. Посмотрите счётчик в AWS View и повторите:
curl -sS http://127.0.0.1:8080/api/products/101
Теперь ответ содержит served_from: cache с теми же ID, названием и ценой; счётчик не растёт. Если AWS View уже запрашивал товар, первый запрос Terminal может попасть в кэш. Сравнивайте последовательные запросы после заполнения. Прочитайте реально сохранённое значение:
valkey-cli -h "$CACHE_HOST" -p 6379 GET product:101
JSON соответствует записи Travel mug. Это доказывает сокращение обращений к базе при повторных запросах, но не производственные задержки, ёмкость или доступность. Оставьте приложение и узел для проверки. Учебная среда временная; в настоящем аккаунте AWS удаляйте ненужные кэши, чтобы прекратить дальнейшие расходы.

Итоги
Вы создали узел Valkey, подключили приложение и наблюдали промахи и попадания cache-aside. Копия совпадает с достоверными данными DynamoDB, а попадания обходятся без повторного чтения. Далее изучите актуальность с TTL и явной инвалидацией.
Подробнее см. в документации AWS: Поток данных cache-aside; Выбор конечной точки подключения к кэшу.



