AWS Elasti c Сбой команд контейнера Beanstalk - PullRequest
6 голосов
/ 18 июня 2020

Мне было трудно добиться успешного развертывания моего Django веб-приложения на AWS 'Elasti c Beanstalk. Я могу без проблем развернуть свое приложение из интерфейса командной строки EB на моем локальном компьютере, пока не добавлю список конфигурационного файла container_commands в папку .ebextensions.

Вот содержимое моего файла конфигурации:

container_commands:
  01_makeAppMigrations:
    command: "django-admin.py makemigrations"
    leader_only: true
  02_migrateApps:
    command: "django-admin.py migrate"
    leader_only: true
  03_create_superuser_for_django_admin:
    command: "django-admin.py createfirstsuperuser"
    leader_only: true
  04_collectstatic:
    command: "django-admin.py collectstatic --noinput"

Я углубился в журналы и обнаружил, что эти сообщения в cfn-init-cmd.log наиболее полезны:

2020-06-18 04:01:49,965 P18083 [INFO] Config postbuild_0_DjangoApp_smt_prod
2020-06-18 04:01:49,991 P18083 [INFO] ============================================================
2020-06-18 04:01:49,991 P18083 [INFO] Test for Command 01_makeAppMigrations
2020-06-18 04:01:49,995 P18083 [INFO] Completed successfully.
2020-06-18 04:01:49,995 P18083 [INFO] ============================================================
2020-06-18 04:01:49,995 P18083 [INFO] Command 01_makeAppMigrations
2020-06-18 04:01:49,998 P18083 [INFO] -----------------------Command Output-----------------------
2020-06-18 04:01:49,998 P18083 [INFO]   /bin/sh: django-admin.py: command not found
2020-06-18 04:01:49,998 P18083 [INFO] ------------------------------------------------------------
2020-06-18 04:01:49,998 P18083 [ERROR] Exited with error code 127

Я не уверен почему он не может найти эту команду в этой последней среде. Я развернул это же приложение с тем же файлом конфигурации в предыдущей среде beanstalk без каких-либо проблем. Единственное отличие теперь состоит в том, что эта новая среда была запущена в VP C и использует последнюю рекомендованную платформу.

Старая платформа среды Beanstalk : Python 3.6, работающая на 64-битной платформе Amazon Linux / 2.9.3

Новая платформа среды Beanstalk : Python 3.7, работающая на 64-битной Amazon Linux 2 / 3.0.2

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

Если бы кто-то мог указать на что-то очевидное, чего мне здесь не хватает, я бы очень признателен! Пожалуйста, дайте мне знать, если я могу предоставить дополнительную информацию!

Ответы [ 2 ]

9 голосов
/ 24 июня 2020

Наконец-то добрался до сути всего, после глубокого изучения AWS документации и форумов ...

По сути, было много изменений, которые произошли вместе с переходом Beanstalk с Amazon Linux на Amazon Linux 2. Многие из этих изменений неопределенно упомянуты здесь .

Одно из основных отличий платформы Python, упомянутых в приведенной выше ссылке, заключается в том, что « путь к каталогу приложения на экземплярах Amazon EC2 вашей среды - / var / app / current. На платформах AMI Amazon Linux это был / opt / python / current / app ». Это очень важно, когда вы пытаетесь создать Django скрипты миграции, как я объясню более подробно ниже, или когда вы eb ssh переходите к экземпляру Beanstalk и перемещаетесь по нему самостоятельно.

Другой важный Отличие заключается во введении хуков платформы, о котором упоминается в этой замечательной статье , здесь . Согласно этой статье, «хуки платформы - это набор каталогов внутри пакета приложений, которые можно заполнять скриптами». По сути, эти скрипты теперь будут обрабатывать то, что предыдущие container_commands обрабатывали в файлах конфигурации .ebextensions. Вот структура каталогов этих хуков платформы: Platform hooks directory structure

Knowing this, and walking through this forum здесь , где замечательные члены сообщества столкнулись с проблемой заполнения пробелов в документах Amazon, мне удалось успешно развернуть с настроенным следующим файлом :

(Обратите внимание, что «MDGOnline» - это имя моего Django приложения)

.ebextensions \ 01_packages.config :

packages:
  yum:
    git: []
    postgresql-devel: []
    libjpeg-turbo-devel: []

.ebextensions \ django .config :

container_commands:
  01_sh_executable:
    command: find .platform/hooks/ -type f -iname "*.sh" -exec chmod +x {} \;
option_settings:
  aws:elasticbeanstalk:application:environment:
    DJANGO_SETTINGS_MODULE: MDGOnline.settings
  aws:elasticbeanstalk:environment:proxy:staticfiles:    
    /static: static
    /static_files: static_files
  aws:elasticbeanstalk:container:python:
    WSGIPath: MDGOnline.wsgi:application

.platform \ hooks \ Preploy \ 01_migrations. sh:

#!/bin/bash

source /var/app/venv/*/bin/activate
cd /var/app/staging

python manage.py makemigrations
python manage.py migrate
python manage.py createfirstsuperuser
python manage.py collectstatic --noinput

Обратите внимание, что скрипты '. sh' должны быть основаны на linux. Некоторое время я сталкивался с ошибкой, из-за которой развертывание не удавалось, и в журналах появилось это сообщение: .platform\hooks\predeploy\01_migrations.sh failed with error fork/exec .platform\hooks\predeploy\01_migrations.sh: no such file or directory . Оказывается, это произошло из-за того, что я создал этот скрипт в своей среде разработки windows. Мое решение состояло в том, чтобы создать его в среде linux и скопировать в каталог моей среды разработки в Windows. Я уверен, что существуют способы конвертировать DOS в Unix. Этот выглядит многообещающе dos2 unix!

Я действительно wi sh AWS мог бы лучше задокументировать эту миграцию, но я надеюсь, что этот ответ может сэкономить кому-то бесчисленные часы, которые я потратил на получение это развертывание должно быть успешным.

Пожалуйста, не стесняйтесь обращаться ко мне за разъяснениями по любому из вышеперечисленных!

РЕДАКТИРОВАТЬ: Я добавил "container_command" в свой файл конфигурации выше, поскольку он был добавлен к моему вниманию, что другой пользователь также обнаружил ошибку «доступ запрещен» для ловушки платформы при развертывании. Эта команда «01_sh_executable» предназначена для изменения всех сценариев. sh в каталоге перехватчиков приложения, чтобы у Elasti c Beanstalk было надлежащее разрешение на их выполнение в процессе развертывания. Я нашел это решение команды контейнера на этом форуме здесь :

0 голосов
/ 04 июля 2020

Это может сработать .ebextensions / django .config

   option_settings:
  aws:elasticbeanstalk:container:python:
    WSGIPath: mysite.wsgi:application
  aws:elasticbeanstalk:environment:proxy:staticfiles:
    /static: static
packages: 
  yum:
    python3-devel: []
    mariadb-devel: []
container_commands:
  01_collectstatic:
    command: "source /var/app/venv/staging-LQM1lest/bin/activate && python manage.py collectstatic --noinput"
  02_migrate:
    command: "source /var/app/venv/staging-LQM1lest/bin/activate && python manage.py migrate --noinput"
    leader_only: true
...