ser*_*ira 10 python amazon-web-services flask amazon-elastic-beanstalk
我曾尝试使用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
Run Code Online (Sandbox Code Playgroud)
我发现我的应用中的任何文件都可以通过浏览来检索,如下面的网址所示:
我捅了一下,发现这是由文件/etc/httpd/conf.d/wsgi.conf中的这个配置引起的:
Alias /static /opt/python/current/app/
<Directory /opt/python/current/app/>
Order allow,deny
Allow from all
</Directory>
Run Code Online (Sandbox Code Playgroud)
基本上,这允许通过/ static虚拟路径对我的整个应用程序(部署在/ opt/python/current/app /)进行读访问.
在这一点上,有人可能会建议使用.config ebextension文件覆盖默认的Python容器staticFiles选项(顺便说一下,这是一个可怕的默认值)是一件简单的事情.好吧,如果你看一下我的目录结构,你会看到python-container.config,它有:
"aws:elasticbeanstalk:container:python:staticfiles":
"/static/": "app/myapp/static/"
Run Code Online (Sandbox Code Playgroud)
但是,在生成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'))
Run Code Online (Sandbox Code Playgroud)
/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'))
Run Code Online (Sandbox Code Playgroud)
/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
Run Code Online (Sandbox Code Playgroud)
/ opt/elasticbeanstalk/deploy/configuration/containerconfiguration:
{
"python": {
//...
"static_files": [
"/static="
],
//...
}
Run Code Online (Sandbox Code Playgroud)
我为倾销这么多代码而道歉,但它的要点是当_generate_static_file_config调用生成wsgi.config的那部分时,它从不使用那些ebextension配置文件中指定的任何值.SimplifiedConfigLoader仅使用固定文件容器配置,它具有/ static映射的恶意默认值.
我希望我错过了一些东西,因为我无法找到一种方法来防止这种情况,而无需使用自定义AMI.
我最终在AWS支持下开了一个付费案例,他们证实这是Python容器代码中的一个错误.
由于这个问题,他们刚刚发布了(10/25/2013)容器的新版本,任何新环境都将包含该修复程序.要修复任何现有环境......好吧,你做不到.您必须从头开始创建一个新环境(甚至不使用已保存的配置),然后从旧环境切换.
希望这有助于下一个可怜的灵魂.
更新2017-01-10:当我回答时,无法将容器升级到更新版本.从那以后,AWS添加了该功能.您甚至可以使用Managed Platform Updates功能自动更新它.
| 归档时间: |
|
| 查看次数: |
1433 次 |
| 最近记录: |