1660007880
В этом руководстве мы рассмотрим процесс развертывания приложения Flask в AWS Elastic Beanstalk.
К концу этого урока вы сможете:
AWS Elastic Beanstalk (EB) — это простой в использовании сервис для развертывания и масштабирования веб-приложений. Он соединяет несколько сервисов AWS, таких как вычислительные экземпляры ( EC2 ), базы данных ( RDS ), балансировщики нагрузки ( Application Load Balancer ) и системы хранения файлов ( S3 ), и это лишь некоторые из них. EB позволяет быстро разрабатывать и развертывать веб-приложение, не задумываясь о базовой инфраструктуре. Он поддерживает приложения, разработанные на Go, Java, .NET, Node.js, PHP, Python и Ruby. EB также поддерживает Docker, если вам нужно настроить собственный программный стек или развернуть приложение, разработанное на языке (или версии), который EB в настоящее время не поддерживает.
Типичная установка Elastic Beanstalk:
Дополнительная плата за AWS Elastic Beanstalk не взимается. Вы платите только за те ресурсы, которые потребляет ваше приложение.
Чтобы узнать больше об Elastic Beanstalk, ознакомьтесь со статьей Что такое AWS Elastic Beanstalk? из официальной документации AWS Elastic Beanstalk .
Прежде чем углубиться в само руководство, давайте рассмотрим несколько ключевых концепций , связанных с Elastic Beanstalk:
Эти термины будут использоваться на протяжении всего урока.
В этом руководстве мы будем развертывать простое приложение Flask под названием flask-movies .
Проверьте свое понимание, развернув собственное приложение, следуя указаниям руководства.
Сначала возьмите код из репозитория на GitHub :
$ git clone git@github.com:duplxey/flask-movies.git
$ cd flask-movies
Создайте новую виртуальную среду и активируйте ее:
$ python3 -m venv venv && source venv/bin/activate
Установите требования и инициализируйте базу данных:
(venv)$ pip install -r requirements.txt
(venv)$ python init_db.py
Запустите сервер:
(venv)$ flask run
Откройте ваш любимый веб-браузер и перейдите к:
Прежде чем продолжить , обязательно зарегистрируйте учетную запись AWS. Создав учетную запись, вы также можете получить право на уровень бесплатного пользования AWS .
Интерфейс командной строки Elastic Beanstalk (EB CLI) позволяет выполнять различные операции по развертыванию приложений и сред Elastic Beanstalk и управлению ими.
Существует два способа установки EB CLI:
Рекомендуется установить EB CLI глобально (вне какой-либо конкретной виртуальной среды) с помощью установщика (первый вариант), чтобы избежать возможных конфликтов зависимостей. Обратитесь к этому объяснению для более подробной информации.
После того, как вы установили EB CLI, вы можете проверить версию, выполнив:
$ eb --version
EB CLI 3.20.3 (Python 3.10.)
Если команда не работает, вам может потребоваться добавить EB CLI в $PATH
.
Список команд EB CLI и их описания можно найти в справочнике по командам EB CLI .
После запуска EB CLI мы можем начать взаимодействовать с Elastic Beanstalk. Давайте инициализируем новый проект вместе с EB Environment.
В корне проекта ("flask-movies") запустите:
$ eb init
Вам будет предложено несколько вопросов.
Регион AWS вашей среды Elastic Beanstalk (и ресурсов). Если вы не знакомы с различными регионами AWS, ознакомьтесь с разделом « Регионы и зоны доступности AWS » . Как правило, вы должны выбрать регион, ближайший к вашим клиентам. Имейте в виду, что цены на ресурсы варьируются от региона к региону.
Это имя вашего приложения Elastic Beanstalk. Я рекомендую просто нажать Enter и выбрать значение по умолчанию: «flask-movies».
Интерфейс командной строки EB обнаружит, что вы используете среду Python. После этого вам будут предоставлены разные версии Python и версии Amazon Linux, с которыми вы сможете работать. Выберите «Python 3.8, работающий на 64-разрядной версии Amazon Linux 2».
CodeCommit — это безопасная, масштабируемая управляемая служба управления версиями, в которой размещаются частные репозитории Git. Мы не будем его использовать, так как мы уже используем GitHub для управления исходным кодом. Так сказать "нет".
Чтобы позже подключиться к инстансам EC2, нам нужно настроить SSH. Скажите «да», когда будет предложено.
Для подключения к экземплярам EC2 нам понадобится пара ключей RSA. Идите вперед и создайте его, который будет добавлен в вашу папку «~/.ssh».
После того, как вы ответите на все вопросы, вы заметите скрытый каталог в корне вашего проекта с именем «.elasticbeanstalk». Каталог должен содержать файл config.yml со всеми данными, которые вы только что предоставили.
.elasticbeanstalk
└── config.yml
Файл должен содержать что-то похожее на:
branch-defaults:
master:
environment: null
group_suffix: null
global:
application_name: flask-movies
branch: null
default_ec2_keyname: aws-eb
default_platform: Python 3.8 running on 64bit Amazon Linux 2
default_region: us-west-2
include_git_submodules: true
instance_profile: null
platform_name: null
platform_version: null
profile: eb-cli
repository: null
sc: git
workspace_type: Application
Далее создадим среду Elastic Beanstalk и развернем приложение:
$ eb create
Опять же, вам будет предложено с несколькими вопросами.
Представляет собой имя среды EB. Я бы рекомендовал придерживаться значения по умолчанию: «flask-movies-env».
Рекомендуется добавлять
└-env
суффиксы└-dev
к средам, чтобы можно было легко отличить приложения EB от сред.
Ваше веб-приложение будет доступно по адресу %cname%.%region%.elasticbeanstalk.com
. Опять же, используйте значение по умолчанию.
Балансировщик нагрузки распределяет трафик между экземплярами вашей среды. Выберите «приложение».
Если вы хотите узнать о различных типах балансировщиков нагрузки, ознакомьтесь с разделом Балансировщик нагрузки для вашей среды Elastic Beanstalk Environment .
Запросы спотовой группы позволяют запускать инстансы по требованию в соответствии с вашими критериями. Мы не будем использовать их в этом уроке, поэтому скажите «нет».
--
При этом среда будет раскручена:
Также будет развернуто новое приложение.
Это займет около трех минут, так что не стесняйтесь взять чашку кофе.
После завершения развертывания интерфейс командной строки EB изменит .elasticbeanstalk/config.yml .
Теперь структура вашего проекта должна выглядеть так:
|-- .elasticbeanstalk
| └-- config.yml
|-- .gitignore
|-- README.md
|-- app.py
|-- default.db
|-- init_db.py
└-- requirements.txt
После того, как вы развернули свое приложение, вы можете проверить его статус, запустив:
$ eb status
Environment details for: flask-movies-env
Application name: flask-movies
Region: us-west-2
Deployed Version: app-82fb-220311_171256090207
Environment ID: e-nsizyek74z
Platform: arn:aws:elasticbeanstalk:us-west-2::platform/Python 3.8 running on 64bit Amazon Linux 2/3.3.11
Tier: WebServer-Standard-1.0
CNAME: flask-movies-env.us-west-2.elasticbeanstalk.com
Updated: 2022-03-11 23:16:03.822000+00:00
Status: Launching
Health: Red
Вы можете видеть, что текущее состояние нашей среды равно Red
, что означает, что что-то пошло не так. Пока не беспокойтесь об этом, мы исправим это в следующих шагах.
Вы также можете видеть, что AWS присвоил нам CNAME, который является доменным именем нашей среды EB. Мы можем получить доступ к веб-приложению, открыв браузер и перейдя к CNAME.
$ eb open
Эта команда откроет браузер по умолчанию и перейдет к домену CNAME. Вы увидите 502 Bad Gateway
, что мы исправим здесь в ближайшее время
$ eb console
Эта команда откроет консоль Elastic Beanstalk в браузере по умолчанию:
Опять же, вы можете видеть, что состояние среды — «Серьезное», что мы исправим на следующем шаге.
На предыдущем шаге мы попытались получить доступ к нашему приложению, и оно вернуло 502 Bad Gateway
. За этим стоят две причины:
PYTHONPATH
для того, чтобы найти модули в нашем приложении.По умолчанию Elastic Beanstalk обслуживает приложения Python с помощью Gunicorn . EB автоматически устанавливает Gunicorn в процессе развертывания, поэтому нам не нужно добавлять его в requirements.txt . Если вы хотите заменить Gunicorn чем-то другим, взгляните на Настройка сервера WSGI с помощью Procfile .
Давайте исправим эти ошибки.
Создайте новую папку в корне проекта с именем «.ebextensions». Во вновь созданной папке создайте файл с именем 01_flask.config :
# .ebextensions/01_flask.config
option_settings:
aws:elasticbeanstalk:application:environment:
PYTHONPATH: "/var/app/current:$PYTHONPATH"
aws:elasticbeanstalk:container:python:
WSGIPath: "app:app"
Заметки:
PYTHONPATH
путь Python в нашем экземпляре EC2 ( docs ).WSGIPath
наше приложение WSGI ( docs ).Как работают файлы EB .config ?
- Вы можете иметь столько, сколько хотите.
- Они загружаются в следующем порядке: 01_x, 02_x, 03_x и т.д.
- Вам не нужно запоминать эти настройки; вы можете перечислить все свои настройки среды, запустив
eb config
.Если вы хотите узнать больше о расширенной настройке среды, ознакомьтесь со статьей Расширенная настройка среды с файлами конфигурации .
Затем мы должны указать Elastic Beanstalk инициализировать базу данных при развертывании новой версии приложения. Добавьте в конец .ebextensions/01_flask.config следующее :
# .ebextensions/01_flask.config
container_commands:
01_initdb:
command: "source /var/app/venv/*/bin/activate && python3 init_db.py"
leader_only: true
Среда EB теперь будет выполнять указанную выше команду каждый раз, когда мы развертываем новую версию приложения. Мы использовали leader_only
, поэтому их выполняет только первый экземпляр EC2 (на случай, если наша среда EB запускает несколько экземпляров EC2).
Конфигурации Elastic Beanstalk поддерживают два разных раздела команд: commands и container_commands . Основное различие между ними заключается в том, когда они запускаются в процессе развертывания:
commands
запускается до настройки приложения и веб-сервера и извлечения файла версии приложения.container_commands
запускать после настройки приложения и веб-сервера и извлечения архива версии приложения, но до того, как версия приложения будет развернута (до того, как файлы будут перемещены из промежуточной папки в их окончательное местоположение).
На этом этапе структура вашего проекта должна выглядеть следующим образом:
|-- .ebextensions
| └-- 01_flask.config
|-- .elasticbeanstalk
| └-- config.yml
|-- .gitignore
|-- README.md
|-- app.py
|-- default.db
|-- init_db.py
└-- requirements.txt
Зафиксируйте изменения в git и разверните:
$ git add .
$ git commit -m "updates for eb"
$ eb deploy
Вы заметите, что Elastic Beanstalk не обнаружит изменения, если вы не зафиксируете их. Это потому, что EB интегрируется с git и обнаруживает только зафиксированные (измененные) файлы.
После завершения развертывания запустите, eb open
чтобы проверить, все ли работает. После этого добавьте /api/movies
к URL-адресу, чтобы увидеть, отображаются ли фильмы по-прежнему.
Ура! Первая версия нашего приложения развернута.
Если вы развертываете flask-movies , вы заметите, что по умолчанию он использует базу данных SQLite . Хотя это идеально подходит для разработки, вы, как правило, захотите перейти на более надежную базу данных, такую как Postgres или MySQL, для производства. Давайте посмотрим, как поменять SQLite на Postgres .
Во-первых, давайте запустим Postgres локально. Вы можете либо загрузить его из загрузок PostgreSQL , либо развернуть контейнер Docker:
$ docker run --name flask-movies-postgres -p 5432:5432 \
-e POSTGRES_USER=flask-movies -e POSTGRES_PASSWORD=complexpassword123 \
-e POSTGRES_DB=flask-movies -d postgres
Проверяем, запущен ли контейнер:
$ docker ps -f name=flask-movies-postgres
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c05621dac852 postgres "docker-entrypoint.s…" About a minute ago Up About a minute 0.0.0.0:5432->5432/tcp flask-movies-postgres
Теперь давайте попробуем подключиться к нему с помощью нашего приложения Flask.
Измените SQLALCHEMY_DATABASE_URI
внутри app.py так:
app.config['SQLALCHEMY_DATABASE_URI'] = \
'postgresql://{username}:{password}@{host}:{port}/{database}'.format(
username='flask-movies',
password='complexpassword123',
host='localhost',
port='5432',
database='flask-movies',
)
Затем установите psycopg2-binary , необходимый для Postgres:
(venv)$ pip install psycopg2-binary==2.9.3
Добавьте его в файл requirements.txt :
Flask==2.0.3
Flask-SQLAlchemy==2.5.1
psycopg2-binary==2.9.3
Удалите существующую базу данных default.db , а затем инициализируйте новую базу данных:
(venv)$ python init_db.py
Запустите сервер:
(venv)$ flask run
Убедитесь, что фильмы по-прежнему обслуживаются правильно, проверив http://localhost:5000/api/movies .
Чтобы настроить Postgres для производства, начните с выполнения следующей команды, чтобы открыть консоль AWS:
$ eb console
Нажмите «Конфигурация» на левой боковой панели, прокрутите вниз до «База данных» и нажмите «Изменить».
Создайте БД со следующими настройками и нажмите «Применить»:
Если вы хотите остаться на уровне бесплатного пользования AWS , обязательно выберите db.t2.micro. Цены на RDS растут в геометрической прогрессии в зависимости от выбранного вами класса инстанса. Если вы не хотите использовать его, обязательно ознакомьтесь с
micro
ценами на AWS PostgreSQL .
После завершения обновления среды EB автоматически передаст следующие учетные данные БД нашему фляжному приложению:
RDS_DB_NAME
RDS_USERNAME
RDS_PASSWORD
RDS_HOSTNAME
RDS_PORT
Теперь мы можем использовать эти переменные в app.py для подключения к нашей базе данных:
if 'RDS_DB_NAME' in os.environ:
app.config['SQLALCHEMY_DATABASE_URI'] = \
'postgresql://{username}:{password}@{host}:{port}/{database}'.format(
username=os.environ['RDS_USERNAME'],
password=os.environ['RDS_PASSWORD'],
host=os.environ['RDS_HOSTNAME'],
port=os.environ['RDS_PORT'],
database=os.environ['RDS_DB_NAME'],
)
else:
app.config['SQLALCHEMY_DATABASE_URI'] = \
'postgresql://{username}:{password}@{host}:{port}/{database}'.format(
username='flask-movies',
password='complexpassword123',
host='localhost',
port='5432',
database='flask-movies',
)
Не забудьте импортировать os
пакет вверху app.py :
import os
Зафиксируйте изменения в git и разверните:
$ git add .
$ git commit -m "updates for eb"
$ eb deploy
Дождитесь завершения развертывания. После этого запустите, eb open
чтобы открыть приложение в новой вкладке браузера. Убедитесь, что все работает правильно, перечислив фильмы по адресу /api/movies
.
Для этой части руководства требуется, чтобы у вас было доменное имя.
Нужен дешевый домен для практики? У нескольких регистраторов доменов есть специальные предложения для доменов '.xyz'. Кроме того, вы можете создать бесплатный домен на Freenom . Если у вас нет доменного имени, но вы все равно хотите использовать HTTPS, вы можете создать сертификат X509 и подписать его .
Чтобы обслуживать ваше приложение через HTTPS, нам потребуется:
Перейдите к консоли AWS Certificate Manager . Нажмите «Запросить сертификат». Установите тип сертификата на «Общий» и нажмите «Далее». Введите свое полное доменное имя в форму ввода, установите «Метод проверки» на «Проверка DNS» и нажмите «Запрос».
Затем вы будете перенаправлены на страницу, где сможете увидеть все свои сертификаты. Сертификат, который вы только что создали, должен иметь статус «Ожидает проверки».
For AWS to issue a certificate, you first have to prove that you're the owner of the domain. In the table, click on the certificate to view the "Certificate details". Take note of the "CNAME name" and "CNAME value". To validate the ownership of the domain, you'll need to create a CNAME Record" in your domain's DNS settings. Use the "CNAME name" and "CNAME value" for this. Once done, it will take a few minutes for Amazon to pick up the domain changes and issue the certificate. The status should change from "Pending validation" to "Issued".
Затем вам нужно указать свой домен (или поддомен) на CNAME вашей среды EB. Вернувшись в настройки DNS своего домена, добавьте еще одну запись CNAME со значением, равным вашему EB CNAME, например, flask-movies-dev.us-west-2.elasticbeanstalk.com
.
Подождите несколько минут, пока ваш DNS обновится, прежде чем проверять что-то на основе http://
вашего доменного имени в браузере.
Вернувшись в консоль Elastic Beanstalk, нажмите «Конфигурация». Затем в категории «Балансировщик нагрузки» нажмите «Изменить». Нажмите «Добавить прослушиватель» и создайте прослушиватель со следующими данными:
Нажмите «Добавить». Затем прокрутите страницу вниз и нажмите «Применить». Обновление среды займет несколько минут.
Далее нам нужно внести несколько изменений в наше приложение Flask.
Нам нужно перенаправить весь трафик с HTTP на HTTPS. Есть несколько способов сделать это, но самый простой — настроить Apache в качестве прокси-сервера. Мы можем добиться этого программно, добавив в конец option_settings
файла .ebextensions/01_flask.config следующее :
# .ebextensions/01_flask.config
option_settings:
# ...
aws:elasticbeanstalk:environment:proxy: # new
ProxyServer: apache # new
Ваш окончательный файл 01_flask.config теперь должен выглядеть так:
# .ebextensions/01_flask.config
option_settings:
aws:elasticbeanstalk:application:environment:
PYTHONPATH: "/var/app/current:$PYTHONPATH"
aws:elasticbeanstalk:container:python:
WSGIPath: "app:app"
aws:elasticbeanstalk:environment:proxy:
ProxyServer: apache
container_commands:
01_initdb:
command: "source /var/app/venv/*/bin/activate && python3 init_db.py"
leader_only: true
Затем создайте папку «.platform» в корне проекта и добавьте следующие файлы и папки:
└-- .platform
└-- httpd
└-- conf.d
└-- ssl_rewrite.conf
ssl_rewrite.conf :
# .platform/httpd/conf.d/ssl_rewrite.conf
RewriteEngine On
<If "-n '%{HTTP:X-Forwarded-Proto}' && %{HTTP:X-Forwarded-Proto} != 'https'">
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R,L]
</If>
Теперь структура вашего проекта должна выглядеть так:
|-- .ebextensions
| └-- 01_flask.config
|-- .elasticbeanstalk
| └-- config.yml
|-- .gitignore
|-- .platform
| └-- httpd
| └-- conf.d
| └-- ssl_rewrite.conf
|-- README.md
|-- app.py
|-- default.db
|-- init_db.py
└-- requirements.txt
Зафиксируйте изменения в git и разверните:
$ git add .
$ git commit -m "updates for eb"
$ eb deploy
Теперь в вашем браузере https://
должна работать версия вашего приложения. Попробуйте перейти на http://
вкус. Вы должны быть перенаправлены на https://
вкус. Убедитесь, что сертификат загружен правильно:
В производственной среде лучше всего хранить конфигурацию для конкретной среды в переменных среды . С Elastic Beanstalk вы можете установить пользовательские переменные среды двумя разными способами.
Давайте превратим наш Flask SECRET_KEY
в переменную окружения.
Начните с запуска:
$ eb setenv FLASK_SECRET_KEY='<replace me with your own secret key>'
Вы можете установить несколько переменных среды с помощью одной команды, разделив их пробелами. Это рекомендуемый подход, поскольку он приводит только к одному обновлению среды EB.
Измените SECRET_KEY
в app.py соответственно:
# app.py
app.config['SECRET_KEY'] = os.environ.get(
'FLASK_SECRET_KEY',
'<replace me with your own fallback secret key>'
)
Зафиксируйте изменения в git и разверните:
$ git add .
$ git commit -m "updates for eb"
$ eb deploy
Войдите в консоль Elastic Beanstalk через eb open
. Перейдите к «Конфигурация» > «Программное обеспечение» > «Редактировать». Затем прокрутите вниз до «Свойства среды».
После того, как вы закончите, нажмите «Применить», и ваша среда будет обновлена.
Затем вы можете получить доступ к этим переменным в вашей среде Python через файлы os.environ
.
Например:
VARIABLE_NAME = os.environ['VARIABLE_NAME']
При работе с Elastic Beanstalk может быть довольно сложно выяснить, что пошло не так, если вы не знаете, как получить доступ к файлам журнала. В этом разделе мы рассмотрим именно это.
Существует два способа доступа к журналам:
Исходя из личного опыта, я смог решить все проблемы с помощью первого подхода.
Интерфейс командной строки:
$ eb logs
Эта команда извлечет последние 100 строк из следующих файлов:
/var/log/web.stdout.log
/var/log/eb-hooks.log
/var/log/nginx/access.log
/var/log/nginx/error.log
/var/log/eb-engine.log
Запуск
eb logs
эквивалентен входу в консоль EB и переходу в «Журналы».
Я рекомендую передавать логи в CloudWatch . Выполните следующую команду, чтобы включить это:
$ eb logs --cloudwatch-logs enable
Обычно вы найдете ошибки Flask в /var/log/web.stdout.log или /var/log/eb-engine.log .
Чтобы узнать больше о журналах Elastic Beanstalk, ознакомьтесь со статьей Просмотр журналов из инстансов Amazon EC2 .
Чтобы подключиться к экземпляру EC2, на котором запущено ваше приложение Flask, запустите:
$ eb ssh
Вам будет предложено добавить хост к вашим известным хостам в первый раз. Скажи да. Теперь у вас будет полный доступ к вашему инстансу EC2. Не стесняйтесь проверить некоторые из файлов журнала, упомянутых в предыдущем разделе.
Помните, что Elastic Beanstalk автоматически масштабирует и развертывает новые инстансы EC2. Изменения, которые вы вносите в этот конкретный инстанс EC2, не будут отражаться на вновь запущенных инстансах EC2. Как только этот конкретный экземпляр EC2 будет заменен, ваши изменения будут стерты.
В этом руководстве мы рассмотрели процесс развертывания приложения Flask в AWS Elastic Beanstalk. К настоящему времени вы должны иметь четкое представление о том, как работает Elastic Beanstalk. Выполните быструю самопроверку, просмотрев цели в начале руководства.
Следующие шаги:
dev
и production
).Чтобы удалить все ресурсы AWS, которые мы создали в рамках руководства, сначала закройте среду Elastic Beanstalk:
$ eb terminate
Вам нужно будет вручную удалить сертификат SSL.
Наконец, вы можете найти окончательную версию кода в репозитории flask-elastic-beanstalk на GitHub.
Источник: https://testdriven.io
1619205540
In this piece, I’ll be demonstrating how AWS Elastic Beanstalk can simplify deployments by doing all the hard work for you – and with no risk of downtime – by employing a Blue/Green deployment strategy.
Using AWS means combining a large number of tools to complete projects. Personally, I choose to streamline this process by using Elastic Beanstalk, as it enables me and the rest of the dev team to control the AWS resources which power the applications we support and gives us full access to the underlying resources at any time.
#cloud #aws #elastic beanstalk #aws tools #aws elastic beanstalk
1660007880
В этом руководстве мы рассмотрим процесс развертывания приложения Flask в AWS Elastic Beanstalk.
К концу этого урока вы сможете:
AWS Elastic Beanstalk (EB) — это простой в использовании сервис для развертывания и масштабирования веб-приложений. Он соединяет несколько сервисов AWS, таких как вычислительные экземпляры ( EC2 ), базы данных ( RDS ), балансировщики нагрузки ( Application Load Balancer ) и системы хранения файлов ( S3 ), и это лишь некоторые из них. EB позволяет быстро разрабатывать и развертывать веб-приложение, не задумываясь о базовой инфраструктуре. Он поддерживает приложения, разработанные на Go, Java, .NET, Node.js, PHP, Python и Ruby. EB также поддерживает Docker, если вам нужно настроить собственный программный стек или развернуть приложение, разработанное на языке (или версии), который EB в настоящее время не поддерживает.
Типичная установка Elastic Beanstalk:
Дополнительная плата за AWS Elastic Beanstalk не взимается. Вы платите только за те ресурсы, которые потребляет ваше приложение.
Чтобы узнать больше об Elastic Beanstalk, ознакомьтесь со статьей Что такое AWS Elastic Beanstalk? из официальной документации AWS Elastic Beanstalk .
Прежде чем углубиться в само руководство, давайте рассмотрим несколько ключевых концепций , связанных с Elastic Beanstalk:
Эти термины будут использоваться на протяжении всего урока.
В этом руководстве мы будем развертывать простое приложение Flask под названием flask-movies .
Проверьте свое понимание, развернув собственное приложение, следуя указаниям руководства.
Сначала возьмите код из репозитория на GitHub :
$ git clone git@github.com:duplxey/flask-movies.git
$ cd flask-movies
Создайте новую виртуальную среду и активируйте ее:
$ python3 -m venv venv && source venv/bin/activate
Установите требования и инициализируйте базу данных:
(venv)$ pip install -r requirements.txt
(venv)$ python init_db.py
Запустите сервер:
(venv)$ flask run
Откройте ваш любимый веб-браузер и перейдите к:
Прежде чем продолжить , обязательно зарегистрируйте учетную запись AWS. Создав учетную запись, вы также можете получить право на уровень бесплатного пользования AWS .
Интерфейс командной строки Elastic Beanstalk (EB CLI) позволяет выполнять различные операции по развертыванию приложений и сред Elastic Beanstalk и управлению ими.
Существует два способа установки EB CLI:
Рекомендуется установить EB CLI глобально (вне какой-либо конкретной виртуальной среды) с помощью установщика (первый вариант), чтобы избежать возможных конфликтов зависимостей. Обратитесь к этому объяснению для более подробной информации.
После того, как вы установили EB CLI, вы можете проверить версию, выполнив:
$ eb --version
EB CLI 3.20.3 (Python 3.10.)
Если команда не работает, вам может потребоваться добавить EB CLI в $PATH
.
Список команд EB CLI и их описания можно найти в справочнике по командам EB CLI .
После запуска EB CLI мы можем начать взаимодействовать с Elastic Beanstalk. Давайте инициализируем новый проект вместе с EB Environment.
В корне проекта ("flask-movies") запустите:
$ eb init
Вам будет предложено несколько вопросов.
Регион AWS вашей среды Elastic Beanstalk (и ресурсов). Если вы не знакомы с различными регионами AWS, ознакомьтесь с разделом « Регионы и зоны доступности AWS » . Как правило, вы должны выбрать регион, ближайший к вашим клиентам. Имейте в виду, что цены на ресурсы варьируются от региона к региону.
Это имя вашего приложения Elastic Beanstalk. Я рекомендую просто нажать Enter и выбрать значение по умолчанию: «flask-movies».
Интерфейс командной строки EB обнаружит, что вы используете среду Python. После этого вам будут предоставлены разные версии Python и версии Amazon Linux, с которыми вы сможете работать. Выберите «Python 3.8, работающий на 64-разрядной версии Amazon Linux 2».
CodeCommit — это безопасная, масштабируемая управляемая служба управления версиями, в которой размещаются частные репозитории Git. Мы не будем его использовать, так как мы уже используем GitHub для управления исходным кодом. Так сказать "нет".
Чтобы позже подключиться к инстансам EC2, нам нужно настроить SSH. Скажите «да», когда будет предложено.
Для подключения к экземплярам EC2 нам понадобится пара ключей RSA. Идите вперед и создайте его, который будет добавлен в вашу папку «~/.ssh».
После того, как вы ответите на все вопросы, вы заметите скрытый каталог в корне вашего проекта с именем «.elasticbeanstalk». Каталог должен содержать файл config.yml со всеми данными, которые вы только что предоставили.
.elasticbeanstalk
└── config.yml
Файл должен содержать что-то похожее на:
branch-defaults:
master:
environment: null
group_suffix: null
global:
application_name: flask-movies
branch: null
default_ec2_keyname: aws-eb
default_platform: Python 3.8 running on 64bit Amazon Linux 2
default_region: us-west-2
include_git_submodules: true
instance_profile: null
platform_name: null
platform_version: null
profile: eb-cli
repository: null
sc: git
workspace_type: Application
Далее создадим среду Elastic Beanstalk и развернем приложение:
$ eb create
Опять же, вам будет предложено с несколькими вопросами.
Представляет собой имя среды EB. Я бы рекомендовал придерживаться значения по умолчанию: «flask-movies-env».
Рекомендуется добавлять
└-env
суффиксы└-dev
к средам, чтобы можно было легко отличить приложения EB от сред.
Ваше веб-приложение будет доступно по адресу %cname%.%region%.elasticbeanstalk.com
. Опять же, используйте значение по умолчанию.
Балансировщик нагрузки распределяет трафик между экземплярами вашей среды. Выберите «приложение».
Если вы хотите узнать о различных типах балансировщиков нагрузки, ознакомьтесь с разделом Балансировщик нагрузки для вашей среды Elastic Beanstalk Environment .
Запросы спотовой группы позволяют запускать инстансы по требованию в соответствии с вашими критериями. Мы не будем использовать их в этом уроке, поэтому скажите «нет».
--
При этом среда будет раскручена:
Также будет развернуто новое приложение.
Это займет около трех минут, так что не стесняйтесь взять чашку кофе.
После завершения развертывания интерфейс командной строки EB изменит .elasticbeanstalk/config.yml .
Теперь структура вашего проекта должна выглядеть так:
|-- .elasticbeanstalk
| └-- config.yml
|-- .gitignore
|-- README.md
|-- app.py
|-- default.db
|-- init_db.py
└-- requirements.txt
После того, как вы развернули свое приложение, вы можете проверить его статус, запустив:
$ eb status
Environment details for: flask-movies-env
Application name: flask-movies
Region: us-west-2
Deployed Version: app-82fb-220311_171256090207
Environment ID: e-nsizyek74z
Platform: arn:aws:elasticbeanstalk:us-west-2::platform/Python 3.8 running on 64bit Amazon Linux 2/3.3.11
Tier: WebServer-Standard-1.0
CNAME: flask-movies-env.us-west-2.elasticbeanstalk.com
Updated: 2022-03-11 23:16:03.822000+00:00
Status: Launching
Health: Red
Вы можете видеть, что текущее состояние нашей среды равно Red
, что означает, что что-то пошло не так. Пока не беспокойтесь об этом, мы исправим это в следующих шагах.
Вы также можете видеть, что AWS присвоил нам CNAME, который является доменным именем нашей среды EB. Мы можем получить доступ к веб-приложению, открыв браузер и перейдя к CNAME.
$ eb open
Эта команда откроет браузер по умолчанию и перейдет к домену CNAME. Вы увидите 502 Bad Gateway
, что мы исправим здесь в ближайшее время
$ eb console
Эта команда откроет консоль Elastic Beanstalk в браузере по умолчанию:
Опять же, вы можете видеть, что состояние среды — «Серьезное», что мы исправим на следующем шаге.
На предыдущем шаге мы попытались получить доступ к нашему приложению, и оно вернуло 502 Bad Gateway
. За этим стоят две причины:
PYTHONPATH
для того, чтобы найти модули в нашем приложении.По умолчанию Elastic Beanstalk обслуживает приложения Python с помощью Gunicorn . EB автоматически устанавливает Gunicorn в процессе развертывания, поэтому нам не нужно добавлять его в requirements.txt . Если вы хотите заменить Gunicorn чем-то другим, взгляните на Настройка сервера WSGI с помощью Procfile .
Давайте исправим эти ошибки.
Создайте новую папку в корне проекта с именем «.ebextensions». Во вновь созданной папке создайте файл с именем 01_flask.config :
# .ebextensions/01_flask.config
option_settings:
aws:elasticbeanstalk:application:environment:
PYTHONPATH: "/var/app/current:$PYTHONPATH"
aws:elasticbeanstalk:container:python:
WSGIPath: "app:app"
Заметки:
PYTHONPATH
путь Python в нашем экземпляре EC2 ( docs ).WSGIPath
наше приложение WSGI ( docs ).Как работают файлы EB .config ?
- Вы можете иметь столько, сколько хотите.
- Они загружаются в следующем порядке: 01_x, 02_x, 03_x и т.д.
- Вам не нужно запоминать эти настройки; вы можете перечислить все свои настройки среды, запустив
eb config
.Если вы хотите узнать больше о расширенной настройке среды, ознакомьтесь со статьей Расширенная настройка среды с файлами конфигурации .
Затем мы должны указать Elastic Beanstalk инициализировать базу данных при развертывании новой версии приложения. Добавьте в конец .ebextensions/01_flask.config следующее :
# .ebextensions/01_flask.config
container_commands:
01_initdb:
command: "source /var/app/venv/*/bin/activate && python3 init_db.py"
leader_only: true
Среда EB теперь будет выполнять указанную выше команду каждый раз, когда мы развертываем новую версию приложения. Мы использовали leader_only
, поэтому их выполняет только первый экземпляр EC2 (на случай, если наша среда EB запускает несколько экземпляров EC2).
Конфигурации Elastic Beanstalk поддерживают два разных раздела команд: commands и container_commands . Основное различие между ними заключается в том, когда они запускаются в процессе развертывания:
commands
запускается до настройки приложения и веб-сервера и извлечения файла версии приложения.container_commands
запускать после настройки приложения и веб-сервера и извлечения архива версии приложения, но до того, как версия приложения будет развернута (до того, как файлы будут перемещены из промежуточной папки в их окончательное местоположение).
На этом этапе структура вашего проекта должна выглядеть следующим образом:
|-- .ebextensions
| └-- 01_flask.config
|-- .elasticbeanstalk
| └-- config.yml
|-- .gitignore
|-- README.md
|-- app.py
|-- default.db
|-- init_db.py
└-- requirements.txt
Зафиксируйте изменения в git и разверните:
$ git add .
$ git commit -m "updates for eb"
$ eb deploy
Вы заметите, что Elastic Beanstalk не обнаружит изменения, если вы не зафиксируете их. Это потому, что EB интегрируется с git и обнаруживает только зафиксированные (измененные) файлы.
После завершения развертывания запустите, eb open
чтобы проверить, все ли работает. После этого добавьте /api/movies
к URL-адресу, чтобы увидеть, отображаются ли фильмы по-прежнему.
Ура! Первая версия нашего приложения развернута.
Если вы развертываете flask-movies , вы заметите, что по умолчанию он использует базу данных SQLite . Хотя это идеально подходит для разработки, вы, как правило, захотите перейти на более надежную базу данных, такую как Postgres или MySQL, для производства. Давайте посмотрим, как поменять SQLite на Postgres .
Во-первых, давайте запустим Postgres локально. Вы можете либо загрузить его из загрузок PostgreSQL , либо развернуть контейнер Docker:
$ docker run --name flask-movies-postgres -p 5432:5432 \
-e POSTGRES_USER=flask-movies -e POSTGRES_PASSWORD=complexpassword123 \
-e POSTGRES_DB=flask-movies -d postgres
Проверяем, запущен ли контейнер:
$ docker ps -f name=flask-movies-postgres
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c05621dac852 postgres "docker-entrypoint.s…" About a minute ago Up About a minute 0.0.0.0:5432->5432/tcp flask-movies-postgres
Теперь давайте попробуем подключиться к нему с помощью нашего приложения Flask.
Измените SQLALCHEMY_DATABASE_URI
внутри app.py так:
app.config['SQLALCHEMY_DATABASE_URI'] = \
'postgresql://{username}:{password}@{host}:{port}/{database}'.format(
username='flask-movies',
password='complexpassword123',
host='localhost',
port='5432',
database='flask-movies',
)
Затем установите psycopg2-binary , необходимый для Postgres:
(venv)$ pip install psycopg2-binary==2.9.3
Добавьте его в файл requirements.txt :
Flask==2.0.3
Flask-SQLAlchemy==2.5.1
psycopg2-binary==2.9.3
Удалите существующую базу данных default.db , а затем инициализируйте новую базу данных:
(venv)$ python init_db.py
Запустите сервер:
(venv)$ flask run
Убедитесь, что фильмы по-прежнему обслуживаются правильно, проверив http://localhost:5000/api/movies .
Чтобы настроить Postgres для производства, начните с выполнения следующей команды, чтобы открыть консоль AWS:
$ eb console
Нажмите «Конфигурация» на левой боковой панели, прокрутите вниз до «База данных» и нажмите «Изменить».
Создайте БД со следующими настройками и нажмите «Применить»:
Если вы хотите остаться на уровне бесплатного пользования AWS , обязательно выберите db.t2.micro. Цены на RDS растут в геометрической прогрессии в зависимости от выбранного вами класса инстанса. Если вы не хотите использовать его, обязательно ознакомьтесь с
micro
ценами на AWS PostgreSQL .
После завершения обновления среды EB автоматически передаст следующие учетные данные БД нашему фляжному приложению:
RDS_DB_NAME
RDS_USERNAME
RDS_PASSWORD
RDS_HOSTNAME
RDS_PORT
Теперь мы можем использовать эти переменные в app.py для подключения к нашей базе данных:
if 'RDS_DB_NAME' in os.environ:
app.config['SQLALCHEMY_DATABASE_URI'] = \
'postgresql://{username}:{password}@{host}:{port}/{database}'.format(
username=os.environ['RDS_USERNAME'],
password=os.environ['RDS_PASSWORD'],
host=os.environ['RDS_HOSTNAME'],
port=os.environ['RDS_PORT'],
database=os.environ['RDS_DB_NAME'],
)
else:
app.config['SQLALCHEMY_DATABASE_URI'] = \
'postgresql://{username}:{password}@{host}:{port}/{database}'.format(
username='flask-movies',
password='complexpassword123',
host='localhost',
port='5432',
database='flask-movies',
)
Не забудьте импортировать os
пакет вверху app.py :
import os
Зафиксируйте изменения в git и разверните:
$ git add .
$ git commit -m "updates for eb"
$ eb deploy
Дождитесь завершения развертывания. После этого запустите, eb open
чтобы открыть приложение в новой вкладке браузера. Убедитесь, что все работает правильно, перечислив фильмы по адресу /api/movies
.
Для этой части руководства требуется, чтобы у вас было доменное имя.
Нужен дешевый домен для практики? У нескольких регистраторов доменов есть специальные предложения для доменов '.xyz'. Кроме того, вы можете создать бесплатный домен на Freenom . Если у вас нет доменного имени, но вы все равно хотите использовать HTTPS, вы можете создать сертификат X509 и подписать его .
Чтобы обслуживать ваше приложение через HTTPS, нам потребуется:
Перейдите к консоли AWS Certificate Manager . Нажмите «Запросить сертификат». Установите тип сертификата на «Общий» и нажмите «Далее». Введите свое полное доменное имя в форму ввода, установите «Метод проверки» на «Проверка DNS» и нажмите «Запрос».
Затем вы будете перенаправлены на страницу, где сможете увидеть все свои сертификаты. Сертификат, который вы только что создали, должен иметь статус «Ожидает проверки».
For AWS to issue a certificate, you first have to prove that you're the owner of the domain. In the table, click on the certificate to view the "Certificate details". Take note of the "CNAME name" and "CNAME value". To validate the ownership of the domain, you'll need to create a CNAME Record" in your domain's DNS settings. Use the "CNAME name" and "CNAME value" for this. Once done, it will take a few minutes for Amazon to pick up the domain changes and issue the certificate. The status should change from "Pending validation" to "Issued".
Затем вам нужно указать свой домен (или поддомен) на CNAME вашей среды EB. Вернувшись в настройки DNS своего домена, добавьте еще одну запись CNAME со значением, равным вашему EB CNAME, например, flask-movies-dev.us-west-2.elasticbeanstalk.com
.
Подождите несколько минут, пока ваш DNS обновится, прежде чем проверять что-то на основе http://
вашего доменного имени в браузере.
Вернувшись в консоль Elastic Beanstalk, нажмите «Конфигурация». Затем в категории «Балансировщик нагрузки» нажмите «Изменить». Нажмите «Добавить прослушиватель» и создайте прослушиватель со следующими данными:
Нажмите «Добавить». Затем прокрутите страницу вниз и нажмите «Применить». Обновление среды займет несколько минут.
Далее нам нужно внести несколько изменений в наше приложение Flask.
Нам нужно перенаправить весь трафик с HTTP на HTTPS. Есть несколько способов сделать это, но самый простой — настроить Apache в качестве прокси-сервера. Мы можем добиться этого программно, добавив в конец option_settings
файла .ebextensions/01_flask.config следующее :
# .ebextensions/01_flask.config
option_settings:
# ...
aws:elasticbeanstalk:environment:proxy: # new
ProxyServer: apache # new
Ваш окончательный файл 01_flask.config теперь должен выглядеть так:
# .ebextensions/01_flask.config
option_settings:
aws:elasticbeanstalk:application:environment:
PYTHONPATH: "/var/app/current:$PYTHONPATH"
aws:elasticbeanstalk:container:python:
WSGIPath: "app:app"
aws:elasticbeanstalk:environment:proxy:
ProxyServer: apache
container_commands:
01_initdb:
command: "source /var/app/venv/*/bin/activate && python3 init_db.py"
leader_only: true
Затем создайте папку «.platform» в корне проекта и добавьте следующие файлы и папки:
└-- .platform
└-- httpd
└-- conf.d
└-- ssl_rewrite.conf
ssl_rewrite.conf :
# .platform/httpd/conf.d/ssl_rewrite.conf
RewriteEngine On
<If "-n '%{HTTP:X-Forwarded-Proto}' && %{HTTP:X-Forwarded-Proto} != 'https'">
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R,L]
</If>
Теперь структура вашего проекта должна выглядеть так:
|-- .ebextensions
| └-- 01_flask.config
|-- .elasticbeanstalk
| └-- config.yml
|-- .gitignore
|-- .platform
| └-- httpd
| └-- conf.d
| └-- ssl_rewrite.conf
|-- README.md
|-- app.py
|-- default.db
|-- init_db.py
└-- requirements.txt
Зафиксируйте изменения в git и разверните:
$ git add .
$ git commit -m "updates for eb"
$ eb deploy
Теперь в вашем браузере https://
должна работать версия вашего приложения. Попробуйте перейти на http://
вкус. Вы должны быть перенаправлены на https://
вкус. Убедитесь, что сертификат загружен правильно:
В производственной среде лучше всего хранить конфигурацию для конкретной среды в переменных среды . С Elastic Beanstalk вы можете установить пользовательские переменные среды двумя разными способами.
Давайте превратим наш Flask SECRET_KEY
в переменную окружения.
Начните с запуска:
$ eb setenv FLASK_SECRET_KEY='<replace me with your own secret key>'
Вы можете установить несколько переменных среды с помощью одной команды, разделив их пробелами. Это рекомендуемый подход, поскольку он приводит только к одному обновлению среды EB.
Измените SECRET_KEY
в app.py соответственно:
# app.py
app.config['SECRET_KEY'] = os.environ.get(
'FLASK_SECRET_KEY',
'<replace me with your own fallback secret key>'
)
Зафиксируйте изменения в git и разверните:
$ git add .
$ git commit -m "updates for eb"
$ eb deploy
Войдите в консоль Elastic Beanstalk через eb open
. Перейдите к «Конфигурация» > «Программное обеспечение» > «Редактировать». Затем прокрутите вниз до «Свойства среды».
После того, как вы закончите, нажмите «Применить», и ваша среда будет обновлена.
Затем вы можете получить доступ к этим переменным в вашей среде Python через файлы os.environ
.
Например:
VARIABLE_NAME = os.environ['VARIABLE_NAME']
При работе с Elastic Beanstalk может быть довольно сложно выяснить, что пошло не так, если вы не знаете, как получить доступ к файлам журнала. В этом разделе мы рассмотрим именно это.
Существует два способа доступа к журналам:
Исходя из личного опыта, я смог решить все проблемы с помощью первого подхода.
Интерфейс командной строки:
$ eb logs
Эта команда извлечет последние 100 строк из следующих файлов:
/var/log/web.stdout.log
/var/log/eb-hooks.log
/var/log/nginx/access.log
/var/log/nginx/error.log
/var/log/eb-engine.log
Запуск
eb logs
эквивалентен входу в консоль EB и переходу в «Журналы».
Я рекомендую передавать логи в CloudWatch . Выполните следующую команду, чтобы включить это:
$ eb logs --cloudwatch-logs enable
Обычно вы найдете ошибки Flask в /var/log/web.stdout.log или /var/log/eb-engine.log .
Чтобы узнать больше о журналах Elastic Beanstalk, ознакомьтесь со статьей Просмотр журналов из инстансов Amazon EC2 .
Чтобы подключиться к экземпляру EC2, на котором запущено ваше приложение Flask, запустите:
$ eb ssh
Вам будет предложено добавить хост к вашим известным хостам в первый раз. Скажи да. Теперь у вас будет полный доступ к вашему инстансу EC2. Не стесняйтесь проверить некоторые из файлов журнала, упомянутых в предыдущем разделе.
Помните, что Elastic Beanstalk автоматически масштабирует и развертывает новые инстансы EC2. Изменения, которые вы вносите в этот конкретный инстанс EC2, не будут отражаться на вновь запущенных инстансах EC2. Как только этот конкретный экземпляр EC2 будет заменен, ваши изменения будут стерты.
В этом руководстве мы рассмотрели процесс развертывания приложения Flask в AWS Elastic Beanstalk. К настоящему времени вы должны иметь четкое представление о том, как работает Elastic Beanstalk. Выполните быструю самопроверку, просмотрев цели в начале руководства.
Следующие шаги:
dev
и production
).Чтобы удалить все ресурсы AWS, которые мы создали в рамках руководства, сначала закройте среду Elastic Beanstalk:
$ eb terminate
Вам нужно будет вручную удалить сертификат SSL.
Наконец, вы можете найти окончательную версию кода в репозитории flask-elastic-beanstalk на GitHub.
Источник: https://testdriven.io
1598319758
At the end of 2019 Deeplearning.ai reported that only 22% of companies that use machine learning actually deployed a model. Most companies do not get beyond a proof of concept, often by means of a model in a Jupyter Notebooks. As a result, numerous companies are hiring machine learning engineers who can build machine learning models and put them in production as well.
Data scientists should be at least familiar with some methods of productionizing models. The most important tool in a data scientists toolbox for this purpose is Docker. Docker is a container service that enables you to deploy a model or application beyond your local machine. For example, running it on Amazon Web Services (AWS) or on Google Cloud Platform (GCP). Several frameworks exist to build applications and serve your models within these Docker containers. As many data scientist already know Python, Flask is easy to start with. In addition, Flask provides you with the opportunity to build a (simple) user-interface so your users will be able to interact with your models without having to learn how to use the command line interface or make an API request.
In this hands-on tutorial I will show you how to deploy a simple Flask application in a Docker container on AWS Elastic Beanstalk and how to add a logging functionality, so your users will be able to see what’s happening behind the scenes. The application will not contain any machine learning models, but you can easily extend it on your own. When I first deployed this solution, I had some trouble with getting it to work, as I had to configure the (reverse) proxy server on AWS. In the last part of this tutorial I will show you how to do this.
#aws-elastic-beanstalk #docker #logging #flask #nginx
1601341562
Bob had just arrived in the office for his first day of work as the newly hired chief technical officer when he was called into a conference room by the president, Martha, who immediately introduced him to the head of accounting, Amanda. They exchanged pleasantries, and then Martha got right down to business:
“Bob, we have several teams here developing software applications on Amazon and our bill is very high. We think it’s unnecessarily high, and we’d like you to look into it and bring it under control.”
Martha placed a screenshot of the Amazon Web Services (AWS) billing report on the table and pointed to it.
“This is a problem for us: We don’t know what we’re spending this money on, and we need to see more detail.”
Amanda chimed in, “Bob, look, we have financial dimensions that we use for reporting purposes, and I can provide you with some guidance regarding some information we’d really like to see such that the reports that are ultimately produced mirror these dimensions — if you can do this, it would really help us internally.”
“Bob, we can’t stress how important this is right now. These projects are becoming very expensive for our business,” Martha reiterated.
“How many projects do we have?” Bob inquired.
“We have four projects in total: two in the aviation division and two in the energy division. If it matters, the aviation division has 75 developers and the energy division has 25 developers,” the CEO responded.
Bob understood the problem and responded, “I’ll see what I can do and have some ideas. I might not be able to give you retrospective insight, but going forward, we should be able to get a better idea of what’s going on and start to bring the cost down.”
The meeting ended with Bob heading to find his desk. Cost allocation tags should help us, he thought to himself as he looked for someone who might know where his office is.
#aws #aws cloud #node js #cost optimization #aws cli #well architected framework #aws cost report #cost control #aws cost #aws tags
1598254922
Looking to Hire Professional AWS Developers?
The technology inventions have demanded all businesses to use and manage cloud-based computing services and Amazon is dominating the cloud computing services provider in the world.
Hire AWS Developer from HourlyDeveloper.io & Get the best amazon web services development. Take your business to excellence with our best AWS developer that will serve you the benefit of different cloud computing tools.
Consult with experts: https://bit.ly/2CWJgHyAWS Development services
#hire aws developer #aws developers #aws development company #aws development services #aws development #aws