【问题标题】:Source code being exposed by AWS Elastic BeanstalkAWS Elastic Beanstalk 公开的源代码
【发布时间】:2023-03-10 22:24:01
【问题描述】:

我曾尝试使用 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

我发现我的应用程序中的任何文件都可以通过浏览以下 URL 来检索:

我翻了一圈,发现这是由文件/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="
        ], 
        //...
}

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

我希望我遗漏了一些东西,因为如果不求助于自定义 AMI,我无法找到防止这种情况发生的方法。

【问题讨论】:

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


    【解决方案1】:

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

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

    希望这可以帮助下一个可怜的灵魂。

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 我在我的问题中提到了这一点。它不起作用,这与文档背道而驰。这似乎是正确的路线,但在创建 Apache 配置时,EB 内部脚本忽略了它。 AWS 在 2013 年 10 月下旬修复了此问题。
      猜你喜欢
      • 2015-02-13
      • 2021-08-18
      • 2015-09-26
      • 1970-01-01
      • 1970-01-01
      • 2017-07-28
      • 2017-01-17
      • 2017-08-05
      • 2018-06-05
      相关资源
      最近更新 更多