Развертывание приложения Flask в AWS Elastic Beanstalk

В этом руководстве мы рассмотрим процесс развертывания приложения Flask в AWS Elastic Beanstalk.

Цели

К концу этого урока вы сможете:

  1. Объясните, что такое эластичный бобовый стебель
  2. Инициализировать и настроить Elastic Beanstalk
  3. Устранение неполадок приложения, работающего на Elastic Beanstalk
  4. Интеграция Elastic Beanstalk с RDS
  5. Получите сертификат SSL через AWS Certificate Manager
  6. Используйте SSL-сертификат для обслуживания вашего приложения по протоколу HTTPS.

Что такое эластичный бобовый стебель?

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:

  1. Приложение — это логический набор компонентов Elastic Beanstalk, включая среды, версии и конфигурации среды . Приложение может иметь несколько версий .
  2. Среда — это набор ресурсов AWS, на которых запущена версия приложения .
  3. Платформа представляет собой комбинацию операционной системы , среды выполнения языка программирования, веб-сервера, сервера приложений и компонентов 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

Откройте ваш любимый веб-браузер и перейдите к:

  1. http://localhost:5000 - должен отображать текст "flask-movies"
  2. http://localhost:5000/api/movies — должен отображать список фильмов

Эластичный интерфейс командной строки Beanstalk

Прежде чем продолжить , обязательно зарегистрируйте учетную запись AWS. Создав учетную запись, вы также можете получить право на уровень бесплатного пользования AWS .

Интерфейс командной строки Elastic Beanstalk (EB CLI) позволяет выполнять различные операции по развертыванию приложений и сред Elastic Beanstalk и управлению ими.

Существует два способа установки EB CLI:

  1. Через установщик EB CLI
  2. С пунктом (awsebcli)

Рекомендуется установить 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 для управления исходным кодом. Так сказать "нет".

SSH

Чтобы позже подключиться к инстансам 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 от сред.

Префикс DNS CNAME

Ваше веб-приложение будет доступно по адресу %cname%.%region%.elasticbeanstalk.com. Опять же, используйте значение по умолчанию.

Балансировщик нагрузки

Балансировщик нагрузки распределяет трафик между экземплярами вашей среды. Выберите «приложение».

Если вы хотите узнать о различных типах балансировщиков нагрузки, ознакомьтесь с разделом Балансировщик нагрузки для вашей среды Elastic Beanstalk Environment .

Запросы спотовой группы

Запросы спотовой группы позволяют запускать инстансы по требованию в соответствии с вашими критериями. Мы не будем использовать их в этом уроке, поэтому скажите «нет».

--

При этом среда будет раскручена:

  1. Ваш код будет заархивирован и загружен в новую корзину S3.
  2. После этого будут созданы различные ресурсы AWS, такие как балансировщик нагрузки, группы безопасности и автоматического масштабирования, а также экземпляры EC2.

Также будет развернуто новое приложение.

Это займет около трех минут, так что не стесняйтесь взять чашку кофе.

После завершения развертывания интерфейс командной строки 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 в браузере по умолчанию:

Эластичная консоль Beanstalk

Опять же, вы можете видеть, что состояние среды — «Серьезное», что мы исправим на следующем шаге.

Настройка среды

На предыдущем шаге мы попытались получить доступ к нашему приложению, и оно вернуло 502 Bad Gateway. За этим стоят две причины:

  1. Python нужен PYTHONPATHдля того, чтобы найти модули в нашем приложении.
  2. По умолчанию Elastic Beanstalk пытается запустить приложение WSGI из несуществующего application.py .

По умолчанию 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"

Заметки:

  1. Мы устанавливаем PYTHONPATHпуть Python в нашем экземпляре EC2 ( docs ).
  2. Мы изменили на WSGIPathнаше приложение WSGI ( docs ).

Как работают файлы EB .config ?

  1. Вы можете иметь столько, сколько хотите.
  2. Они загружаются в следующем порядке: 01_x, 02_x, 03_x и т.д.
  3. Вам не нужно запоминать эти настройки; вы можете перечислить все свои настройки среды, запустив 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 . Основное различие между ними заключается в том, когда они запускаются в процессе развертывания:

  1. commandsзапускается до настройки приложения и веб-сервера и извлечения файла версии приложения.
  2. 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-адресу, чтобы увидеть, отображаются ли фильмы по-прежнему.

Ура! Первая версия нашего приложения развернута.

Настроить RDS

Если вы развертываете 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 .

AWS RDS Постгрес

Чтобы настроить Postgres для производства, начните с выполнения следующей команды, чтобы открыть консоль AWS:

$ eb console

Нажмите «Конфигурация» на левой боковой панели, прокрутите вниз до «База данных» и нажмите «Изменить».

Создайте БД со следующими настройками и нажмите «Применить»:

  • Двигатель: постгрес
  • Версия движка: 12.9 (более старая версия Postgres, поскольку db.t2.micro недоступен с 13.1+)
  • Класс экземпляра: db.t2.micro
  • Память: 5 ГБ (должно быть более чем достаточно)
  • Имя пользователя: выберите имя пользователя
  • Пароль: выберите надежный пароль

Если вы хотите остаться на уровне бесплатного пользования AWS , обязательно выберите db.t2.micro. Цены на RDS растут в геометрической прогрессии в зависимости от выбранного вами класса инстанса. Если вы не хотите использовать его, обязательно ознакомьтесь с microценами на AWS PostgreSQL .

Настройки RDS

После завершения обновления среды 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.

HTTPS с диспетчером сертификатов

Для этой части руководства требуется, чтобы у вас было доменное имя.

Нужен дешевый домен для практики? У нескольких регистраторов доменов есть специальные предложения для доменов '.xyz'. Кроме того, вы можете создать бесплатный домен на Freenom . Если у вас нет доменного имени, но вы все равно хотите использовать HTTPS, вы можете создать сертификат X509 и подписать его .

Чтобы обслуживать ваше приложение через HTTPS, нам потребуется:

  1. Запросить и проверить сертификат SSL/TLS
  2. Укажите ваше доменное имя на ваш EB CNAME
  3. Измените балансировщик нагрузки для обслуживания HTTPS.
  4. Измените настройки вашего приложения

Запросить и проверить сертификат SSL/TLS

Перейдите к консоли AWS Certificate Manager . Нажмите «Запросить сертификат». Установите тип сертификата на «Общий» и нажмите «Далее». Введите свое полное доменное имя в форму ввода, установите «Метод проверки» на «Проверка DNS» и нажмите «Запрос».

AWS Запросить публичный сертификат

Затем вы будете перенаправлены на страницу, где сможете увидеть все свои сертификаты. Сертификат, который вы только что создали, должен иметь статус «Ожидает проверки».

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".

Point the Domain Name to the EB CNAME

Затем вам нужно указать свой домен (или поддомен) на CNAME вашей среды EB. Вернувшись в настройки DNS своего домена, добавьте еще одну запись CNAME со значением, равным вашему EB CNAME, например, flask-movies-dev.us-west-2.elasticbeanstalk.com.

Подождите несколько минут, пока ваш DNS обновится, прежде чем проверять что-то на основе http://вашего доменного имени в браузере.

Измените балансировщик нагрузки для обслуживания HTTPS.

Вернувшись в консоль Elastic Beanstalk, нажмите «Конфигурация». Затем в категории «Балансировщик нагрузки» нажмите «Изменить». Нажмите «Добавить прослушиватель» и создайте прослушиватель со следующими данными:

  1. Порт - 443
  2. Протокол - HTTPS
  3. SSL-сертификат — выберите сертификат, который вы только что создали.

Нажмите «Добавить». Затем прокрутите страницу вниз и нажмите «Применить». Обновление среды займет несколько минут.

Измените настройки приложения

Далее нам нужно внести несколько изменений в наше приложение 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 вы можете установить пользовательские переменные среды двумя разными способами.

Переменные среды через EB CLI

Давайте превратим наш 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

Переменные среды через EB Console

Войдите в консоль Elastic Beanstalk через eb open. Перейдите к «Конфигурация» > «Программное обеспечение» > «Редактировать». Затем прокрутите вниз до «Свойства среды».

Переменные среды AWS Elastic Beanstalk

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

Затем вы можете получить доступ к этим переменным в вашей среде Python через файлы os.environ.

Например:

VARIABLE_NAME = os.environ['VARIABLE_NAME']

Отладка Elastic Beanstalk

При работе с Elastic Beanstalk может быть довольно сложно выяснить, что пошло не так, если вы не знаете, как получить доступ к файлам журнала. В этом разделе мы рассмотрим именно это.

Существует два способа доступа к журналам:

  1. Elastic Beanstalk CLI или консоль
  2. SSH в экземпляр EC2

Исходя из личного опыта, я смог решить все проблемы с помощью первого подхода.

Elastic Beanstalk CLI или консоль

Интерфейс командной строки:

$ 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 .

SSH в инстанс EC2

Чтобы подключиться к экземпляру EC2, на котором запущено ваше приложение Flask, запустите:

$ eb ssh

Вам будет предложено добавить хост к вашим известным хостам в первый раз. Скажи да. Теперь у вас будет полный доступ к вашему инстансу EC2. Не стесняйтесь проверить некоторые из файлов журнала, упомянутых в предыдущем разделе.

Помните, что Elastic Beanstalk автоматически масштабирует и развертывает новые инстансы EC2. Изменения, которые вы вносите в этот конкретный инстанс EC2, не будут отражаться на вновь запущенных инстансах EC2. Как только этот конкретный экземпляр EC2 будет заменен, ваши изменения будут стерты.

Вывод

В этом руководстве мы рассмотрели процесс развертывания приложения Flask в AWS Elastic Beanstalk. К настоящему времени вы должны иметь четкое представление о том, как работает Elastic Beanstalk. Выполните быструю самопроверку, просмотрев цели в начале руководства.

Следующие шаги:

  1. Вам следует подумать о создании двух отдельных сред EB ( devи production).
  2. Просмотрите группу Auto Scaling для вашей среды Elastic Beanstalk , чтобы узнать, как настроить триггеры для автоматического масштабирования вашего приложения.

Чтобы удалить все ресурсы AWS, которые мы создали в рамках руководства, сначала закройте среду Elastic Beanstalk:

$ eb terminate

Вам нужно будет вручную удалить сертификат SSL.

Наконец, вы можете найти окончательную версию кода в репозитории flask-elastic-beanstalk на GitHub.

Источник:  https://testdriven.io

#aws #flask 

What is GEEK

Buddha Community

Развертывание приложения Flask в AWS Elastic Beanstalk

How to Use AWS Elastic Beanstalk to Reduce Risk of Deployment Downtime

You can use AWS Elastic Beanstalk to create and deploy an updated or upgrated application version with blue-green deployment using cloned configs.

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

Развертывание приложения Flask в AWS Elastic Beanstalk

В этом руководстве мы рассмотрим процесс развертывания приложения Flask в AWS Elastic Beanstalk.

Цели

К концу этого урока вы сможете:

  1. Объясните, что такое эластичный бобовый стебель
  2. Инициализировать и настроить Elastic Beanstalk
  3. Устранение неполадок приложения, работающего на Elastic Beanstalk
  4. Интеграция Elastic Beanstalk с RDS
  5. Получите сертификат SSL через AWS Certificate Manager
  6. Используйте SSL-сертификат для обслуживания вашего приложения по протоколу HTTPS.

Что такое эластичный бобовый стебель?

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:

  1. Приложение — это логический набор компонентов Elastic Beanstalk, включая среды, версии и конфигурации среды . Приложение может иметь несколько версий .
  2. Среда — это набор ресурсов AWS, на которых запущена версия приложения .
  3. Платформа представляет собой комбинацию операционной системы , среды выполнения языка программирования, веб-сервера, сервера приложений и компонентов 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

Откройте ваш любимый веб-браузер и перейдите к:

  1. http://localhost:5000 - должен отображать текст "flask-movies"
  2. http://localhost:5000/api/movies — должен отображать список фильмов

Эластичный интерфейс командной строки Beanstalk

Прежде чем продолжить , обязательно зарегистрируйте учетную запись AWS. Создав учетную запись, вы также можете получить право на уровень бесплатного пользования AWS .

Интерфейс командной строки Elastic Beanstalk (EB CLI) позволяет выполнять различные операции по развертыванию приложений и сред Elastic Beanstalk и управлению ими.

Существует два способа установки EB CLI:

  1. Через установщик EB CLI
  2. С пунктом (awsebcli)

Рекомендуется установить 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 для управления исходным кодом. Так сказать "нет".

SSH

Чтобы позже подключиться к инстансам 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 от сред.

Префикс DNS CNAME

Ваше веб-приложение будет доступно по адресу %cname%.%region%.elasticbeanstalk.com. Опять же, используйте значение по умолчанию.

Балансировщик нагрузки

Балансировщик нагрузки распределяет трафик между экземплярами вашей среды. Выберите «приложение».

Если вы хотите узнать о различных типах балансировщиков нагрузки, ознакомьтесь с разделом Балансировщик нагрузки для вашей среды Elastic Beanstalk Environment .

Запросы спотовой группы

Запросы спотовой группы позволяют запускать инстансы по требованию в соответствии с вашими критериями. Мы не будем использовать их в этом уроке, поэтому скажите «нет».

--

При этом среда будет раскручена:

  1. Ваш код будет заархивирован и загружен в новую корзину S3.
  2. После этого будут созданы различные ресурсы AWS, такие как балансировщик нагрузки, группы безопасности и автоматического масштабирования, а также экземпляры EC2.

Также будет развернуто новое приложение.

Это займет около трех минут, так что не стесняйтесь взять чашку кофе.

После завершения развертывания интерфейс командной строки 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 в браузере по умолчанию:

Эластичная консоль Beanstalk

Опять же, вы можете видеть, что состояние среды — «Серьезное», что мы исправим на следующем шаге.

Настройка среды

На предыдущем шаге мы попытались получить доступ к нашему приложению, и оно вернуло 502 Bad Gateway. За этим стоят две причины:

  1. Python нужен PYTHONPATHдля того, чтобы найти модули в нашем приложении.
  2. По умолчанию Elastic Beanstalk пытается запустить приложение WSGI из несуществующего application.py .

По умолчанию 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"

Заметки:

  1. Мы устанавливаем PYTHONPATHпуть Python в нашем экземпляре EC2 ( docs ).
  2. Мы изменили на WSGIPathнаше приложение WSGI ( docs ).

Как работают файлы EB .config ?

  1. Вы можете иметь столько, сколько хотите.
  2. Они загружаются в следующем порядке: 01_x, 02_x, 03_x и т.д.
  3. Вам не нужно запоминать эти настройки; вы можете перечислить все свои настройки среды, запустив 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 . Основное различие между ними заключается в том, когда они запускаются в процессе развертывания:

  1. commandsзапускается до настройки приложения и веб-сервера и извлечения файла версии приложения.
  2. 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-адресу, чтобы увидеть, отображаются ли фильмы по-прежнему.

Ура! Первая версия нашего приложения развернута.

Настроить RDS

Если вы развертываете 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 .

AWS RDS Постгрес

Чтобы настроить Postgres для производства, начните с выполнения следующей команды, чтобы открыть консоль AWS:

$ eb console

Нажмите «Конфигурация» на левой боковой панели, прокрутите вниз до «База данных» и нажмите «Изменить».

Создайте БД со следующими настройками и нажмите «Применить»:

  • Двигатель: постгрес
  • Версия движка: 12.9 (более старая версия Postgres, поскольку db.t2.micro недоступен с 13.1+)
  • Класс экземпляра: db.t2.micro
  • Память: 5 ГБ (должно быть более чем достаточно)
  • Имя пользователя: выберите имя пользователя
  • Пароль: выберите надежный пароль

Если вы хотите остаться на уровне бесплатного пользования AWS , обязательно выберите db.t2.micro. Цены на RDS растут в геометрической прогрессии в зависимости от выбранного вами класса инстанса. Если вы не хотите использовать его, обязательно ознакомьтесь с microценами на AWS PostgreSQL .

Настройки RDS

После завершения обновления среды 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.

HTTPS с диспетчером сертификатов

Для этой части руководства требуется, чтобы у вас было доменное имя.

Нужен дешевый домен для практики? У нескольких регистраторов доменов есть специальные предложения для доменов '.xyz'. Кроме того, вы можете создать бесплатный домен на Freenom . Если у вас нет доменного имени, но вы все равно хотите использовать HTTPS, вы можете создать сертификат X509 и подписать его .

Чтобы обслуживать ваше приложение через HTTPS, нам потребуется:

  1. Запросить и проверить сертификат SSL/TLS
  2. Укажите ваше доменное имя на ваш EB CNAME
  3. Измените балансировщик нагрузки для обслуживания HTTPS.
  4. Измените настройки вашего приложения

Запросить и проверить сертификат SSL/TLS

Перейдите к консоли AWS Certificate Manager . Нажмите «Запросить сертификат». Установите тип сертификата на «Общий» и нажмите «Далее». Введите свое полное доменное имя в форму ввода, установите «Метод проверки» на «Проверка DNS» и нажмите «Запрос».

AWS Запросить публичный сертификат

Затем вы будете перенаправлены на страницу, где сможете увидеть все свои сертификаты. Сертификат, который вы только что создали, должен иметь статус «Ожидает проверки».

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".

Point the Domain Name to the EB CNAME

Затем вам нужно указать свой домен (или поддомен) на CNAME вашей среды EB. Вернувшись в настройки DNS своего домена, добавьте еще одну запись CNAME со значением, равным вашему EB CNAME, например, flask-movies-dev.us-west-2.elasticbeanstalk.com.

Подождите несколько минут, пока ваш DNS обновится, прежде чем проверять что-то на основе http://вашего доменного имени в браузере.

Измените балансировщик нагрузки для обслуживания HTTPS.

Вернувшись в консоль Elastic Beanstalk, нажмите «Конфигурация». Затем в категории «Балансировщик нагрузки» нажмите «Изменить». Нажмите «Добавить прослушиватель» и создайте прослушиватель со следующими данными:

  1. Порт - 443
  2. Протокол - HTTPS
  3. SSL-сертификат — выберите сертификат, который вы только что создали.

Нажмите «Добавить». Затем прокрутите страницу вниз и нажмите «Применить». Обновление среды займет несколько минут.

Измените настройки приложения

Далее нам нужно внести несколько изменений в наше приложение 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 вы можете установить пользовательские переменные среды двумя разными способами.

Переменные среды через EB CLI

Давайте превратим наш 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

Переменные среды через EB Console

Войдите в консоль Elastic Beanstalk через eb open. Перейдите к «Конфигурация» > «Программное обеспечение» > «Редактировать». Затем прокрутите вниз до «Свойства среды».

Переменные среды AWS Elastic Beanstalk

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

Затем вы можете получить доступ к этим переменным в вашей среде Python через файлы os.environ.

Например:

VARIABLE_NAME = os.environ['VARIABLE_NAME']

Отладка Elastic Beanstalk

При работе с Elastic Beanstalk может быть довольно сложно выяснить, что пошло не так, если вы не знаете, как получить доступ к файлам журнала. В этом разделе мы рассмотрим именно это.

Существует два способа доступа к журналам:

  1. Elastic Beanstalk CLI или консоль
  2. SSH в экземпляр EC2

Исходя из личного опыта, я смог решить все проблемы с помощью первого подхода.

Elastic Beanstalk CLI или консоль

Интерфейс командной строки:

$ 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 .

SSH в инстанс EC2

Чтобы подключиться к экземпляру EC2, на котором запущено ваше приложение Flask, запустите:

$ eb ssh

Вам будет предложено добавить хост к вашим известным хостам в первый раз. Скажи да. Теперь у вас будет полный доступ к вашему инстансу EC2. Не стесняйтесь проверить некоторые из файлов журнала, упомянутых в предыдущем разделе.

Помните, что Elastic Beanstalk автоматически масштабирует и развертывает новые инстансы EC2. Изменения, которые вы вносите в этот конкретный инстанс EC2, не будут отражаться на вновь запущенных инстансах EC2. Как только этот конкретный экземпляр EC2 будет заменен, ваши изменения будут стерты.

Вывод

В этом руководстве мы рассмотрели процесс развертывания приложения Flask в AWS Elastic Beanstalk. К настоящему времени вы должны иметь четкое представление о том, как работает Elastic Beanstalk. Выполните быструю самопроверку, просмотрев цели в начале руководства.

Следующие шаги:

  1. Вам следует подумать о создании двух отдельных сред EB ( devи production).
  2. Просмотрите группу Auto Scaling для вашей среды Elastic Beanstalk , чтобы узнать, как настроить триггеры для автоматического масштабирования вашего приложения.

Чтобы удалить все ресурсы AWS, которые мы создали в рамках руководства, сначала закройте среду Elastic Beanstalk:

$ eb terminate

Вам нужно будет вручную удалить сертификат SSL.

Наконец, вы можете найти окончательную версию кода в репозитории flask-elastic-beanstalk на GitHub.

Источник:  https://testdriven.io

#aws #flask 

Hana Juali

Hana Juali

1598319758

How to add on-screen logging to your Flask application and deploy it on AWS Elastic Beanstalk

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

Seamus  Quitzon

Seamus Quitzon

1601341562

AWS Cost Allocation Tags and Cost Reduction

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

Hire AWS Developer

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