Сегодняшний день! Вы много работали, и ваш чат-бот готов! Он написан на Python с помощью стартового набора Recast.AI Python и Flask, HTTP-сервера Python. Вы разработали код на портативном компьютере, используя ngrok для удобного предоставления общедоступного URL-адреса для Bot Builder.

Пришло время развернуть чат-бота в производственной среде, чтобы обеспечить постоянную доступность. Вы решили разместить его в облаке на очень популярной сервисной платформе: Amazon Web Services (AWS).

Развертывание на AWS - непростой процесс, особенно если (как и я) вы являетесь разработчиком, а не системным инженером, поскольку это подразумевает знакомство с веб-хостингом, а также с расширенным спектром продуктов и услуг AWS.

Обзор

Во-первых, зачем нам размещать сервер чат-бота и в какой именно его части?

Давайте посмотрим на общую архитектуру чат-бота Recast.AI. Есть два основных серверных компонента: первый - движок беседы чат-бота, который реализует логику намерений и управляет беседами. Это черный ящик на базе Recast.AI. Справа находится бизнес-сервер, который мы разработали и который отвечает на HTTP-запросы через веб-перехватчики.

Например, если нашему чат-боту необходимо проверить инвентарь продуктов, чтобы ответить на запрос пользователя, запрос будет обработан через вызов REST API на наш сервер с использованием URL-адреса конечной точки, указанного в веб-перехватчике.

Это REST-сервер (красный бот справа от веб-перехватчика), который мы разработали, и нам нужно разместить его локально или в облаке.

Если мы выбрали хостинг на Heroku, есть очень хорошая пошаговая статья в блоге Recast.AI. В нашем случае мы выберем Amazon Web Services (AWS), потому что он предлагает очень широкий спектр облачных сервисов при разумном бюджете.

В какой архитектуре AWS будет размещен наш бот?

Очевидно, нам понадобится сервер. В нашем случае использования у нас есть доменное имя, скажем «beautifulbots.com», и мы хотели бы получить доступ к этому серверу через базовый URL-адрес веб-перехватчика, например «https://beautifulbots.com/mybot».

Мы должны использовать канал HTTPS в соответствии с требованиями Recast.AI, а поскольку самозаверяющие сертификаты не принимаются, нам необходимо прикрепить настоящий сертификат к нашей конечной точке. Рекомендации по архитектуре AWS не позволяют прикреплять сертификат непосредственно к веб-сайту или приложению на базе AWS. Мы должны использовать передний сервис, такой как балансировщик нагрузки (эластичная балансировка нагрузки), CDN (Amazon CloudFront) или сервер API (Amazon API Gateway). В нашем случае логичным выбором является балансировщик нагрузки, который также дает возможность адаптировать количество серверов к нагрузке, если возникнет необходимость.

Таким образом, целевая архитектура: балансировщик нагрузки, доступ к которому осуществляется по HTTPS, маршрутизация запросов по HTTP (порт 5000) на экземпляр сервера AWS, на котором размещен веб-сервер Flask, и реализация бизнес-логики, и, возможно, постоянное хранилище.

Сервис конфигурации AWS

Для создания этой конфигурации AWS рекомендует использовать AWS Elastic Beanstalk, простой в использовании сервис для развертывания и масштабирования веб-приложений и сервисов. Elastic Beanstalk автоматически выполняет развертывание, от выделения ресурсов, балансировки нагрузки, автоматического масштабирования до мониторинга работоспособности приложений.

Elastic Beanstalk - это дополнительный уровень для всех основных сервисов AWS, что означает, что мы также можем выбрать ручную настройку необходимых нам сервисов без использования Elastic Beanstalk.

Использование Elastic Beanstalk отлично подходит, когда вам нужна масштабируемость, поскольку она управляется автоматически. Обратите внимание, что это подразумевает использование распределенных сервисов для каждого уровня. Если нашему боту нужно хранить данные (а это, безусловно, нужно, по крайней мере, если у нас есть представление о профиле пользователя), нам нужно будет использовать уровень постоянного распределенного хранилища, такой как S3, DynamoDB или RDS.

В нашем случае наша потребность немного проста: наша нагрузка будет ограничена, поэтому нам не потребуется автоматическая балансировка нагрузки, а работа с одним сервером, поддерживающим постоянное хранилище EBS, позволит нам разместить нашу базу данных sqlite3 непосредственно на нашем сервере. Более надежным вариантом в производственной среде определенно было бы использование постоянного хранилища EBS или S3, но на данный момент мы будем довольны корневой файловой системой нашего экземпляра.

Итак, в заключение мы развернем наши компоненты (сервер EC2, Elastic Load Balancer) вручную.

Давайте начнем !

Шаг 1: создайте экземпляр

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

Теперь перейдите на страницу GetStarted, чтобы увидеть, как создать свой экземпляр и запустить его. Самый простой способ - подключиться к консоли и нажать кнопку Запустить экземпляр.

Хотя вы можете выбирать из предварительно настроенных образов (AMI), мы начнем с пустого окна Linux. В нашем примере нам не потребуется много энергии или памяти, поэтому мы выберем стандартный Linux AMI (HVM) типа t2.micro с 1 ГБ ОЗУ и 1 ЦП, потому что это бесплатно, если вы пользуетесь бесплатным Уровневая программа.

Несколько слов о постоянстве данных: существует два варианта хранения: временное и постоянное. По сути, корневой том (весь ваш виртуальный системный диск) недолговечен, только если вы выберете сервер, поддерживаемый хранилищем инстансов Amazon EC2. Если ваш корневой том поддерживается EBS, все, что у вас есть на корневом томе, будет сохранено между перезагрузками. Поскольку наш бот использует небольшую базу данных для хранения профилей пользователей и контекста, мы позаботимся о том, чтобы у нас был тип корневого устройства ebs.

Выберите Просмотреть и запустить, чтобы мастер завершил остальные параметры конфигурации. Вы заметите, что мастер создал для вас группу безопасности. Группы безопасности действуют как брандмауэр для связанных экземпляров, контролируя как входящий, так и исходящий трафик на уровне экземпляра. В нашем случае мы будем использовать HTTP на порту 5000 (сервер Flask), поэтому в качестве грубой начальной настройки вы можете указать входящий SSH где угодно, HTTP где угодно, HTTP на порт 5000 где угодно и, наконец, HTTPS где угодно.

Шаг 2: подключитесь к экземпляру

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

Приступите к запуску экземпляра и перейдите в консоль, чтобы увидеть, как он работает. В описании запущенного экземпляра вы увидите его общедоступный IP-адрес и DNS-имя. Имейте в виду, что они динамически назначаются экземпляру при каждом его запуске, а это означает, что если вы перезагрузите экземпляр, вы получите новый IP-адрес (и новое имя). Звучит как проблема, но это не так, поскольку доступ к нему будет осуществляться через балансировщик нагрузки.

Нажмите кнопку Подключить в консоли, откроется всплывающее окно с инструкциями по подключению к экземпляру и командной строкой ssh ​​для вставки в окно терминала.

Если вы не можете подключиться к экземпляру с помощью SSH, одна из причин может заключаться в том, что правила вашей группы безопасности не разрешают SSH из вашего домена. Убедитесь, что входящие / исходящие сообщения открыты по SSH для вашего местоположения.

Совет по SSH-соединению: время ожидания очень короткое, поэтому вам придется переподключаться после нескольких минут простоя. Вы можете изменить конфигурацию SSH, чтобы увеличить время ожидания: отредактируйте файл ~ / .ssh / config на локальном компьютере и добавьте следующие строки:

Шаг 3: настройте сервер

Теперь, когда вы можете подключиться к экземпляру, пора его настроить. Это довольно просто.
Наш сервер разработан на Python, и мы развернем его в виртуальной среде.
Давайте установим virtualenv, а затем создадим переработанную виртуальную среду:

Активируйте это:

Давайте создадим каталог проекта

Теперь мы можем установить все необходимые пакеты python.

Так что именно нам нужно? Ну, любой пакет, который мы установили в нашей среде разработки: очевидно, API Recast.AI, а затем любые пакеты, необходимые для реализации бизнес-логики нашего бота.

Это установит библиотеки Python Recast и Flask.

Чтобы установить другие пакеты, в вашей среде разработки создайте файл требований:

Копирование файлов проекта на сервер

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

Из вашей среды разработки сделайте tar полной иерархии и скопируйте его на экземпляр сервера с помощью scp (используя файл .pem keypair, как вы это делали с ssh).

Затем на экземпляре сервера вы можете распаковать файлы в каталоге ~ / mybot /. Теперь у вас такая же файловая структура, что и в вашей среде разработки.

Используя файл requirements.txt, давайте установим зависимости:

Наладка сервера для продакшена

Смена хоста Flask

Чтобы открыть наше приложение Flask в Интернете (чтобы оно могло принимать соединения из удаленных источников, а не только из локальных), мы должны установить для его хоста значение «0.0.0.0».

Отредактируйте recast / server.py и измените вызов app.run ():

Тестирование сервера Flask

Тестирование бота может быть довольно обременительным, потому что задействовано множество компонентов: сетевые маршруты, протоколы, группы безопасности, HTTPS, сервер Flask и многие другие. Поэтому рекомендуется протестировать сервер Flask как независимый компонент. Кроме того, как мы увидим позже, балансировщику нагрузки потребуется маршрут проверки работоспособности, чтобы оценить, включен ли сервер.

Итак, в коде сервера Flask мы добавим следующий маршрут:

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

Все в порядке.
Мы можем перейти к следующему шагу: HTTPS в балансировщике нагрузки.

Шаг 4: настройте HTTPS

Recast.AI нужна конечная точка HTTPS для всех веб-перехватчиков. Для нашего бота это будет https://beautifulbots.com/mybot. Хотя самозаверяющие сертификаты принимаются Flask, они отклоняются сервером беседы Recast.AI, поэтому в вашем контрольном списке вам потребуется доменное имя и действующий сертификат SSL, прикрепленный к этому домену.

Если у вас еще нет доменного имени, легко использовать Amazon Route 53, облачный DNS-сервис. Оттуда вы можете покупать доменные имена и управлять записями DNS, и их легко интегрировать с другими сервисами AWS.

Что касается SSL-сертификата, при необходимости вы также можете создать его из AWS Certificate Manager (это бесплатно и автоматическое продление очень просто).

Шаг 5: настройте балансировщик нагрузки

Как упоминалось ранее, вы не можете напрямую прикрепить сертификат SSL к экземпляру сервера, вместо этого вам нужно пройти через балансировщик нагрузки.

Объявление и настройка балансировщика нагрузки - довольно простой процесс. Мы настроим балансировщик для приема входящего трафика HTTPS и направим его на бот-сервер Flask через HTTP-порт 5000.

В консоли AWS перейдите в раздел «Балансировка нагрузки» и выберите «создать балансировщик нагрузки». Из трех типов доступных балансировщиков нагрузки нам нужен балансировщик нагрузки приложений. Нажмите «Создать» для балансировщика нагрузки приложений. Дайте имя и выберите схему «выход в Интернет». Поскольку балансировщик нагрузки будет маршрутизировать HTTPS на HTTP, выберите прослушиватель HTTPS.

Вам нужно указать 2 зоны доступности, убедитесь, что одна из них включает зону, в которой работает ваш сервер!

Теперь нам нужно настроить параметры безопасности, также известные как HTTPS. Прикрепите сертификат SSL, который вы создали или импортировали в предыдущем разделе (если вы купили его в AWS, это еще проще).

Группа безопасности для вашего балансировщика нагрузки должна позволять ему взаимодействовать с зарегистрированными целями как на порту прослушивателя, так и на порте проверки работоспособности. Ранее мы создали группу безопасности с портами, открытыми для HTTP, HTTPS и SSH, и мы можем ее использовать.

Следующим шагом является объявление маршрутизации. Просто следуйте инструкциям, чтобы сначала объявить целевую группу по HTTP на порту 5000 (входящий порт Flask), а затем в качестве цели добавить экземпляр вашего бота-сервера.

В разделе Проверка работоспособности укажите подготовленный нами маршрут проверки работоспособности - / health_check.

Таким образом, мы объявили балансировщик, который будет получать запросы HTTPS и направлять их к экземпляру бота-сервера на HTTP-порту 5000.

Тестирование балансировщика нагрузки

Пришло время проверить конфигурацию маршрутизации. Сначала в консоли управления EC2 в разделе «Балансировка нагрузки» проверьте, что балансировщик запущен и работает, а в целевых группах убедитесь, что состояние экземпляра сервера бота «исправно». Это означает, что балансировщик нагрузки может связаться с сервером по указанному нами маршруту и ​​протоколу проверки работоспособности, и сервер ответил нормально.

Шаг 6: присоедините субдомен к Load Balancer

Последнее, что нам нужно, это убедиться, что DNS будет направлять любые запросы на mybot / beautifulbots.com на балансировщик нагрузки. Легкий. просто создайте псевдоним (запись A) в DNS, указывающий на mybot / beautifulbots.com. к общедоступному DNS-имени Elastic Load Balancer (вы найдете его в консоли управления EC2).

Настройка завершена. Теперь мы можем провести полный тест из внешнего мира!

Шаг 7: сквозное тестирование

Сначала мы проведем проверку работоспособности, на этот раз с нашего рабочего стола («внешний мир»).

Оно работает !!

Теперь мы можем с уверенностью указать базовый URL «https://beautifulbots.com/mybot» в настройках бота / базовом URL-адресе веб-перехватчика ботов в настройках Recast.AI нашего бот и начните использовать бота в продакшене!

Шаг 8: задачи после установки

Создать образ сервера (AMI)

Когда все работает нормально и конфигурация достаточно стабильна, рекомендуется создать образ вашего сервера, который можно будет создавать всякий раз, когда вам понадобится новый экземпляр, без необходимости проходить весь процесс настройки из стандартной системы Linux.

Это очень простой процесс, в консоли EC2 в меню Действия выберите Изображение - ›Создать изображение и следуйте инструкциям.

Распределенное файловое хранилище

Теперь, когда ваш сервер находится в рабочем состоянии, у вас, безусловно, есть данные, которые хранятся на сервере, и это имеет решающее значение. Данные сервера временны и будут удалены при завершении работы экземпляра. В таком случае рекомендуется либо разместить важные данные на уровне постоянного распределенного хранилища, либо запланировать регулярное резервное копирование в постоянном хранилище.

Кроме того, в целях масштабируемости уровень распределенного хранилища будет обязательным, если вы планируете масштабирование с использованием нескольких экземпляров бот-сервера за балансировщиком нагрузки.

Затраты на эксплуатацию

Amazon AWS имеет очень удобную панель для выставления счетов, на которой отображаются ежемесячные расходы и прогноз затрат.
В нашей конфигурации ежемесячная стоимость составляет 35 долларов США (если у вас бесплатный уровень, то это будет почти бесплатно).
Удобный вариант - настроить оповещения, когда бюджет достигает заранее определенного порога.

Вывод

Хотя весь процесс настройки бота-сервера был немного утомительным, в конечном итоге у вас будет очень надежная и масштабируемая конфигурация, которая позволит вашему боту охватить миллионы пользователей!

Эта статья взята из блога Филиппа де Кузи. Филипп де Кузи - аналитик данных, работающий в области больших данных, Hadoop и Spark, базирующийся в Париже. В настоящее время он работает в RueDuCommerce, ведущей французской торговой площадке электронной коммерции. Следуйте за ним в Twitter!

Посетите Recast.AI, нашу совместную бот-платформу, и присоединяйтесь к нам в Twitter, Facebook и LinkedIn :)