我尝试使用 AWS 论坛寻求帮助,但是,天哪,那里很难得到任何帮助。不管怎样,原来的帖子还在。
这是同样的问题。
我使用 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
我发现我的应用程序中的任何文件都可以通过浏览以下 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
我四处寻找,发现这是由文件/etc/httpd/conf.d/wsgi.conf中的此配置引起的:
Alias /static /opt/python/current/app/
<Directory /opt/python/current/app/>
Order allow,deny
Allow from all
</Directory>
基本上,这允许通过/static虚拟路径对我的整个应用程序(部署在/opt/python/current/app/)进行读取访问。
在这一点上,有人可能会建议使用 .config ebextension 文件覆盖默认的 Python 容器staticFiles选项(顺便说一下,这是一个多么糟糕的默认值)是一件简单的事情。好吧,如果你看看我的目录结构,你会看到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/deploy/configuration/containerconfiguration:
{
"python": {
//...
"static_files": [
"/static="
],
//...
}
我为倾倒了这么多代码而道歉,但它的要点是当被调用来生成wsgi.config_generate_static_file_config
的那部分时,它从不使用那些 ebextension 配置文件中指定的任何值。仅使用固定文件containerconfiguration ,它具有/static映射的邪恶默认值。SimplifiedConfigLoader
我希望我错过了一些东西,因为如果不求助于自定义 AMI,我找不到防止这种情况发生的方法。