AWS Elastic Beanstalk公开的源代码

时间:2013-10-14 15:27:58

标签: python amazon-web-services flask elastic-beanstalk

我已经尝试过使用AWS论坛获取帮助,但是,哦,男孩,那里很难得到任何东西。无论如何,the original post仍在那里。

这是同样的问题。

我使用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>

基本上,这允许通过 / 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 /部署/配置/ containerconfiguration

{
    "python": {
        //...
        "static_files": [
            "/static="
        ], 
        //...
}

我为倾销这么多代码而道歉,但它的要点是,当调用_generate_static_file_config来生成 wsgi.config 的那一部分时,它从不使用指定的任何值在那些ebextension配置文件中。 SimplifiedConfigLoader仅使用固定文件 containerconfiguration ,它具有 / static 映射的邪恶默认值。

我希望我遗失了一些东西,因为我无法找到办法阻止这种情况而不诉诸自定义AMI。

2 个答案:

答案 0 :(得分:8)

我最终在AWS支持下开了一个付费案例,他们确认这是Python容器代码中的一个错误。

由于这个问题,他们刚刚发布了(10/25/2013)容器的新版本,并且任何新环境都将包含该修复程序。要修复任何现有环境......好吧,你做不到。您必须从头开始创建一个新环境(甚至不使用已保存的配置),然后从旧环境切换。

希望这有助于下一个可怜的灵魂。

更新2017-01-10 :当我回答时,无法将容器升级到更新版本。从那以后,AWS添加了该功能。您甚至可以使用托管平台更新功能自动更新它。

答案 1 :(得分:0)

您还可以通过Elastic Beanstalk环境中的配置控制台更改所述/static别名的值。在“静态文件”部分下,将虚拟路径 / static 映射到指向您的目录 app / myapp / static /