Проекты на AWS

Разработка современного интернет‑приложения

Развертывание интернет‑приложения, подключение к базе данных и анализ поведения пользователей

Модуль 5. Запись сведений о поведении пользователей

В этом модуле вы научитесь записывать сведения о поведении пользователей с помощью сервиса AWS Lambda и других бессерверных сервисов.

Обзор

Теперь, когда ваш сайт Mythical Mysfits создан и работает, давайте придумаем способ, которым можно анализировать то, как пользователи взаимодействуют с веб-сайтом и профилями бездомных существ на нем. Было бы гораздо проще анализировать действия пользователей, которые выполнены на веб-сайте и привели к изменению данных в серверной части (например, в случаях, когда бездомным существам ставят отметку «нравится» или забирают их себе).

Но, понимая действия, которые пользователи выполняют на веб-сайте перед тем, как поставят отметку «нравится» или заберут бездомное существо себе, вы сможете усовершенствовать интерфейс веб-сайта, что позволит еще быстрее находить хозяев для бездомных существ. Чтобы упростить сбор таких сведений, мы реализуем для интерфейсной части веб-сайта следующую возможность: каждый раз, когда пользователь щелкает профиль бездомного существа, интерфейсная часть будет отправлять крошечный запрос к API нового микросервиса (который мы создадим). Эти записи будут обрабатываться в режиме реального времени функцией с бессерверным кодом, агрегироваться и храниться для анализа, который вы, возможно, захотите выполнить в будущем.

В принципах разработки современных приложений предпочтение отдается специализированным изолированным модульным сервисам. Поэтому вместо того, чтобы добавлять дополнительные методы и возможности в существующий сервис Mysfits, с которым вы до сих пор работали, мы создадим другой изолированный сервис для получения сведений о событиях щелчков, сделанных пользователями, с веб-сайта Mysfits. Этот полный стек представлен с помощью предоставленного шаблона CloudFormation.

Схема архитектуры

запись сведений о поведении пользователей

Почему мы выбрали сервис AWS Lambda для реализации этого проекта?

Сервис Lambda отлично подходит для приложений, ориентированных на работу с данными, которым нужно в режиме реального времени реагировать на изменения данных и состояния системы, а также на действия, выполняемые пользователями. Такие приложения обычно подключаются к хранилищам данных, чтобы получать доступ к данным и анализировать их для пакетной обработки, потоковой аналитики и получения выводов с помощью средств машинного обучения. Сервис Lambda отлично подходит для таких приложений, так как он интегрирован с хранилищами данных, например с Kinesis Data Streams и Data Firehose, S3, CloudWatch Events, CloudWatch Logs и DynamoDB (на сегодняшний день в нем используются 17 источников событий).   

Бессерверные ресурсы, используемые в этом модуле

Поток доставки AWS Kinesis Firehose: Kinesis Firehose – это высокодоступный и управляемый сервис потоковой передачи в режиме реального времени, который получает записи данных и автоматически принимает их в несколько возможных хранилищ назначения в AWS, например в корзину Amazon S3 или кластер хранилища данных Amazon Redshift. Кроме того, сервис Kinesis Firehose позволяет автоматически доставлять все записи, полученные при потоковой передаче, в бессерверную функцию, созданную с помощью сервиса AWS Lambda. Это означает, что написанный вами код может выполнять дополнительную обработку или преобразование записей, прежде чем они будут агрегированы и сохранены в настроенном месте назначения.

Корзина Amazon S3: в сервисе S3 будет создана корзина, в которой все обработанные записи о событиях щелчков будут агрегированы в файлы и сохранены в качестве объектов.

Функция AWS Lambda: с помощью сервиса AWS Lambda разработчики могут писать функции кода, содержащие только то, что необходимо для реализации логики этих функций, а затем развертывать, вызывать, делать высоконадежным и масштабировать свой код без необходимости управлять инфраструктурой. Здесь мы определяем бессерверную функцию кода с помощью сервиса AWS SAM. Она будет написана на языке Python и развернута в сервисе AWS Lambda. Она будет обрабатывать и дополнять записи о щелчках, получаемые потоком доставки. Написанный нами код очень прост, и дополнения, которые он делает, можно было бы выполнить в интерфейсной части веб-сайта без какой-либо последующей обработки. Функция получает дополнительные атрибуты о щелчках по профилю бездомного существа, чтобы сделать запись о щелчке более полезной (данные, которые уже получены интерфейсной частью веб-сайта). Для целей данного семинара код разработан так, чтобы продемонстрировать возможности архитектуры по включению бессерверных функций кода для выполнения любой необходимой обработки или преобразования в режиме реального времени перед сохранением записей. После создания функции Lambda и настройки потока доставки Kinesis Firehose в качестве источника событий поток доставки будет автоматически доставлять записи о щелчках в качестве событий в созданную нами функцию кода, получать ответы, возвращаемые кодом, и доставлять обновленные записи в настроенную корзину Amazon S3.

REST API сервиса Amazon API Gateway: как и в других сервисах AWS, в AWS Kinesis Firehose имеется API сервиса, и в данном случае мы используем операцию PutRecord этого API для помещения события щелчка, сделанного пользователем, в поток доставки. Тем не менее мы не хотим интегрировать интерфейсную часть нашего веб-сайта непосредственно с API PutRecord сервиса Kinesis Firehose. Если сделать это, нам потребуется управлять данными AWS для доступа в коде интерфейсной части для авторизации запросов этого API к API PutRecord, и это может раскрыть пользователям непосредственный API AWS, от которого зависит наш API (что может поощрить посетителей-злоумышленников попытаться добавить в поток доставки записи в неправильном формате либо записи, которые затруднят достижение нашей цели – понять поведение пользователей). Поэтому вместо этого мы воспользуемся сервисом Amazon API Gateway, чтобы создать прокси для сервиса AWS для работы с API PutRecord сервиса Kinesis Firehose. Это позволит нам создать собственный общедоступный адрес RESTful, при использовании которого не потребуется управлять данными AWS для доступа в интерфейсной части при выполнении запросов. Мы также будем использовать шаблон сопоставления запросов в сервисе API Gateway, который предоставит нам возможность определять нашу собственную структуру полезных нагрузок запросов, которая будет ограничивать запросы к нашей ожидаемой структуре, а затем преобразовывать эти правильно сформированные запросы в структуру, требуемую для API PutRecord сервиса Kinesis Firehose.

Роли IAM: для сервиса Kinesis Firehose требуется роль сервиса, которая позволяет ему доставлять полученные записи в качестве событий в созданную функцию Lambda, а также обработанные записи в корзину назначения S3. Для API сервиса Amazon API Gateway также требуется новая роль, которая разрешает API вызывать API PutRecord в рамках сервиса Kinesis Firehose для каждого полученного запроса к API.

Инструкции по внедрению

  • A. Создание репозитория CodeCommit

    Этот новый стек, который вы развернете с помощью сервиса CloudFormation, будет не только содержать ресурсы среды инфраструктуры, но и сам код приложения, который сервис AWS Lambda будет выполнять для обработки событий потоковой передачи. Чтобы объединить создание нашей структуры и кода в одном развертывании, мы собираемся использовать другое средство AWS, которое предварительно установлено в интегрированной среде разработки AWS Cloud9, – интерфейс командной строки AWS SAM (SAM CLI). Код для функций AWS Lambda доставляется в сервис путем отправки кода функций в ZIP-пакете в корзину Amazon S3.

    Интерфейс командной строки SAM (SAM CLI) автоматизирует этот процесс для нас. Используя его, мы можем создать шаблон CloudFormation, который будет ссылаться на локальное расположение в файловой системе, в которой хранится весь код для нашей функции Lambda. Затем интерфейс командной строки SAM (SAM CLI) упакует его в ZIP-файл, отправит в настроенную корзину Amazon S3 и создаст шаблон CloudFormation, который будет указывать расположение в S3, в которое отправлен созданный ZIP-пакет для последующего развертывания в сервисе AWS Lambda. Затем мы можем развернуть шаблон CloudFormation, созданный интерфейсом командной строки SAM (SAM CLI), в AWS и пронаблюдать создание среды с функцией Lambda, для которой используется пакет кода, отправленный интерфейсом командной строки SAM (SAM CLI).

    Прежде всего создадим репозиторий CodeCommit, в котором будет размещен код сервиса потоковой передачи:

    aws codecommit create-repository --repository-name MythicalMysfitsStreamingService-Repository

    В ответе на эту команду скопируйте значение параметра cloneUrlHttp. Оно должно иметь следующий вид: https://git-codecommit.ВСТАВЬТЕ_НАЗВАНИЕ_РЕГИОНА.amazonaws.com/v1/repos/MythicalMysfitsStreamingService-Repository

    Затем клонируем этот новый пустой репозиторий в нашу интегрированную среду разработки:

    cd ~/environment/
    git clone {insert the copied cloneValueUrl from above}
    B. Копирование основы кода сервиса потоковой передачи

    Теперь давайте переместим наш рабочий каталог в этот новый репозиторий:

    cd ~/environment/MythicalMysfitsStreamingService-Repository/

    Затем скопируйте компоненты приложения из модуля 5 в каталог этого нового репозитория:

    cp -r ~/environment/aws-modern-application-workshop/module-5/app/streaming/* .

    Кроме того, скопируем шаблон CloudFormation для этого модуля.

    cp ~/environment/aws-modern-application-workshop/module-5/cfn/* .
  • A. Использование зависимостей pip для установки функции Lambda

    Теперь у нас настроен каталог репозитория со всеми заданными артефактами:

    Шаблон CFN для создания полного стека.

    Скрипт на языке Python, в котором содержится код для нашей функции Lambda: streamProcessor.py

    Это стандартный подход, используемый клиентами AWS: хранить свои шаблоны CloudFormation вместе с кодом приложения в репозитории. Таким образом, у вас будет единое расположение, в котором можно отслеживать все изменения приложения и его среды.

    Но если вы посмотрите на код в файле streamProcessor.py, вы увидите, что в нем используется пакет запросов Python для совершения запроса API к сервису Mythical Mysfits, который вы создали ранее. Внешние библиотеки не включаются автоматически в среду выполнения AWS Lambda, так как различные клиенты AWS могут зависеть от различных версий разных библиотек и т. д.

    Вам потребуется упаковать все свои зависимости от библиотек вместе с вашей функцией кода Lambda до его отправки в сервис Lambda. Чтобы сделать это, мы воспользуемся pip диспетчера пакетов Python. В терминале Cloud9 запустите указанную ниже команду, чтобы установить пакет запросов и его зависимости в локальной среде вместе с кодом вашей функции.

    pip install requests -t .

    По завершении выполнения этой команды в каталоге вашего репозитория появятся несколько дополнительных папок пакетов Python.

    B. Обновление кода функции Lambda

    Далее нам необходимо внести одно изменение в код, прежде чем код нашей функции Lambda будет полностью готов к развертыванию. В файле streamProcessor.py есть строка, которую необходимо заменить адресом ApiEndpoint для API вашего сервиса Mysfits – тем же адресом ApiEndpoint сервиса, который вы создали в модуле 4 и использовали в интерфейсной части веб-сайта.

    replace-api-endpoint

    Этот сервис отвечает за интеграцию с таблицей MysfitsTable в DynamoDB, поэтому даже несмотря на то, что мы могли бы записать функцию Lambda, которая была бы интегрирована непосредственно с таблицей DynamoDB, это привело бы к конфликту с целью первого микросервиса, и у нас было бы несколько отдельных баз кода, интегрированных в одной таблице. Вместо этого мы выполним интеграцию с этой таблицей с помощью существующего сервиса и получим намного более изолированную и модульную архитектуру приложения.

    C. Отправка кода в CodeCommit

    Давайте отправим внесенные нами изменения кода в новый репозиторий, чтобы они сохранились в CodeCommit:

    git add .
    git commit -m "New stream processing service."
    git push
  • A. Создание корзины S3 для пакетов кода функции Lambda

    После того как мы изменили строку в файле Python и отправили наш код, мы готовы с помощью интерфейса командной строки AWS SAM (AWS SAM CLI) упаковать весь код нашей функции, отправить его в сервис S3 и создать шаблон CloudFormation, который можно развернуть, чтобы создать наш стек потоковой передачи.

    Прежде всего с помощью интерфейса командной строки AWS (AWS CLI) создадим корзину S3, в которую будем отправлять пакеты нашего кода функции Lambda. Имена корзин S3 должны быть глобально уникальными для всех клиентов AWS, поэтому замените окончание имени этой корзины уникальной строкой:

    B. Использование интерфейса командной строки SAM (SAM CLI) для упаковки кода для сервиса Lambda

    После создания корзины мы готовы с помощью интерфейса командной строки SAM (SAM CLI) упаковать и отправить наш код, а также преобразовать шаблон CloudFormation. Не забудьте заменить параметр последней команды именем корзины, которую вы только что создали выше (при выполнении этой команды предполагается, что в вашем терминале все еще открыт рабочий каталог репозитория):

    sam package --template-file ./real-time-streaming.yml --output-template-file ./transformed-streaming.yml --s3-bucket replace-with-your-bucket-name

    При успешном выполнении в каталоге ./MythicalMysfitsStreamingService-Repository/ появится новый файл transformed-streaming.yml. Если вы посмотрите его содержимое, вы увидите, что параметр CodeUri бессерверной функции Lambda обновлен и теперь в нем указано расположение объекта, в который интерфейс командной строки SAM (SAM CLI) отправил ваш упакованный код.

    C. Развертывание стека с помощью сервиса AWS CloudFormation

    Команда интерфейса командной строки SAM (SAM CLI) также возвратит команду CloudFormation, которую необходимо выполнить, чтобы создать наш новый полный стек. Но так как наш стек создает ресурсы IAM, вам потребуется добавить в команду один дополнительный параметр. Разверните стек потоковой передачи, выполнив следующую команду:

    aws cloudformation deploy --template-file /home/ec2-user/environment/MythicalMysfitsStreamingService-Repository/cfn/transformed-streaming.yml --stack-name MythicalMysfitsStreamingStack --capabilities CAPABILITY_IAM

    По завершении создания стека будет создан полнофункциональный микросервис, выполняющий обработку в режиме реального времени.

    В будущем, когда вы будете вносить изменения только в код своей функции Lambda, а остальная часть стека CloudFormation будет неизменной, вы сможете повторно выполнять те же команды интерфейса командной строки AWS SAM (SAM CLI) и CloudFormation, которые указаны выше. В результате среда инфраструктуры останется неизменной, а развертывание кода будет выполняться только для вашей функции Lambda.

  • A. Обновление контента веб-сайта

    После создания и настройки стека потоковой передачи нам теперь необходимо опубликовать новую версию интерфейсной части нашего веб-сайта Mythical Mysfits, включающую код JavaScript, который отправляет события в наш сервис, когда пользователь щелкает профиль какого-либо бездомного существа.

    Новый файл index.html находится в следующем расположении: ~/environment/aws-modern-application-workshop/module-5/web/index.html

    В этом файле имеются такие же заполнители, что и в модуле 4 (их необходимо обновить), а также дополнительный заполнитель для нового адреса сервиса обработки потоковой передачи, который вы только что создали. Предыдущие значения переменных можно посмотреть в предыдущем файле index.html, который вы обновили в модуле 4.

    Выполните указанную ниже команду для нового стека потоковой передачи, чтобы получить новый адрес API Gateway для вашего сервиса обработки потоковой передачи.

    aws cloudformation describe-stacks --stack-name MythicalMysfitsStreamingStack
    B. Отправьте новую версию сайта в сервис S3

    Замените окончательное значение в файле index.html для адреса streamingApiEndpoint, и вы будете готовы опубликовать последнее обновление своей домашней страницы сайта Mythical Mysfits.

    aws s3 cp ~/environment/aws-modern-application-workshop/module-5/web/index.html s3://YOUR-S3-BUCKET/

    Еще раз обновите окно веб-сайта Mythical Mysfits в браузере, и у вас будет сайт, который записывает и публикует сведения обо всех щелчках пользователей по профилям бездомных существ.

    Чтобы можно было просмотреть обработанные записи, они будут попадать в корзину назначения S3, созданную в рамках вашего стека MythicalMysfitsStreamingStack.

    Теперь, когда у вас есть завершенная архитектура современного приложения, мы рекомендуем вам изучить Консоль AWS и все сервисы, которые вы создали для запуска сайта Mythical Mysfits.

  • Не забудьте удалить все ресурсы, созданные во время семинара, чтобы плата за них не взималась дольше, чем вы планируете. Мы рекомендуем с помощью Консоли AWS изучить созданные ресурсы и удалить их, когда вы будете готовы.

    Ресурсы, которые вы выделили с помощью сервиса AWS CloudFormation, работая с двумя примерами, можно удалить, просто выполнив следующую команду интерфейса командной строки (CLI) для каждого стека:

    aws cloudformation delete-stack --stack-name STACK-NAME-HERE

    Чтобы удалить все созданные ресурсы, перейдите в указанные ниже Консоли AWS, в которых содержатся ресурсы, которые вы создали, работая с семинаром Mythical Mysfits:

Выводы

Цель этого учебного пособия заключалась в том, чтобы вы «прочувствовали», каково быть разработчиком, который проектирует и создает архитектуры современных приложений на базе AWS. Разработчики в AWS могут программным способом выделять ресурсы с помощью интерфейса командной строки AWS (AWS CLI), повторно использовать определения инфраструктуры с помощью сервиса AWS CloudFormation, автоматически создавать и развертывать изменения кода с использованием пакета инструментов разработчика AWS сервисов Code и применять различные возможности вычислительных сервисов и сервисов приложений, для которых вообще не требуется выделять серверы и управлять ими.

В качестве следующего шага вы можете проанализировать принципы внутренней работы созданного вами веб-сайта Mythical Mysfits, глубже изучить предоставленные вам шаблоны CloudFormation и объявленные в них ресурсы.

Надеемся, что вам понравился наш семинар, посвященный современным приложениям AWS. Данное учебное пособие также размещено на GitHub, поэтому если у вас есть рекомендации, вы можете отправить соответствующий запрос. Если вы хотите сотрудничать по вопросам улучшения кода, вы можете инициализировать запрос на включение внесенных изменений на GitHub.

Если вы хотите узнать больше о разработке в AWS, посетите наш Центр разработчика AWS.

Поздравляем!

Вы создали современное интернет-приложение в AWS.
Поделитесь этим достижением с друзьями или отправьте нам отзыв.

Twilight Glitter впечатлен вашей работой