2013-10-14 5 views
10

Я пробовал использовать форумы 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 

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

Я пошарил и нашел, что это вызвано этой конфигурации в файле /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.

ответ

7

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

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

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

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

0

Вы также можете изменить значение упомянутого псевдонима /static через конфигурационную консоль на вашей среде эластичного бобового стежка. В разделе «Static Files», сопоставьте виртуальный путь /статический, чтобы указать на каталог приложение/MyApp/статический/

+0

Я упоминаю об этом в моем вопросе. Он не работал, что противоречит документам. Это казалось правильным путем, но при создании конфигурации Apache он игнорировался внутренними сценариями EB. Это было зафиксировано AWS в конце октября 2013 года. – sergiopereira

Смежные вопросы