Как развернуть приложение Django 3.2 в AWS EBS с помощью Python VENV
Я написал приложение Django и хочу развернуть его на Amazon's Elastic Beanstalk.
Для его развертывания я использую следующую команду: eb create bizkaimove-server-2-env
Но он терпит неудачу, когда дело доходит до его развертывания, вот здесь:
(cfn-init-cmd.log)
2022-02-18 09:36:33,838 P3272 [INFO] Command pip_upgrade
2022-02-18 09:36:33,841 P3272 [INFO] -----------------------Command Output-----------------------
2022-02-18 09:36:33,841 P3272 [INFO] /bin/sh: /opt/python/run/venv/bin/pip: No such file or directory
2022-02-18 09:36:33,841 P3272 [INFO] ------------------------------------------------------------
2022-02-18 09:36:33,842 P3272 [ERROR] Exited with error code 127
Я создал виртуальную среду, чтобы запустить ее локально, но я не знаю, запускается ли эта среда в EBS. Но кажется, что да.
Подводя итог, мое приложение написано с использованием Django 3.2, Python 3.9 и зависит от базы данных PostgreSQL (удаленной, не встроенной) и установки GDAL.
Структура моих папок следующая:
bizkaimove_server
|- .ebsextensions
|- 00-django.config
|- 01-gdal.config
|- 02-upgrade_pip.config
|- 03-install_dependencies.config
|- 04-django-contrab.config
|- .elasticbeanstalk
|- config.yml
|- env_bizkaimove (python virtual environment folder)
|- requirements.txt
Содержимое файлов следующее:
00-django.config
option_settings:
aws:elasticbeanstalk:container:python:
WSGIPath: bizkaimove_server.wsgi:application
01-gdal.config
commands:
01_install_gdal:
test: "[ ! -d /usr/local/gdal ]"
command: "/tmp/gdal_install.sh"
files:
"/tmp/gdal_install.sh":
mode: "000755"
owner: root
group: root
content: |
#!/usr/bin/env bash
sudo yum-config-manager --enable epel
sudo yum -y install make automake gcc gcc-c++ libcurl-devel proj-devel geos-devel
# Geos
cd /
sudo mkdir -p /usr/local/geos
cd usr/local/geos/geos-3.9.2
sudo wget geos-3.9.2.tar.bz2 http://download.osgeo.org/geos/geos-3.9.2.tar.bz2
sudo tar -xvf geos-3.9.2.tar.bz2
cd geos-3.9.2
sudo ./configure
sudo make
sudo make install
sudo ldconfig
# Proj4
cd /
sudo mkdir -p /usr/local/proj
cd usr/local/proj
sudo wget -O proj-8.2.1.tar.gz http://download.osgeo.org/proj/proj-8.2.1.tar.gz
sudo wget -O proj-datumgrid-1.8.tar.gz http://download.osgeo.org/proj/proj-datumgrid-1.8.tar.gz
sudo tar xvf proj-8.2.1.tar.gz
sudo tar xvf proj-datumgrid-1.8.tar.gz
cd proj-8.2.1
sudo ./configure
sudo make
sudo make install
sudo ldconfig
# GDAL
cd /
sudo mkdir -p /usr/local/gdal
cd usr/local/gdal
sudo wget -O gdal-3.4.1.tar.gz http://download.osgeo.org/gdal/3.4.1/gdal-3.4.1.tar.gz
sudo tar xvf gdal-3.4.1.tar.gz
cd gdal-3.4.1
sudo ./configure
sudo make
sudo make install
sudo ldconfig
02-upgrade_pip.config
commands:
pip_upgrade:
command: /usr/local/bin/pip install --upgrade pip
ignoreErrors: false
03-install_dependencies.config
commands:
install_dependencies:
command: /usr/local/bin/pip install -r requirements.txt
04-django-contrab.config (нет необходимости показывать здесь его детали.)
config.yml
branch-defaults:
master:
environment: bizkaimove-server-2-env
group_suffix: null
environment-defaults:
bizkaimove-server-2-env:
branch: null
repository: null
bizkaimove-server-2-env2:
branch: null
repository: null
global:
application_name: bizkaimove-server-2-app
branch: null
default_ec2_keyname: *****
default_platform: Python 3.8
default_region: us-east-1
include_git_submodules: true
instance_profile: null
platform_name: null
platform_version: null
profile: null
repository: null
sc: git
workspace_type: Application
Почему я получаю эту ошибку, когда дело доходит до обновления pip? Мне кажется, что я пропустил какой-то шаг для активации venv. Но я бы не хотел использовать venv здесь, поскольку этот venv будет использоваться только для тестирования локально (нет смысла использовать его в production, поскольку у нас есть экземпляр python).
приложение Django с платформой python развертывается в виртуальной среде, и вам не нужно активировать виртуальную среду, она активируется сама.
Во-вторых, вам не нужно предоставлять команду для установки файла requirements.txt. Платформа Elastic Beanstalk python разработана таким образом, чтобы установить все пакеты, которые указаны в файле requirements.txt
В-третьих, я думаю, что ваш WSGI wath настроен неправильно. Вы упомянули -
option_settings:
aws:elasticbeanstalk:container:python:
WSGIPath: bizkaimove_server.wsgi:application
Но это должен быть путь к файлу WSGI, который отмечает начало работы приложения. Согласно вашей структуре каталогов, я предполагаю, что файл WSGI находится в каталоге "env_bizkaimove". Поэтому правильный путь будет -
option_settings:
aws:elasticbeanstalk:container:python:
WSGIPath: env_bizkaimove.wsgi:application
На платформе типа AL1 по умолчанию на порту 80 работает apache, который прослушивает запросы и пересылает их виртуальному хосту на порт 80, используя WSGI.
В AL2 веб-сервер nginx работает по умолчанию на всех платформах, который прослушивает порт 80 и перенаправляет запрос на порт 8000.
Кроме того, команда pip update в виртуальном env также нуждается в корректировке.
Если вы используете AL1, то это должно быть -
/opt/python/run/venv/bin/pip install --upgrade pip
А если вы используете AL2, то это должно быть -
/var/app/venv/staging-LQM1lest/bin/pip install --upgrade pip
Вы можете прочитать больше о том, как развернуть Django App на Beanstalk здесь - https://docs.aws.amazon.com/elasticbeanstalk/latest/dg/create-deploy-python-django.html