Сегодня мы рассмотрим пример развёртывания приложения Flask в среде Elastic Beanstalk с Python 2.7. Основным инструментом у нас будет
, но вы так же можете использовать консоль управления 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
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 = '
\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('/
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 в браузере и увидите главную страницу нашего приложения:
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
Откроется веб-браузер с адресом, присвоенным вашему приложению:
Дальнейшие шаги
В целях экономии ресурсов 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»
Разработчик: java, kotlin, c#, javascript, dart, 1C, python, php.
Пишите: @ighar. Buy me a coffee, please :).