Я пробовал использовать форумы 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-адресах:
- http://myapp-env-blablabla.elasticbeanstalk.com/static/requirements.txt
- http://myapp-env-blablabla.elasticbeanstalk.com/static/secrets/keys.py
- http://myapp-env-blablabla.elasticbeanstalk.com/static/myapp/services/some-app-logic.py
- и т.д.
Я ткнул и обнаружил, что это вызвано этой конфигурацией в файле /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.