2013-10-14 53 views
10

我試過使用AWS論壇來獲得幫助,但是,哦,男孩,很難在那裏得到任何東西。無論如何,the original post仍然存在。由AWS Elastic暴露的源代碼Beanstalk

這是同樣的問題。

我使用Elastic Beanstalk和Python容器部署了Python(Flask)應用程序。目錄結構是多還是少這個(簡化爲去點):

[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虛擬路徑。

此時有人可能認爲這是一個使用的.config ebextension文件覆蓋默認的Python容器staticFiles選項(什麼可怕的默認值,順便)的一個簡單的事情。好吧,如果你看一下我的目錄結構,你會看到蟒蛇-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。配置,它從不使用這些ebextension配置文件中指定的任何值。 SimplifiedConfigLoader僅使用固定文件容器配置,它具有映射的/static的邪惡默認值。

我希望我錯過了一些東西,因爲我無法找到一種方法來避免這種情況,而不訴諸自定義的AMI。

回答

7

我最終打開了AWS支持的付費案例,他們確認這是Python容器代碼中的一個錯誤。

由於這個問題,他們剛剛發佈了(10/25/2013)容器的新版本,任何新的環境都會包含修復程序。要修復你現有的任何環境......那麼你不能。您必須從頭開始創建新的環境(甚至不要使用保存的配置),然後從舊的環境切換。

希望這有助於下一個可憐的靈魂。

更新2017-01-10:當我回答時,無法將容器升級到更新的版本。自那時以來,AWS添加了該功能。您甚至可以通過託管平臺更新功能讓它自動更新。

0

您還可以通過Elastic Beanstalk環境上的配置控制檯更改上述/static別名的值。 「靜態文件」部分下,映射虛擬路徑/靜態指向目錄應用程序/ MyApp的/靜態/

+0

我在我的問題提到這一點。這不起作用,違背了文檔。這似乎是正確的路線,但在創建Apache配置時EB內部腳本忽略了它。 AWS在2013年10月下旬修復了這個問題。 – sergiopereira