Рубрики
Без рубрики

Развертывание приложений Django в AWS EC2 с помощью Docker

AWS EC2 предлагает подготовку и размещение приложений в облаке с автоматическим масштабированием. Мы будем развертывать приложение Django в EC2 с помощью Docker.

Автор оригинала: Robley Gori.

Вступление

В быстро развивающейся области веб-приложений контейнеризация стала не только распространенным, но и предпочтительным способом упаковки и доставки веб-приложений. Контейнеры позволяют нам упаковывать наши приложения и развертывать их в любом месте без необходимости перенастраивать или адаптировать наши приложения к платформе развертывания.

На переднем крае контейнеризации находится Docker , который является инструментом, используемым для упаковки и запуска приложений в контейнерах, которые не зависят от платформы. Бессерверная технология также процветает в эту эпоху контейнеризации и оказывается наиболее подходящим вариантом для разработчиков при развертывании своих приложений с помощью все большего числа поставщиков, позволяющих пользователям развертывать контейнерное программное обеспечение.

Хотя создание приложения важно, предоставление его конечным пользователям также является важной частью продукта. В этом посте мы упакуем приложение Django с помощью Docker и развернем его в Amazon EC2 .

Что такое EC2?

Amazon Elastic Compute Cloud (EC2) – это предложение, которое позволяет разработчикам создавать и запускать свои приложения, создавая экземпляры виртуальных машин в облаке. EC2 также предлагает автоматическое масштабирование, при котором ресурсы распределяются в зависимости от объема полученного трафика.

Как и любые другие предложения AWS, EC2 может быть легко интегрирован с другими сервисами Amazon, такими как Simple Queue Service (SQS) или Simple Storage Service (S3).

EC2 имеет следующие особенности:

  • Экземпляры : Виртуальные вычислительные среды или серверы, которые позволяют разработчикам запускать свои приложения. Эти экземпляры могут быть сконфигурированы с точки зрения памяти, хранилища, вычислительной мощности и сетевых ресурсов в соответствии с текущими потребностями или сценарием.
  • Amazon Machine Images (AMIs): Предварительно настроенные шаблоны, используемые для создания экземпляров. Они поставляются с операционными системами и предустановленным программным обеспечением по мере необходимости и настраиваются.
  • Тома хранилища экземпляров : Используются для временного хранения данных. Эти данные удаляются при завершении работы экземпляра.
  • Тома Elastic Block Store (EBS): Высокодоступные и надежные тома хранения, которые присоединяются к экземплярам с целью постоянного хранения данных. Данные, хранящиеся в томах EBS, переживают экземпляры, и несколько томов могут быть смонтированы на одном экземпляре.
  • Группы безопасности : Виртуальные брандмауэры, которые управляют доступом к экземплярам путем указания протоколов, диапазонов IP-адресов и портов. Это позволяет нам контролировать и ограничивать трафик для наших экземпляров.

Это лишь некоторые из функций эластичного вычислительного облака Amazon, и многое другое можно найти в документации .

Предпосылки

В этом уроке мы создадим веб-приложение и развернем его в сервисе Amazon EC2. Для этого нам нужно:

  • Учетная запись Amazon Web Services (AWS), которая даст нам доступ к EC2. Через эту ссылку вы можете подписаться на бесплатный уровень , достаточный для работы в этом посте.
  • Python 3.6+, Pip и Virtualenv установлены для создания нашего приложения Django.
  • Docker также будет необходим для упаковки нашего приложения и легкого запуска его в контейнере, который не только переносим, но и может работать в любом месте, где установлен Docker.

Докеризация приложения Django

Мы собираемся начать с создания нашего простого приложения Django и контейнеризации его, чтобы мы могли легко развернуть его. Давайте начнем с создания папки для нашего проекта:

$ mkdir django_ec2 && cd $_

Затем виртуальная среда:

$ virtualev --python=python3 env --no-site-packages

Затем давайте активируем его и установим Django:

$ source env/bin/activate
$ pip install Django

Достаточно простого приложения-заполнителя Django. Все, что нам нужно сделать для начальной загрузки проекта,-это запустить команду django-admin ‘s startproject , которая запускает базовый проект для данного имени каталога:

$ django-admin startproject django_ec2_project

Затем давайте войдем в каталог проекта:

$ cd django_ec2_project

И запустите легкий сервер разработки:

$ python manage.py runserver

Если все пойдет хорошо, мы сможем просмотреть следующую целевую страницу при доступе к нашему приложению по адресу localhost:8000 :

django_setup

Перед упаковкой нашего приложения Django нам нужно разрешить трафик ко всем источникам, чего мы можем достичь, изменив параметр ALLOWED_HOSTS в django_ec2_project/django_ec2_project/settings.py :

# Add the asterisk in the empty list
ALLOWED_HOSTS = ['*']

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

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

FROM python:3.6-alpine

MAINTAINER Robley Gori 

EXPOSE 8000

RUN apk add --no-cache gcc python3-dev musl-dev

ADD . /django_ec2

WORKDIR /django_ec2

RUN pip install -r requirements.txt

RUN python django_ec2_project/manage.py makemigrations

RUN python django_ec2_project/manage.py migrate

CMD [ "python", "django_ec2_project/manage.py", "runserver", "0.0.0.0:8000" ]

Этот файл Dockerfile описывает, как наше приложение будет контейнеризировано и запущено. В верхней части мы используем базовый образ, который поставляется с установленным Python 3.6. Мы также разоблачаем порт 8000 , что означает, что трафик в контейнер должен быть направлен на этот порт, который также является местом, откуда будет работать наше приложение Django. Мы устанавливаем несколько пакетов в наш образ, а затем добавляем наше приложение Django в каталог django_ec2 .

Поскольку наш проект Django контейнеризирован, нам не нужно будет создавать виртуальную среду, поскольку она уже изолирована от машины, которая будет ее запускать. Поэтому мы устанавливаем требования непосредственно и запускаем миграции.

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

Если вы хотите получить более подробное объяснение по этой теме, ознакомьтесь с нашей статьей Dockerizing Python Applications .

Следующим шагом будет создание нашего образа Docker с помощью приведенного выше файла Dockerfile. Перед этим мы сохраним установленные в среде зависимости в файл:

$ pip freeze > requirements.txt

И только после этого давайте построим образ docker:

$ docker build . -t django_ec2

С помощью этой команды Docker будет искать наш Dockerfile в текущей папке и использовать его для создания образа, который будет помечен как django_ec2 . Как только наш образ построен, мы можем запустить его с помощью команды:

$ docker run -d -p 8000:8000 django_ec2

Эта команда запустит наш контейнер с запущенным приложением Django и сопоставит порт 8000 на нашей машине до порта контейнера 8000 , как указано флагом -p и будет работать без головы (даже после того, как мы закроем терминал), как указано флагом -d .

Нас должна приветствовать та же целевая страница Django, когда мы снова перейдем к localhost:8000 , только на этот раз мы будем получать доступ к приложению в контейнере Docker, а не к нашему локальному компьютеру.

Когда ваш образ готов, нам нужно опубликовать его в Dockerhub , чтобы облегчить процесс развертывания на EC2.

Docker hub-это реестр готовых образов, который позволяет пользователям создавать и совместно использовать настроенные образы Docker для всех целей. Он также позволяет нам публиковать наши изображения для доступа на других платформах, таких как AWS. В нашем случае мы опубликуем наш образ в Dockerhub, а затем вытащим его в EC2 для развертывания.

Чтобы опубликовать наше изображение, нам нужно сначала создать учетную запись на Docker hub и войти в нее на вашем терминале:

$ docker login

После входа в систему нам нужно будет пометить ваше изображение нашим именем пользователя, а затем отправить его в Dockerhub:

$ docker tag django_ec2 /django_ec2
$ docker push /django_ec2

Таким образом, мы готовы к следующему шагу-развертыванию нашего приложения в эластичном вычислительном облаке Amazon.

Развертывание в EC2

Теперь, когда наш образ Docker готов и опубликован в Dockerhub , мы можем войти в консоль учетной записи AWS и на панели мониторинга EC2 запустить новый экземпляр, что достигается с помощью ряда шагов.

Выберите AMI

Первый шаг включает в себя выбор образа Amazon Machine Image (AMI), который будет использоваться для создания нашего экземпляра. Нам представлены варианты, включая Red Hat , Ubuntu Server и Windows Server .

Для этой демонстрации нам понадобится изображение, настроенное для запуска контейнеров и кораблей с помощью Docker. Чтобы найти его, введите ECS в строке поиска:

aws_ami_selection

Amazon ECS-Оптимизированный Amazon Linux 2 идеально подходит для нашего сценария, и именно его мы и выберем.

Выберите Тип экземпляра

ec2_instance_type

После выбора AMI для нашего экземпляра мы теперь должны выбрать тип экземпляра. Наш выбор здесь будет диктовать количество ресурсов, которыми будет обладать наш экземпляр с точки зрения процессора, памяти, хранилища и производительности сети.

Поскольку мы находимся на свободном уровне AWS, мы будем использовать экземпляр t2.micro , который предназначен для экземпляров общего назначения и поставляется с 1 виртуальным процессором и 1 гигабайтом памяти.

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

Настройка экземпляра

ec2_instance_details

Теперь, когда мы выбрали тип экземпляра, следующий шаг позволяет нам указать некоторые дополнительные сведения о нашем экземпляре, включая количество экземпляров, которые будут запущены в любой момент времени, сетевые параметры и файловые системы, среди прочих деталей. На этом этапе мы не будем вносить никаких изменений в параметры по умолчанию.

Добавить хранилище

ec2_adding_storage

Четвертый шаг включает в себя добавление и уточнение деталей хранения для нашего экземпляра. Этот раздел позволяет нам добавлять дополнительные тома, указывать размер и типы томов, а также будет ли наше хранилище зашифровано или нет.

8 ГБ-это опция по умолчанию, и этого более чем достаточно для нашего простого приложения Django.

Добавление тегов

ec2_add_tags

AWS позволяет нам присваивать нашим ресурсам ярлыки, с помощью которых мы можем классифицировать их с точки зрения назначения, доступа или среды. Теги не являются обязательными, но настоятельно рекомендуются для идентификации ресурсов по мере их увеличения.

Настройка группы безопасности

ec2_configure_security_group

Мы определили группы безопасности ранее в этой статье, и на этом этапе процесса мы настраиваем их, либо создавая новую группу безопасности, либо используя существующую.

Мы собираемся создать новую группу безопасности, которая будет определять, какой трафик будет приниматься на наш сервер. Первое правило-это правило SSH, которое позволит SSH-трафику поступать в наш экземпляр через порт 22 .

Мы изменим исходный код на Anywhere а также добавьте новое правило для Custom TCP и установите источник в В любом месте и диапазон портов до 8000 . Это позволит нам получить доступ к нашему веб-приложению Django через порт 8000 .

Обзор и запуск

ec2_review_and_launch

Это последний шаг, на котором нам представляются детали конфигурации нашего экземпляра для проверки. Мы также можем отредактировать конфигурацию на этом этапе перед запуском нашего экземпляра.

Если все правильно, мы можем, наконец, нажать на кнопку “Запустить”, чтобы наконец запустить наш экземпляр:

aws_create_key_pair

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

Закрытый ключ будет использоваться для аутентификации и предоставления нам доступа к экземпляру, чтобы мы могли продолжить развертывание. Подтверждение запуска экземпляра затем отображается на следующей странице:

ec2_instance_launched

Доступ к экземпляру EC2

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

Для этого нам понадобится файл .pem , загруженный ранее, и окно терминала. Нам также понадобится имя пользователя для выбранного ИМЕНИ – для Amazon Linux AMI по умолчанию используется имя пользователя ec2-user .

Для подключения к нему также требуется публичный DNS экземпляра, и это можно найти в разделе сведений об экземпляре на панели мониторинга консоли EC2.

Давайте откроем терминал в папке, содержащей наш файл закрытого ключа. Сначала нам нужно будет изменить права доступа к ключу, чтобы избежать появления предупреждения “незащищенный файл ключа”.:

$ chmod 400 

Затем мы можем использовать утилиту ssh вместе с нашим ключевым файлом для подключения к экземпляру:

$ ssh -i  [email protected]

   __|  __|  __|

   _|  (   \__ \   Amazon Linux 2 (ECS Optimized)

 ____|\___|____/

For documentation, visit http://aws.amazon.com/documentation/ecs

12 package(s) needed for security, out of 25 available

Run "sudo yum update" to apply all updates.

-bash: warning: setlocale: LC_CTYPE: cannot change locale (UTF-8): No such file or directory

[[email protected]###-##-##-## ~]$

Ответ выше означает, что мы успешно вошли в наш экземпляр, мы начнем с того, что вытащим образ нашего приложения из Dockerhub и запустим его с помощью команды docker run :

$ docker run -d -p 8000:8000 /django_ec2

Как только наш образ Docker будет втянут в наш экземпляр и успешно запущен, мы сможем получить доступ к вашему приложению Django в Интернете по тому же адресу, который мы использовали для SSH-входа в него.

Когда мы это делаем, нас приветствуют с:

ec2_instance_deployed

Наше приложение Django теперь работает в прямом эфире AWS Elastic Compute Cloud !

Вывод

В этом посте мы контейнеризировали приложение Django с помощью Docker и успешно развернули его в сервисе Amazon EC2. Мы также узнали, что такое EC2 и что он предлагает нам как разработчикам, и как мы можем использовать его, чтобы сделать наши веб-приложения доступными для конечных пользователей.

Исходный код скрипта в этом проекте можно найти здесь, на GitHub .