我試過使用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
我發現,在我的應用程序的任何文件可以通過瀏覽如以下網址獲得:
- 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虛擬路徑。
此時有人可能認爲這是一個使用的.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。
我在我的問題提到這一點。這不起作用,違背了文檔。這似乎是正確的路線,但在創建Apache配置時EB內部腳本忽略了它。 AWS在2013年10月下旬修復了這個問題。 – sergiopereira