Як упакувати вашу Dash програму в Docker та розгорнути її за допомогою Elastic Beanstalk на AWS

pic

Якщо ви тут, і почали читати цю статтю, ймовірно, ваша Dash App працює так, як потрібно локально (на вашому комп’ютері), і ви знаходитеся на етапі пошуку способу поділитися нею з друзями та світом.

Один із шляхів зробити вашу програму онлайн — це розгорнути її на хмарному сервері. І до того ж, це дуже просто за допомогою AWS Elastic Beanstalk!

Добра новина полягає в тому, що я проведу вас цим шляхом у цій статті…

Розділ 0-a — Можливо, вам потрібно буде внести деякі зміни в файл Python вашої програми:

AWS Elastic Beanstalk очікує, що всі ваші статичні файли (наприклад, style.css, зображення тощо) будуть у директорії під назвою static. Тому, якщо у вас є папка asset, яку ви використовуєте для зберігання статичних файлів, вам потрібно перейменувати її на static та відповідно налаштувати атрибути assets_folder. Нижче я показав усі необхідні зміни, які потрібно внести.

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

app = Dash(__name__, # об'єкт програми визначено  
 assets_folder="static", ### внесіть ці зміни   
 assets_url_path="static", ### якщо у вас є папка asset   
 include_assets_files=True,) ### у вашій програмі!  

server = app.server #не забудьте додати цей рядок, Gunicorn потребує його для продакшн-сервера  

#  
##  
#### app.layout  
####  
#### app.callbacks  
##  
#  


if __name__ == '__main__':  
 app.run_server(debug=False, host='0.0.0.0', port=8050)

Розділ 0-b — Створення файлу запитів:

Вам також потрібно створити файл запитів, який міститиме всі бібліотеки Python, що використовуються вашою програмою. Ви можете легко зробити це, ввівши наступний код у вашому терміналі (CLI). Не забудьте перейти в папку вашого проєкту перед виконанням коду.

cd  #перейдіть у папку вашого проєкту  
pip freeze -> requirements.txt

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

your_dash_project  
 ├── app.py  
 ├── data  
 │ ├── my_data.csv  
 │ ├── my_data2.json  
 │ ├── pipeline.pkl  
 │ └── model.pkl  
 ├── requirements.txt  
 └── static  
 ├── about.md  
 ├── logo.png  
 └── style.css

Розділ 1 — Контейнеризація (Dockerизація) вашої програми:

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

Давайте створимо dockerfile і помістимо його в директорію вашого проєкту. Ваш dockerfile загалом має виглядати, як показано нижче. До речі, моя програма використовує leaflet для обробки геопросторових даних.
Отже, мені довелося встановити кілька залежностей безпосередньо в мій Docker образ.

FROM python:3.9 #Встановлюємо Python з Docker образу python:version  

COPY ./data/ /data/ #перша директорія відноситься до вашої локальної машини  
COPY ./static/ /static/ #друга директорія відноситься до віртуальної машини  
COPY ./app.py /app.py #копіюємо ваші директорії по черзі  
COPY ./requirements.txt /requirements.txt #можливо, ви можете зробити все це одночасно  

WORKDIR /   

RUN apt-get update #це необхідно, якщо ваша програма використовує leaflet  

RUN apt-get install -y libgdal-dev   
RUN pip install GDAL==3.2.2.1 #я не зміг додати це в файл запитів з якихось причин, тому роблю це тут  

RUN set -ex && \  
 pip install -r requirements.txt #встановлюємо всі Python бібліотеки  

EXPOSE 8050 #кажемо віртуальній машині використовувати порт 8050  

CMD ["gunicorn", "app:server", "-b", "0.0.0.0:8050"] #запускаємо gunicorn для створення продакшн сервера

Після створення вашого dockerfile, розмістіть його на найвищому рівні структури вашої директорії:

your_dash_project  
 ├── Dockerfile  
 ├── app.py  
 ├── data  
 │ ├── amsterdam_df.csv  
 │ ├── buurt.json  
 │ ├── col_pipeline.pkl  
 │ └── random_forest_model.pkl  
 ├── requirements.txt  
 └── static  
 ├── housing_about.md  
 ├── logo.png  
 └── style.css

Щоб побудувати ваш Docker образ, завантажте Docker на ваш комп'ютер, відкрийте термінал і виконайте нижченаведену команду. Цей код використовує ваш dockerfile, який ми щойно створили, як інструкцію для побудови Docker образу.

cd  #для переходу в папку вашого проєкту   
docker build -f Dockerfile -t  . #не забудьте крапку тут

Після того, як образ буде створено, протестуйте його, запустивши локально, використовуючи код нижче. Ця команда фактично вказує на запуск вашого Docker образу, використовуючи порт 8050 вашого комп'ютера та порт 8050 (праворуч) віртуальної машини Docker.

docker run -p 8050:8050 

Ви можете легко перевірити, чи працює ваша програма, перейшовши за адресою http://localhost:8050/ у вашому браузері.

Розділ 2-

Перед тим як почати цей розділ, переконайтеся, що AWS CLI встановлено на вашому комп'ютері, і ви вже налаштували користувача з необхідними ролями IAM.

Якщо ви не знаєте, як це зробити, ви можете скористатися офіційними інструкціями тут.

aws --version # перевірте, чи встановлений AWS CLI на вашому комп'ютері  
aws configure list-profiles #перевірте, чи маєте налаштований профіль для AWS CLI

Після цього вам потрібно встановити Elastic Beanstalk CLI, щоб полегшити і прискорити процес. Для цього виконайте код нижче.

pip install awsebcli

Тепер вам потрібно повернутися в директорію вашого проєкту та виконати наступні команди для ініціалізації, створення, розгортання та відкриття вашого Docker Elastic Beanstalk середовища відповідно:

eb init -p docker #ініціалізуємо Docker EB середовище  

eb create  --region  # приклад регіону eu-south-1  

eb deploy  --region   

eb open  --region 

Вітаємо! Ви щойно розгорнули вашу програму на AWS Cloud за допомогою Elastic Beanstalk. Тепер ви повинні побачити вашу програму, що працює у вікні браузера, яке з’явилося. Ваша програма тепер готова для того, щоб поділитися з усім світом! 🎉

Перекладено з: How to Dockerize your Dash App & deploy it using Elastic Beanstalk on AWS

Leave a Reply

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