Я пробовал использовать форумы AWS, чтобы получить помощь, но, о мальчик, трудно что-либо получить там. В любом случае the original post все еще существует.Исходный код, выставленный AWS Elastic Beanstalk
Вот такой же вопрос.
Я развернул приложение Python (Flask) с использованием эластичного бобового стека и контейнера 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
Я обнаружил, что любой файл в моем приложении может быть получен при просмотре как в следующих адресах:
- 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/) через виртуальный путь /static.
В этот момент кто-то может предположить, что это простой вопрос перекрывая контейнер Python Значения по умолчанию staticFiles варианта (какое страшное значения по умолчанию, кстати), используя файл .config ebextension. Ну, если вы посмотрите на мою структуру каталогов, вы увидите питона-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
использует только фиксированный файл containerconfiguration, который имеет значение по умолчанию для /static.
Надеюсь, что у меня что-то не хватает, потому что я не могу найти способ предотвратить это, не прибегая к пользовательскому AMI.
Я упоминаю об этом в моем вопросе. Он не работал, что противоречит документам. Это казалось правильным путем, но при создании конфигурации Apache он игнорировался внутренними сценариями EB. Это было зафиксировано AWS в конце октября 2013 года. – sergiopereira