Как развернуть приложение 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

Вернуться на верх