【问题标题】:How to deploy structured Flask app on AWS elastic beanstalk如何在 AWS 弹性 beantalk 上部署结构化 Flask 应用程序
【发布时间】:2013-12-31 18:20:18
【问题描述】:

使用此处概述的步骤成功部署测试应用后: http://docs.aws.amazon.com/elasticbeanstalk/latest/dg/create_deploy_Python_flask.html

我尝试部署具有以下结构的实际烧瓶应用程序:

myApp/
   runServer.py
   requirements.txt
   myApp/
      __init__.py
      helpers.py
      clean.sh
      static/
         myApp.css
      handlers/
         __init__.py
         views.py
      templates/
         layout.html
         viewOne.html
         viewTwo.html

views.py 包含我的 url 映射。

我尝试在根目录以及 myApp 模块和 git aws.push 中初始化 eb 实例,但在 AWS 仪表板上出现以下错误: ERROR Your WSGIPath refers to a file that does not exist. 并且应用程序无法运行(任何路径为 404)。

如何将上述Flask 应用程序部署到弹性beantalk?

【问题讨论】:

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


    【解决方案1】:

    我在将 Flask 应用程序部署到 EB 时遇到了类似的问题,具有类似的目录结构,并且必须做两件事:

    1. 更新我的 manage.py 以创建一个名为 application 而不是 app 的对象

      import os
      from application import create_app, db
      from flask.ext.script import Manager, Shell
      
      application = create_app(os.getenv('FLASK_CONFIG') or 'default')
      manager = Manager(application)
      
    2. 创建.ebextensions/myapp.config,并定义如下块指向manage.py

      option_settings:
        "aws:elasticbeanstalk:container:python":
          WSGIPath: manage.py
        "aws:elasticbeanstalk:container:python:staticfiles":
          "/static/": "application/static/" 
      

    这让 Elastic Beanstalk 可以正确找到可调用的应用程序。

    the official docs 对此进行了简要描述,in this blog post 对此进行了更详细的描述

    编辑 - 请参阅下面的项目结构

    • 项目根目录
      • .ebextensions
        • application.config
      • 申请
        • 主要
          • forms.py
          • views.py
      • 静态
      • 模板
      • 测试
      • ma​​nage.py
      • requirements.txt
      • config.py
      • 等等等等

    【讨论】:

      【解决方案2】:

      将以下内容添加到.ebextensions/<env-name>.config

      option_settings:
        "aws:elasticbeanstalk:container:python":
          WSGIPath: myApp/handlers/views.py
      

      更新:

      如果您没有 .ebextensions 目录,请为项目创建一个。您可以在Customizing and Configuring AWS Elastic Beanstalk Environments 指南中找到有关容器配置的更多信息。

      【讨论】:

      • 我似乎没有 .ebextensions 目录;我是不是该?我尝试更新 .elasticbeanstalk/optionsettings.myApp.config 文件更改 WSGIPath=... 行,这两个配置文件之间有区别吗?
      • .elasticbeanstalk 包含 eb 工具本身的元数据,最好不要篡改它。如果您没有 .ebextensions 目录,请创建一个并在其中添加配置文件。我应该在答案中更详细地说明这一点。
      • 从 awsebcli 3.0 开始,这实际上已经过时了。我添加了一个详细说明现在如何完成的答案。
      • @davetw12 您能否提供说明配置文件已过期的文档?
      【解决方案3】:

      您的 WSGIPath 引用了一个不存在的文件。

      出现此错误是因为默认情况下 Beanstalk 会查找 application.py。查看 Beanstalk 网页 UI,Configuration > Software ConfigurationWSGIPath 映射到 application.py

      更新WSGIPath如之前的回复或重命名为application.py文件。

      【讨论】:

        【解决方案4】:

        从 awsebcli 3.0 开始,您实际上可以编辑配置设置以通过 eb config 表示您的 WSGI 路径。然后,config 命令将根据您当前的配置设置拉取(并在您的默认命令行文本编辑器中打开它,即 nano)一个可编辑的配置。然后,您将搜索 WSGI 并以这种方式更新它的路径。保存文件并退出后,您的WSGI 路径将自动更新。

        【讨论】:

        • 您在上面的评论中说旧的 .config 方式已经过时了;但所有文档仍然将其称为改变环境的标准方法。事实上,就我而言,WSGIPath 似乎是由我使用的保存配置设置的,但它根本没有出现在我使用 eb config 时看到的本地文件中。
        • @Kylotan 我实际上的意思是 eb config 应该让您直接访问 AWS 服务器上存在的配置文件。该命令实际上并没有在本地保存一个。我错了,因为我错误地说它会提取文件。
        • eb config get <whatever> 将下载该已保存配置的配置文件。它没有提到那里的 WSGIPath。但是,当您使用这些保存的配置时,它会以某种方式覆盖或知道忽略您在 .ebextensions/*.config 文件中的内容。
        • @kylotan eb config 将向您展示所有设置。 eb config save 将创建一个新的已保存配置,仅显示在 api 级别设置的设置。这意味着,如果它不在您保存的配置中,它不会覆盖您的 ebextensions。
        • 我发现令人困惑的@davetw12 我可以建议更新您的答案。这不适用于本地设置,稍后可以在其他地方重新部署,因此您无法以这种方式进行可重复的构建
        【解决方案5】:

        WSGI 配置对我来说很痛苦。我确实使用eb config 命令更改了 WSCI 设置,但它不起作用。您可以在下面通过 5 个简单的步骤解决此问题。

        1- 将app.py 函数移动到目录的根目录(我在其中运行了eb init 命令。

        2- 也将 app.py 重命名为 application.py 并在该初始化应用程序中重命名为 application = Flask(__name__) 而不是 app = Flask(__name__)

        3- eb deploy 在此之后没有工作(在同一个项目中)我尝试使用 eb config 修复配置,但它太麻烦了,无法解决。从您的项目中删除所有 .extensions、.gitignore 等。

        4- 在 EB 上使用 eb init 重新初始化您的项目并按照提示操作。部署完成后,eb open 将启动您的 web 应用程序(希望如此!)

        【讨论】:

          【解决方案6】:

          当我遇到这个问题时,是因为我正在使用 GUI 上传项目文件的 zip。最初我是压缩项目级目录并将该压缩文件上传到 EB。

          然后我切换到简单地上传项目文件的 zip 文件 - 即选择所有文件并将它们发送到 zip 文件 - 然后 GUI 上传实用程序能够毫无问题地找到我的 application.py 文件,因为 application.py 文件没有问题。 py 文件不在子文件夹中。

          【讨论】:

            【解决方案7】:

            好吧,就我而言,我遵循了整个过程和约定,但仍然得到 404。问题是我的虚拟环境。我在我的 .gitignore 中忽略了所有与环境配置相关的文件夹/文件,但在 .ebignore 中没有。 在创建 .ebignore 并忽略所有与项目代码无关的文件夹/文件后,修复了该问题。

            【讨论】:

            • 哪些文件有问题?我现在正在为此苦苦挣扎。
            • 抱歉回复晚了;我正在使用所有与 python 环境配置相关的文件/文件夹(pyvenv.cfg、Scripts、Lib)部署我的代码,这不是必需的。 EB 自己进行环境设置。
            猜你喜欢
            • 2014-11-29
            • 2020-11-25
            • 2018-03-26
            • 2013-11-20
            • 2020-08-20
            • 2018-07-25
            • 1970-01-01
            • 2017-01-13
            • 2016-02-26
            相关资源
            最近更新 更多