Развертывание Django в Elasti c Beanstalk, миграция не удалась - PullRequest
2 голосов
/ 18 июня 2020

Я пытаюсь развернуть проект, над которым работал, с django. В разработке я использовал SQLite, в производстве я пытаюсь использовать MySQL.

Обычно, когда я создаю экземпляр EB, все работает нормально, и консоль сообщает, что статус ОК. При попытке развертывания (запуск eb deploy в ebcli) я столкнулся со следующей ошибкой

2020/06/18 15:59:50.357281 [INFO] Copying file /opt/elasticbeanstalk/config/private/rsyslog.conf to /etc/rsyslog.d/web.conf
2020/06/18 15:59:50.358945 [INFO] Running command /bin/sh -c systemctl restart rsyslog.service
2020/06/18 15:59:50.394223 [INFO] Executing instruction: PostBuildEbExtension
2020/06/18 15:59:50.394243 [INFO] No plugin in cfn metadata.
2020/06/18 15:59:50.394252 [INFO] Starting executing the config set Infra-EmbeddedPostBuild.
2020/06/18 15:59:50.394273 [INFO] Running command /bin/sh -c /opt/aws/bin/cfn-init -s arn:aws:cloudformation:eu-west-2:433403353655:stack/awseb-e-qamgvpp7ft-stack/3e6774d0-b17c-11ea-9476-0a5f6fd32d44 -r AWSEBAutoScalingGroup --region eu-west-2 --configsets Infra-EmbeddedPostBuild
2020/06/18 15:59:50.721919 [ERROR] Error occurred during build: Command 01_migrate failed

2020/06/18 15:59:50.721944 [ERROR] An error occurred during execution of command [app-deploy] - [PostBuildEbExtension]. Stop running the command. Error: Container commands build failed. Please refer to /var/log/cfn-init.log for more details. 

2020/06/18 15:59:50.721949 [INFO] Executing cleanup logic
2020/06/18 15:59:50.722079 [INFO] CommandService Response: {"status":"FAILURE","api_version":"1.0","results":[{"status":"FAILURE","msg":"Engine execution has encountered an error.","returncode":1,"events":[]}]}

2020/06/18 15:59:50.722249 [INFO] Platform Engine finished execution on command: app-deploy

Похоже, виновата моя команда миграции db, которая выглядит следующим образом в '.ebextensions' с именем 'db-migrate.config'

container_commands:
  01_migrate:
    command: "django-admin.py migrate"
    leader_only: true

option_settings:
    aws:elasticbeanstalk:application:environment:
        DJANGO_SETTINGS_MODULE: djangomicroblog.settings

Исходное сообщение об ошибке также указывает мне на журнал из '/var/log/cfn-init.log, ошибка здесь выглядит следующим образом

2020-06-18 14:18:23,279 [ERROR] -----------------------BUILD FAILED!------------------------
2020-06-18 14:18:23,279 [ERROR] Unhandled exception during build: Command 01_migrate failed
Traceback (most recent call last):
  File "/opt/aws/bin/cfn-init", line 171, in <module>
    worklog.build(metadata, configSets)
  File "/usr/lib/python2.7/site-packages/cfnbootstrap/construction.py", line 129, in build
    Contractor(metadata).build(configSets, self)
  File "/usr/lib/python2.7/site-packages/cfnbootstrap/construction.py", line 530, in build
    self.run_config(config, worklog)
  File "/usr/lib/python2.7/site-packages/cfnbootstrap/construction.py", line 542, in run_config
    CloudFormationCarpenter(config, self._auth_config).build(worklog)
  File "/usr/lib/python2.7/site-packages/cfnbootstrap/construction.py", line 260, in build
    changes['commands'] = CommandTool().apply(self._config.commands)
  File "/usr/lib/python2.7/site-packages/cfnbootstrap/command_tool.py", line 117, in apply
    raise ToolError(u"Command %s failed" % name)
ToolError: Command 01_migrate failed

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

Функция в моем settings.py для настройки базы данных также выглядит следующим образом:

def get_db():
    try:
        return {
           'default': {
               'ENGINE': 'django.db.backends.mysql',
               'NAME': os.environ['RDS_DB_NAME'],
               'USER': os.environ['RDS_USERNAME'],
               'PASSWORD': os.environ['RDS_PASSWORD'],
               'HOST': os.environ['RDS_HOSTNAME'],
               'PORT': os.environ['RDS_PORT'],
           }
        }
    except:
        return {
            'default': {
                'ENGINE': 'django.db.backends.sqlite3',
                'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
    }
}

DATABASES = get_db()

Любая помощь будет принята с благодарностью

1 Ответ

3 голосов
/ 24 июля 2020

У меня была такая же проблема, используя Amazon Linux 2 с Python 3,7 , как и OP. AWS не обновлял свою документацию для поддержки изменений платформы, что сильно сбивало с толку. Я нашел исправление, хотя оно мне не нравится, но вот мое решение:

TLDR - вот мое решение . О том, как я туда попал, я вставил в свои заметки во время отладки:

container_commands:
    01_migrate:
        command: "source /var/app/venv/*/bin/activate && python3 manage.py migrate"
        leader_only: true

Хотя мне это не нравится, я подтвердил с AWS Support, что это на самом деле рекомендованный способ сделать это. Вы должны исходить из среды python, так как в AL2 они используют виртуальные среды, чтобы оставаться более согласованными.

Из AWS объявления Amazon Linux 2 в декабре я обнаружил, что установленная среда python хранится в /var/app/venv/*/..

2020-07-22 19:20:41,376 [ERROR] -----------------------BUILD FAILED!------------------------
2020-07-22 19:20:41,376 [ERROR] Unhandled exception during build: Command 01_migrate failed
Traceback (most recent call last):
  File "/opt/aws/bin/cfn-init", line 171, in <module>
    worklog.build(metadata, configSets)
  File "/usr/lib/python2.7/site-packages/cfnbootstrap/construction.py", line 129, in build
    Contractor(metadata).build(configSets, self)
  File "/usr/lib/python2.7/site-packages/cfnbootstrap/construction.py", line 530, in build
    self.run_config(config, worklog)
  File "/usr/lib/python2.7/site-packages/cfnbootstrap/construction.py", line 542, in run_config
    CloudFormationCarpenter(config, self._auth_config).build(worklog)
  File "/usr/lib/python2.7/site-packages/cfnbootstrap/construction.py", line 260, in build
    changes['commands'] = CommandTool().apply(self._config.commands)
  File "/usr/lib/python2.7/site-packages/cfnbootstrap/command_tool.py", line 117, in apply
    raise ToolError(u"Command %s failed" % name)
ToolError: Command 01_migrate failed

Я нашел log, который на самом деле сообщает мне более полезную информацию: /var/log/cfn-init-cmd.log

, что дает мне эту ошибку:

2020-07-22 21:08:32,757 P1620 [INFO] ============================================================
2020-07-22 21:08:32,757 P1620 [INFO] Command 01_migrate
2020-07-22 21:08:32,771 P1620 [INFO] -----------------------Command Output-----------------------
2020-07-22 21:08:32,772 P1620 [INFO]      File "manage.py", line 17
2020-07-22 21:08:32,772 P1620 [INFO]        ) from exc
2020-07-22 21:08:32,772 P1620 [INFO]             ^
2020-07-22 21:08:32,772 P1620 [INFO]    SyntaxError: invalid syntax
2020-07-22 21:08:32,772 P1620 [INFO] ------------------------------------------------------------
2020-07-22 21:08:32,772 P1620 [ERROR] Exited with error code 1

, что странно. Вероятно, это означает, что я использую неправильную версию python. Поэтому мне, вероятно, нужно изменить мою команду: итак ... я пробовал:

  1. python manage.py migrate
  2. python3 manage.py migrate

Это дало мне лучшее сообщение об ошибке

2020-07-23 14:47:06,906 P14080 [INFO] ============================================================
2020-07-23 14:47:06,906 P14080 [INFO] Command 01_migrate
2020-07-23 14:47:06,936 P14080 [INFO] -----------------------Command Output-----------------------
2020-07-23 14:47:06,936 P14080 [INFO]   Traceback (most recent call last):
2020-07-23 14:47:06,936 P14080 [INFO]     File "manage.py", line 11, in main
2020-07-23 14:47:06,936 P14080 [INFO]       from django.core.management import execute_from_command_line
2020-07-23 14:47:06,936 P14080 [INFO]   ModuleNotFoundError: No module named 'django'
2020-07-23 14:47:06,937 P14080 [INFO]   
2020-07-23 14:47:06,937 P14080 [INFO]   The above exception was the direct cause of the following exception:
2020-07-23 14:47:06,937 P14080 [INFO]   
2020-07-23 14:47:06,937 P14080 [INFO]   Traceback (most recent call last):
2020-07-23 14:47:06,937 P14080 [INFO]     File "manage.py", line 28, in <module>
2020-07-23 14:47:06,937 P14080 [INFO]       main()
2020-07-23 14:47:06,937 P14080 [INFO]     File "manage.py", line 17, in main
2020-07-23 14:47:06,937 P14080 [INFO]       ) from exc
2020-07-23 14:47:06,937 P14080 [INFO]   ImportError: Couldn't import Django. Are you sure it's installed and available on your PYTHONPATH environment variable? Did you forget to activate a virtual environment?
2020-07-23 14:47:06,937 P14080 [INFO] ------------------------------------------------------------
2020-07-23 14:47:06,937 P14080 [ERROR] Exited with error code 1

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

Небольшая тирада, которую я оставил по этому поводу здесь: Python на платформе Amazon Linux 2 · Проблема № 15 · aws / elasti c -beanstalk-roadmap · GitHub что связано с.

? source /var/app/venv/*/bin/activate && python3 manage.py migrate ? Я нашел среду на экземпляре EC2 и вручную загрузил ее, чтобы заставить использовать правильную версию python. Похоже, это решило проблему среды python. Теперь RDS, кажется, не имеет базы данных, но это кажется более исправимым.
2020-07-23 15:26:32,016 P14702 [INFO] ============================================================
2020-07-23 15:26:32,016 P14702 [INFO] Command 01_migrate
2020-07-23 15:26:32,426 P14702 [INFO] -----------------------Command Output-----------------------
2020-07-23 15:26:32,427 P14702 [INFO]   Traceback (most recent call last):
2020-07-23 15:26:32,427 P14702 [INFO]     File "/var/app/venv/staging-LQM1lest/lib/python3.7/site-packages/django/db/backends/base/base.py", line 220, in ensure_connection
2020-07-23 15:26:32,427 P14702 [INFO]       self.connect()
2020-07-23 15:26:32,427 P14702 [INFO]     File "/var/app/venv/staging-LQM1lest/lib/python3.7/site-packages/django/utils/asyncio.py", line 26, in inner
2020-07-23 15:26:32,427 P14702 [INFO]       return func(*args, **kwargs)
2020-07-23 15:26:32,427 P14702 [INFO]     File "/var/app/venv/staging-LQM1lest/lib/python3.7/site-packages/django/db/backends/base/base.py", line 197, in connect
2020-07-23 15:26:32,427 P14702 [INFO]       self.connection = self.get_new_connection(conn_params)
2020-07-23 15:26:32,427 P14702 [INFO]     File "/var/app/venv/staging-LQM1lest/lib/python3.7/site-packages/django/utils/asyncio.py", line 26, in inner
2020-07-23 15:26:32,427 P14702 [INFO]       return func(*args, **kwargs)
2020-07-23 15:26:32,427 P14702 [INFO]     File "/var/app/venv/staging-LQM1lest/lib/python3.7/site-packages/django/db/backends/postgresql/base.py", line 185, in get_new_connection
2020-07-23 15:26:32,427 P14702 [INFO]       connection = Database.connect(**conn_params)
2020-07-23 15:26:32,428 P14702 [INFO]     File "/var/app/venv/staging-LQM1lest/lib64/python3.7/site-packages/psycopg2/__init__.py", line 127, in connect
2020-07-23 15:26:32,428 P14702 [INFO]       conn = _connect(dsn, connection_factory=connection_factory, **kwasync)
2020-07-23 15:26:32,428 P14702 [INFO]   psycopg2.OperationalError: FATAL:  database "ebdb" does not exist

для меня, на этом этапе я знал, что команда migrate прошла успешно, поэтому решение просто:

container_commands:
    01_migrate:
        command: "source /var/app/venv/*/bin/activate && python3 manage.py migrate"
        leader_only: true

Конечно, мне пришлось подключиться к экземпляру RDS и создать базу данных, но отсюда это сработало.

...