Исходный код, выставленный AWS Elastic Beanstalk

Я пробовал использовать форумы AWS, чтобы получить помощь, но, о мальчик, трудно что-то там получить. В любом случае исходное сообщение все еще существует.

Здесь тот же вопрос.

Я развернул приложение Python (Flask) с помощью Elastic Beanstalk и контейнера Python. Структура каталогов более или менее такова (упрощена, чтобы добраться до точки):

[app root]
  - application.py
  - requirements.txt
  /.ebextensions
      - python-container.config 
  /secrets
      - keys.py
      - secret_logic.py
  /myapp
      - __init__.py
      /static
         - image1.png
         - some-other-file.js
      /services
         - __init__.py
         - some-app-logic.py

Я обнаружил, что любой файл в моем приложении может быть получен путем просмотра, как в следующих URL-адресах:

Я ткнул и обнаружил, что это вызвано этой конфигурацией в файле /etc/httpd/conf.d/wsgi.conf:

Alias /static /opt/python/current/app/ 
<Directory /opt/python/current/app/>
Order allow,deny
Allow from all
</Directory>

В основном это позволяет читать доступ ко всему моему приложению (развертывается в /opt/python/current/app/) через виртуальный путь /статический.

В этот момент кто-то может предположить, что это просто вопрос переопределения опции Python по умолчанию staticFiles (что, кстати, ужасное значение по умолчанию) с использованием файла .config ebextension. Ну, если вы посмотрите на мою структуру каталогов, вы увидите python-container.config, которая имеет:

"aws:elasticbeanstalk:container:python:staticfiles":
    "/static/": "app/myapp/static/"

Но этот файл полностью игнорируется при создании файлов конфигурации Apache. Чтобы (я думаю) доказать это, посмотрите на сценарии AWS EB в этих файлах (только важные строки):

/opt/elasticbeanstalk/hooks/configdeploy/pre/01generate.py

configuration = config.SimplifiedConfigLoader().load_config()
config.generate_apache_config(
    configuration, os.path.join(config.ON_DECK_DIR, 'wsgi.conf'))

/opt/elasticbeanstalk/hooks/appdeploy/pre/04configen.py

configuration = config.SimplifiedConfigLoader().load_config()
config.generate_apache_config(
    configuration, os.path.join(config.ON_DECK_DIR, 'wsgi.conf'))

/opt/elasticbeanstalk/hooks/config.py

def _generate_static_file_config(mapping):
    contents = []
    for key, value in mapping.items():
        contents.append('Alias %s %s' % (key, os.path.join(APP_DIR, value)))
        contents.append('<Directory %s>' % os.path.join(APP_DIR, value))
        contents.append('Order allow,deny')
        contents.append('Allow from all')
        contents.append('</Directory>')
        contents.append('')
    return '\n'.join(contents)

class SimplifiedConfigLoader(ContainerConfigLoader):
    def load_config(self):
        parsed = json.loads("path/to/containerconfiguration")
        python_section = parsed['python']
        converted = {}
        #..snip...
        static_files = {}
        for keyval in python_section['static_files']:
            key, value = keyval.split('=', 1)
            static_files[key] = value
        converted['static_files'] = static_files
        #...
        return converted

/Opt/elasticbeanstalk/развернуть/конфигурации/containerconfiguration:

{
    "python": {
        //...
        "static_files": [
            "/static="
        ], 
        //...
}

Я извиняюсь за то, что вы сбрасывали столько кода, но суть в том, что когда _generate_static_file_config вызывается для создания этой части wsgi.config, он никогда не использует никаких значений, указанных в этих конфигурационных файлах ebextension. SimplifiedConfigLoader использует только фиксированную конфигурацию контейнера файла, которая имеет злое значение по умолчанию для/статического отображения.

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

Ответ 1

В итоге я открыл платное приложение с поддержкой AWS, и они подтвердили, что это ошибка в коде контейнера Python.

В результате этой проблемы они только что выпустили (10/25/2013) новую версию контейнера, и любые новые среды будут содержать исправление. Чтобы исправить любую из ваших существующих сред... ну, вы не можете. Вам нужно будет создать новую среду с нуля (даже не использовать сохраненные конфигурации), а затем переключиться с старого.

Надеюсь, это поможет следующей бедной душе.

Обновление 2017-01-10. Назад, когда я ответил, не удалось обновить контейнер до более новых версий. С тех пор AWS добавила эту функцию. Вы даже можете автоматически обновить его с помощью функции обновления управляемых платформ.

Ответ 2

Вы также можете изменить значение упомянутого псевдонима /static через консоль конфигурации в среде Elastic Beanstalk. В разделе "Статические файлы" сопоставьте виртуальный путь/статический, чтобы указать на ваше приложение каталога/myapp/static/