Деплоим приложение Flask на AWS Elastic Beanstalk

Деплоим приложение Flask на AWS Elastic Beanstalk
Сегодня мы рассмотрим пример развёртывания приложения Flask в среде Elastic Beanstalk с Python 2.7. Основным инструментом у нас будет

EB CLI

, но вы так же можете использовать консоль управления AWS для загрузки ZIP архива с проектом.

Для использования любого из сервисов AWS вам необходимо иметь учётную запись, здесь подробнее о ней.
Также убе­ди­тесь, что у вас уста­нов­лен Python 2.7, pip, virtualenv (ес­ли нет, уста­но­ви­те его ко­ман­дой «pip install virtualenv»), awsebcli (pip install awsebcli).

Настройка виртуального окружения

Создадим виртуальное окружение Python с помощью virtualenv и в ней установим Flask с его зависимостями. Используя виртуальное окружение, вы точно будете знать, что только необходимые библиотеки будут установлены затем в EC2 при развёртывании приложения.

1. Создаём окружение eb-virt:

~$ virtualenv ~/eb-virt

2. Активируем:

~$ source ~/eb-virt/bin/activate
(eb-virt) ~$

Вы должны увидеть (eb-virt) в начале командной строки, если активация прошла успешно.

3. Установим Flask:

(eb-virt)~$ pip install flask==0.10.1
4. Проверка установки:

(eb-virt)~$ pip freeze
Flask==0.10.1
itsdangerous==0.24
Jinja2==2.7.3
MarkupSafe==0.23
Werkzeug==0.10.1

Эта команда выведен список всех установленных в виртуальном окружении пакетов, а позже мы с её помощью составим список пакетов для установки в Elastic Beanstalk.

Создаём приложение Flask

Мы создадим несложный RESTful веб-сервис для Elastic Beanstalk.

1. Активируйте окружение:

~$ source ~/eb-virt/bin/activate
2. Создайте папку проекта и перейдите в неё:

(eb-virt) ~$ mkdir eb-flask
(eb-virt) ~$ cd eb-flask

3. Создайте файл application.py в этой папке с содержимым:

from flask import Flask

# print a nice greeting.
def say_hello(username = "World"):
return '

Hello {33d8302486bd10b0fde64d2037652320e6f176a736d71849c0427b0d7398501a}s!

\n' {33d8302486bd10b0fde64d2037652320e6f176a736d71849c0427b0d7398501a} username

# some bits of text for the page.
header_text = '''
\n EB Flask Test \n'''
instructions = '''

Hint: This is a RESTful web service! Append a username
to the URL (for example: /Thelonious) to say hello to someone specific.

\n'''
home_link = '

Back

\n'
footer_text = '\n'

# EB looks for an 'application' callable by default.
application = Flask(__name__)

# add a rule for the index page.
application.add_url_rule('/', 'index', (lambda: header_text +
say_hello() + instructions + footer_text))

# add a rule when the page is accessed with a name appended to the site
# URL.
application.add_url_rule('/', 'hello', (lambda username:
header_text + say_hello(username) + home_link + footer_text))

# run the app.
if __name__ == "__main__":
# Setting debug to True enables debug output. This line should be
# removed before deploying a production app.
application.debug = True
application.run()

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

Добавив application.debug = True перед запуском приложения, мы включили режим отладки и увидим в консоли появляющиеся ошибки. Но не забудьте выключить отладку когда приложение будет готово и полноценно работать.

Если мы используем имя файла application.py и вызываемый объект application, Elastic Beanstalk легко найдёт код нашего приложения.

4. Запускаем application.py с помощью Python:

(eb-virt) ~/eb-flask$ python application.py
Flask запустит веб-сервер и выведет URL для доступа к приложению. Например:

* Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
* Restarting with stat

5. Откройте этот URL в браузере и увидите главную страницу нашего приложения:

Деплоим приложение Flask на AWS Elastic Beanstalk
6. Вывод от приложения можно увидеть в журнале сервера, ошибки так же выводятся в него. Остановить сервер и вернуться в виртуальное окружение можно командой Ctrl-C.

Перед тем, как загрузить приложение в Elastic Beanstalk, убедитесь, что оно работает локально без ошибок.

Настраиваем Flask приложение для Elastic Beanstalk

1. Активируйте окружение:

~$ source ~/eb-virt/bin/activate
2. Запустите pip freeze и сохраните вывод в файл requirements.txt:

(eb-virt) ~/eb-flask$ pip freeze > requirements.txt
Elastic Beanstalk использует requirements.txt для определения списка пакетов к установке в экземпляре EC2 при запуске вашего приложения.

3. Деактивируйте виртуальное окружение командой deactivate:

(eb-virt) ~/eb-flask$ deactivate
Активируйте его в следующий раз, если вам понадобится запустить приложение локально или добавить в него какие-либо дополнительные библиотеки.

Деплоим приложение с помощью EB CLI

Мы сделали всё необходимое для загрузки приложения в Elastic Beanstalk. Иерархия файлов приложения выглядит так:

~/eb-flask/
|-- application.py
`-- requirements.txt

Осталось создать необходимое окружение и загрузить его на сервер.

1. Инициализируем репозиторий EB CLI командой eb init:

~/eb-flask$ eb init -p python2.7 flask-tutorial
Application flask-tutorial has been created.

Эта команда создаст приложение flask-tutorial и настроит необходимое окружение с Python 2.7.

2. (По желанию) Выполните команду eb init ещё раз для генерации ключа, чтобы была возможность подключаться к EC2 по SSH:

~/eb-flask$ eb init
Do you want to set up SSH for your instances?
(y/n): y
Select a keypair.
1) my-keypair
2) [ Create new KeyPair ]

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

3. Создаём окружение и деплоим приложение:

~/eb-flask$ eb create flask-env

Если вы видите ошибку «service role required», запустите команду eb create и EB CLI создаст нужную роль.

Эта команда создаст окружение Elastic Beanstalk с именем flask-env. На создание окружения требуется обычно около 5 минут.

4. После выполнения предыдущей команды откройте ваш сайт:

~/eb-flask$ eb open
Откроется веб-браузер с адресом, присвоенным вашему приложению:

Деплоим приложение Flask на AWS Elastic Beanstalk

Дальнейшие шаги

В целях экономии ресурсов AWS, можно выключать окружение Elastic Beanstalk:

~/eb-flask$ eb terminate flask-env
При выключении ничего не удаляется и вы можете запустить его в любой момент.

А для удаления проекта и виртуального окружения с локального диска воспользуйтесь командами:

~$ rm -rf ~/eb-virt
~$ rm -rf ~/eb-flask

Источник: «Deploying a Flask Application to AWS Elastic Beanstalk»

Leave a Comment