Розміщення Streamlit-додатку на AWS за допомогою Elastic Beanstalk.

Цей пост проведе вас через процес розміщення ресурсоємного додатку Streamlit на AWS за допомогою Elastic Beanstalk.

pic

Архітектура додатку

Цей посібник пропонує три методи для досягнення мети розміщення:

  • Конфігурація середовища через AWS Console
  • Конфігурація середовища за допомогою EB CLI
  • Розміщення всього додатку з Boto3

Технічний стек

  • Elastic Beanstalk
  • Docker
  • CodePipeline
  • Streamlit
  • Git

Зміст

  1. Вступ
  2. Необхідні умови
  3. Налаштування ролей та прав доступу
  4. Створення середовища Elastic Beanstalk
  5. Конфігурація CICD пайплайна з GitHub
  6. Усунення неполадок

Вступ

Elastic Beanstalk — це хмарний сервіс, який дозволяє розгортати і керувати веб-додатками, не турбуючись про інфраструктуру.

Elastic Beanstalk надає наступні переваги для додатку Streamlit:

  • Масштабованість: Elastic Beanstalk автоматично масштабує додаток вгору або вниз залежно від трафіку і попиту.
  • Надійність: Elastic Beanstalk моніторить додаток і гарантує його доступність та ефективність.
  • Безпека: Elastic Beanstalk забезпечує безпеку додатку через фаєрволи, шифрування та контроль доступу.
  • Гнучкість: Elastic Beanstalk підтримує додатки на різних платформах та мовах, таких як Python та Docker.

Наступна діаграма ілюструє робочий процес Elastic Beanstalk.

pic

Загальна структура робочого процесу ElasticBeanstalk

Необхідні умови

Цей розділ описує вимоги для розгортання додатку, такі як:

  1. Активний AWS акаунт.
  2. Ролі та права доступу
  3. Створіть власну Virtual Private Network (VPC). Переконайтеся, що під NAT Gateways ви обираєте In 1 AZ.
  4. Створіть source bundle додатку, що відповідає критеріям та вимогам, описаним тут, для розгортання додатку чи його версії через консоль AWS Elastic Beanstalk.
  5. EB CLI (необов'язково): Встановіть EB CLI, що розширює AWS CLI та надає команди для управління середовищами Elastic Beanstalk.

Налаштування ролей та прав доступу

Цей розділ описує необхідні ролі та права доступу, які ваш адміністратор акаунту повинен надати вам як IAM користувачу.

Налаштування адміністратором

Ваш адміністратор акаунту повинен створити або додати наступні політики та прив'язати їх до вашого IAM користувача:

  • AdministratorAccess-AWSElasticBeanstalk
  • AmazonS3FullAccess
  • Створіть політику з мінімальними правами IAM політики за допомогою політик, що містяться тут:

Налаштування IAM користувача

Як IAM користувач з наданими вище правами доступу, ви повинні створити власну керовану Instance Profile роль та назвати її aws-elasticbeanstalk-ec2-role. Прив'яжіть наступні політики:

  • AWSElasticBeanstalkWebTier
  • AWSElasticBeanstalkMulticontainerDocker

Створення середовища Elastic Beanstalk

Цей розділ описує, як ініціалізувати та створити середовище Elastic Beanstalk для додатку. Він також пояснює, як налаштувати параметри середовища, такі як балансувальник навантаження, група безпеки, порт та CORS.

Конфігурація середовища через AWS Console

Для початку конфігурації середовища з консолі вам потрібно мати одне з наступного:

  • Запакуйте файли в архів і збережіть його локально.
  • Завантажте архів або всю папку, що містить файли додатку, у S3 Bucket.

Для налаштування,

1.
1. Увійдіть до вашої AWS консолі і виберіть потрібний регіон у верхньому правому куті меню навігації.
2. Після вибору регіону, все ще в меню навігації, натисніть на іконки "Сервіси" або "Пошук" та введіть Elastic Beanstalk.
3. Натисніть на Elastic Beanstalk зі списку та натисніть Create Application.

Крок 1: Налаштування середовища

Amazon Elastic Beanstalk має два типи середовищ для підтримки різних типів додатків: Web server environment і Worker environment.

  1. Під Environment Tier, виберіть Web Server Environment. Це потрібно, оскільки додаток буде обробляти HTTP запити до того, як почнеться обробка будь-якої роботи.
  2. Під Application information, надайте додатку описову назву. За бажанням можна додати теги додатку, що стосуються середовища EB.
  3. У секції Environment information,
  • Під Environment name, ви можете вибрати власне ім’я або залишити попередньо заповнене ім’я, яке є ім'ям вашого додатку з постфіксом “-env”.
  • Під Domain, ви можете залишити поле порожнім, і AWS автоматично згенерує ім’я для вас або надасть префікс домену. Якщо ви надаєте власне ім’я, переконайтеся, що домен доступний.
  • Під Environment description, за бажанням надайте детальну інформацію про те, чим займається додаток.
  1. У секції Platform,
  • Під Platform type, виберіть Managed platform, оскільки ми хочемо, щоб платформи обслуговувались AWS.
  • У полі Platform зі списку виберіть Docker.
  • Під Platform Branch, зі спадного списку виберіть Docker running on 64bit Amazon Linux 2023.
  • Залиште platform version із значенням за замовчуванням.
  1. У секції Application Code,
  • Виберіть Upload your code.
  • У полі Version label вкажіть унікальну версію для вашого коду.
  • У полі Source code origin виберіть Local file або Public S3 URL, залежно від того, де знаходиться ваш код.
  1. У секції Presets, під конфігураційними пресетами, виберіть Custom configuration, щоб уникнути використання стандартних налаштувань EC2 інстансів.

  2. Натисніть Next, щоб перейти до кроку 2.

Крок 2: Налаштування доступу до сервісу

У секції Service access,

  • Під service role, якщо ви створюєте середовище Elastic Beanstalk вперше, виберіть Create and use new service role. В іншому випадку виберіть Use an existing service role.
  • Під Service role name, AWS автоматично заповнить ім’я ролі сервісу aws-elasticbeanstalk-service-role.
  • Під EC2 Key Pair, можете залишити це поле порожнім або вибрати будь-яку пару ключів, яку ви раніше створювали.
  • Під EC2 instance profile, виберіть керовану політику, яку ви створили в попередніх налаштуваннях.

Крок 3: Налаштування мережі додатку

У цьому кроці ми налаштовуємо VPC для середовища, а також підмережі для Amazon EC2 інстансів і Application load balancer.

  1. У секції Virtual Private Cloud (VPC), під VPC, виберіть власну Custom VPC, яку ви створили раніше.
  2. У секції Instance Settings,
  • Під Public IP Address, поставте галочку Activated, щоб мати доступ до EC2 інстансів під час налагодження.
  • Під Instance subnets, виберіть всі підмережі доступних зон або виберіть тільки публічні чи приватні підмережі.
  1. У секції Database settings, залиште параметри без змін, оскільки додаток не залежить від бази даних.
    4.
    Натисніть Next, щоб перейти до кроку 4.

Крок 4: Налаштування трафіку інстансів і масштабування

Amazon EC2 Auto Scaling допомагає забезпечити наявність необхідної кількості інстансів EC2 для обробки навантаження вашого додатка. Інстанси EC2 організовані в групи Auto Scaling, які є логічними одиницями для масштабування та управління.

  1. У секції Instances,
  • У опціях Root volume (boot device):
  • Зі спадного списку Root Volume type, виберіть General Purpose (SSD).
  • Для Size призначте 40 GB для кореневого тому.
  • Залиште Input/output operations per second (IOPS) порожнім.
  • Залиште Throughput за замовчуванням (125 MiB/s).
  • У опції Amazon CloudWatch monitoring, під інтервалом моніторингу виберіть 5 хвилин.
  • У Instance metadata service (IMDS), залиште IMDSv1 як деактивований.
  • Під EC2 security groups, переконайтесь, що вибрано групу безпеки, яка дозволяє вхідний трафік на PORT 8501.
  1. У секції Capacity, налаштуйте обчислювальну потужність для середовища Elastic Beanstalk наступним чином:
  • У Auto Scaling group
  • Під Environment type, виберіть Load Balanced.
  • У опції instances, встановіть значення Min і Max для кількості інстансів на 1 і 5 відповідно.
  • Під Fleet Composition, виберіть On-Demand instances. Це означає, що всі інстанси працюватимуть на основі попиту.
  • Під Architecture, переконайтесь, що вибрано x86-64, щоб уникнути проблем із залежностями від коду додатку.
  • Під Instance types, додайте інстанси до вашого флоту. Найбільш економічно ефективний інстанс, який не сильно поступається у продуктивності, це m5.large. Якщо ви вибираєте більше одного типу інстансу, AWS розгорне найменший з вибраних вами варіантів.
  • Під AMI ID, AWS вибере Machine Image на основі параметрів, які ви заповнили до цього кроку.
  • Під Availability Zones, Placement, залиште значення за замовчуванням.
  • Під Scaling Cooldown, переконайтесь, що значення встановлено на 360 секунд.
  • У Scaling triggers, переконайтесь, що наступні значення залишаються незмінними:
    • Metric: NetworkOut
    • Statistic: Average
    • Unit: Bytes
    • Period: 5 хвилин
    • Breach duration: 5 хвилин
    • Upper threshold: 6000000
    • Scale up increment: 1 EC2 instance
    • Lower threshold: 2000000
    • Scale down increment: -1 EC2 instance
  1. У секції Load balancer network settings налаштовуємо, як і де буде налаштований балансувальник навантаження в мережі.
  • Під Visibility, переконайтесь, що балансувальник навантаження встановлено на Public, щоб він міг обслуговувати запити з Інтернету.
  • Під Load balancer subnets, виберіть одну підмережу з кожної доступної зони.
  1. У секції Load Balancer Type, переконайтесь, що вибрано Application load balancer. Також балансувальник навантаження має бути Dedicated.

  2. У секції Listeners, ви можете вказати слухачів для вашого балансувальника навантаження. За замовчуванням AWS налаштовує ваш балансувальник навантаження з використанням стандартного веб-сервера на порту 80.

  3. У секції Processes, Rules, and Log file access, залиште значення за замовчуванням, якщо є.

  4. Натисніть Next, щоб перейти до кроку 5.

Крок 5: Налаштування оновлень, моніторингу та логування

Цей крок описує налаштування оновлень, моніторингу та логування для середовищ AWS Elastic Beanstalk. Він пояснює різні опції та функції, до яких користувачі можуть отримати доступ для управління своїми середовищами та додатками.

1.
У секції Monitoring,

  • Під Health Reporting, виберіть Enhanced як систему звітності про стан.
  • У списку CloudWatch Custom Metrics — Instance виберіть наступні метрики:
    • ApplicationRequests2xx
    • ApplicationRequests3xx
    • ApplicationRequests4xx
    • ApplicationRequests5xx
    • CPUIdle
    • InstanceHealth
  • У списку CloudWatch Custom Metrics — Environment виберіть наступні метрики:
    • ApplicationLatencyP99.9
    • InstancesInfo
    • InstancesOk
    • InstancesSevere
    • InstancesUnknown
    • InstancesWarning
  • Залиште значення під Health monitoring rule customization без вибору.
  • Опція Health event streaming to Cloudwatch Logs також має залишатися незмінною.
  1. У секції Managed platform updates, залиште всі значення за замовчуванням, які вибрані AWS.

  2. Під Email notifications, щоб отримувати сповіщення про ваше середовище, введіть адресу електронної пошти та підтвердьте підписку на тему Amazon SNS, яку Elastic Beanstalk створює для вас.

  3. У секції Rolling Updates and deployments,

  • Під Application deployments,
    • У опції Deployment policy, виберіть Immutable. Це рекомендований підхід для Docker-додатків. Він створює нові інстанси з оновленою версією додатку, що забезпечує чистий і надійний процес розгортання з мінімальними перервами.
    • У Batch size type, виберіть Fixed. Це гарантує, що при оновленні розгорнутих інстансів лише один інстанс за раз отримає оновлення.
    • У секції Configuration updates, встановіть Rolling update type на Immutable.
    • У секції Deployment preferences, налаштуйте вимоги до перевірки стану та тайм-аути розгортання наступним чином:
    • У опції Ignore health check виберіть False, щоб зберегти перевірки стану для забезпечення того, щоб інстанси відповідали вашим критеріям перед тим, як вважатися здоровими.
    • Під Health threshold, виберіть Ok, щоб використовувати поріг за замовчуванням, де всі інстанси в пакеті повинні пройти перевірку стану для успішного розгортання.
    • У опції Command timeout, збільште тайм-аут до 1000 секунд.
  1. У секції Platform software налаштуйте програмне забезпечення, яке працює на інстансах середовища наступним чином:
  • Під container options, зі списку proxy server виберіть Nginx.
  • Залиште всі інші прапорці в цьому підрозділі незаповненими, щоб уникнути непотрібних витрат.
  • Під Environment Properties, натисніть на Add environment property і встановіть Name та Value на PORT та 8501 відповідно. Порт 8501 встановлений виключно тому, що Streamlit працює на порту 8501.
  1. Натисніть Next, щоб переглянути налаштування середовища.

  2. Натисніть Submit, щоб ініціалізувати надання та розгортання необхідних ресурсів.

Розгортання займе близько 5 хвилин, і стан вашого інстансу має змінитися на OK, як показано нижче.

Крок 5: Налаштування оновлень, моніторингу та логування

Цей крок описує налаштування оновлень, моніторингу та логування для середовищ AWS Elastic Beanstalk. Він пояснює різні опції та функції, до яких користувачі можуть отримати доступ для управління своїми середовищами та додатками.

1.
Створення середовища:

  • Виконайте наступну команду, щоб спочатку ініціалізувати додаток, на якому працюватиме середовище:
eb init -i

Команда запропонує вам:

  • Ввести стандартний регіон: Введіть номер, що відповідає вашому вибраному регіону (за замовчуванням 3)
  • Вибрати додаток для використання: Введіть номер відповідного додатку або створіть новий
  • Підтвердити використання Docker: Відповідайте ‘y’, оскільки додаток використовує Docker, або ‘n’
  • Вибрати гілку платформи: Введіть номер, що відповідає Docker running on 64bit Amazon Linux 2023 платформі
  • Підтвердити налаштування CodeCommit: Відповідайте n оскільки ми не використовуємо CodeCommit, або 'Y'
  • Налаштувати SSH для інстансів: Відповідайте n оскільки налаштування SSH не потрібне, або 'Y'
  • Підтвердити Access Keys: Введіть ключі доступу за запитом
  • Виконайте наступну команду, щоб створити середовище з типом інстанса m5.large. Переконайтеся, що ви замінили змінну env-name на ваше ім’я середовища.
eb create  --vpc --instance-types m5a.large

EB CLI запропонує вам ввести такі деталі, як VPC ID, асоціація публічної IP-адреси, список підмереж Amazon EC2, список підмереж Amazon ELB, Публічний балансувальник навантаження та список груп безпеки Amazon VPC.

Переконайтеся, що в запиті Load balancer subnets ви вибрали одну підмережу з кожної зони доступності і вона налаштована на Public, щоб вона могла обробляти запити з Інтернету.

Якщо ваш каталог проекту містить вихідний код, EB CLI упакує його та розгорне на вашому середовищі.

Моніторинг статусу середовища:

Після створення середовища ви можете перевірити його статус за допомогою:

eb status
  • Коли статус буде “Ready”, ваш додаток буде доступний за URL-адресою домену, вказаною на панелі управління середовищем, і середовище готове до оновлень.

Перегляд інформації про стан:

  • Для перегляду інформації про стан інстансів у вашому середовищі використовуйте:
eb health
  • Ви також можете використовувати опцію --refresh для інтерактивного перегляду, що оновлюється кожні 10 секунд.

Налаштування CICD пайплайна з GitHub

Перед тим як почати:

  • Переконайтеся, що ваш код зберігається в репозиторії GitHub.
  • Переконайтеся, що у вас є працююче середовище в Elastic Beanstalk.
  • Переконайтеся, що у вас є Адміністративний доступ до репозиторію GitHub.

Щоб налаштувати AWS CodePipeline для розгортання коду з GitHub до AWS Elastic Beanstalk (EB), виконайте наступні кроки:

  1. Відкрийте консоль AWS CodePipeline і натисніть "Create pipeline".
  2. У секції Pipeline Settings,
  • Під Pipeline name, виберіть ім’я пайплайну.
  • Під pipeline type, переконайтеся, що вибрано V2.
  • Під Execution mode, виберіть Superseded.
  • Під Service role, виберіть New service role і введіть нове ім’я або залиште автоматично згенероване ім’я ролі.
  • Натисніть Next, щоб перейти до кроку 3.
  1. У секції Source,
  • Під Source provider, виберіть GitHub (Version 1).
  • Підключіть свій обліковий запис GitHub і виберіть репозиторій та гілку, які ви хочете розгорнути.
  • Під Change detection options, переконайтеся, що вибрано GitHub webhooks.
  • Натисніть Next, щоб перейти до кроку 4.
  1. У секції Build stage, ви можете вибрати skip build stage.

  2. У секції Deploy stage, виберіть Elastic Beanstalk як deployment provider, а потім виберіть додаток і середовище, яке ви створили раніше.

6. Перегляньте та створіть пайплайн

  • Перегляньте налаштування вашого пайплайна.
  • Натисніть “Create pipeline”. Це може зайняти кілька хвилин. Дочекайтеся, поки всі три етапи не покажуть зелену галочку.

Тепер будь-які коміти в зазначеній гілці вашого репозиторію GitHub автоматично ініціюватимуть пайплайн. CodePipeline автоматично розгорне ваш код в Elastic Beanstalk на основі налаштувань, які ви створили.
Моніторинг та усунення неполадок:

  • Моніторте прогрес вашого пайплайна в консолі CodePipeline.
  • Перевірте журнали середовища Elastic Beanstalk на наявність проблем з розгортанням.

Усунення неполадок

Цей розділ надає деякі поширені проблеми та рішення для розгортання Streamlit-додатку на Elastic Beanstalk, такі як помилки з підключенням, помилки тайм-ауту або помилки доступу.

Також наведено поради та кращі практики для відлагодження та оптимізації Streamlit-додатку.

pic

Очистка

Якщо ви не хочете понести додаткові витрати на ресурси, які ви надали, ви можете вибрати їх видалення або припинення.

Для початку:

  • Від’єднайте будь-який Elastic IP, який міг бути створений.
  • Видаліть будь-які NAT Gateways, які могли бути надані.
  • Видаліть Application Load Balancer, який був створений.
  • Припиніть роботу середовища ElasticBeanstalk, яке ви створили, а також його відповідний додаток.
  • Видаліть S3 bucket, створений ElasticBeanstalk. Можливо, вам потрібно буде оновити політику вашого бакету, щоб дозволити DeleteBucket.
  • І нарешті, видаліть VPC. Це видалить всі підмережі, інтернет-шлюзи, таблиці маршрутизації, групи безпеки та всі інші ресурси, що супроводжують VPC.

Дякую за те, що прочитали мій пост, будь ласка, підписуйтесь на мене на LinkedIn та на X (колишній Twitter)

Перекладено з: Hosting a Streamlit application on AWS with ElasticBeanstalk.

Leave a Reply

Your email address will not be published. Required fields are marked *