如何在AWS弹性beanstalk上部署结构化Flask应用程序

时间:2013-12-13 03:49:31

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

使用此处列出的步骤成功部署测试应用后: 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包含我的网址映射。

我已尝试在根目录以及eb模块和myApp中初始化git aws.push实例,但我在AWS信息中心上收到以下错误: ERROR Your WSGIPath refers to a file that does not exist.并且应用程序不起作用(任何路径为404)。

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

7 个答案:

答案 0 :(得分:11)

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

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

<强>更新

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

答案 1 :(得分:11)

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

  1. 更新我的manage.py以创建名称应用程序的对象,而不是应用程序

    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/" 
    
  3. 这让Elastic Beanstalk正确地找到了可调用的应用程序。

    我们在the official docs进行了简要介绍,并对in this blog post

    进行了详细介绍

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

    • ProjectRoot
      • .ebextensions
        • application.config
      • 应用
          • forms.py
          • views.py
      • 静态
      • 模板
      • 测试
      • manage.py
      • requirements.txt
      • config.py
      • 等等

答案 2 :(得分:5)

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

答案 3 :(得分:4)

  

您的WSGIPath是指不存在的文件。

出现此错误是因为默认情况下,Beanstalk会查找application.py。在Beanstalk网页用户界面检查,Configuration > Software ConfigurationWSGIPath已映射到application.py

WSGIPath is set by default to application.py. Set to manage.py.

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

答案 4 :(得分:1)

WSGI配置对我来说很痛苦。我确实使用 //$scope.selectedDevices = []; vm.selectedDevices = []; //$scope.selected = function(device) { vm.selected = function(device) { if (device.checked) { //$scope.selectedDevices.push(device); vm.selectedDevices.push(device); } //........ 命令更改了WSCI设置,但它没有用。您可以通过以下5个简单步骤解决此问题。

1-将eb config函数移动到目录的根目录(我运行app.py命令的位置。

2-同时将eb init重命名为app.py,并将该已启动的应用程序重命名为application.py而不是application = Flask(__name__)

3- app = Flask(__name__)在此之后没有工作(在同一个项目中)我尝试使用eb deploy来修复配置,但它太毛茸茸而无法解决它。从项目中删除所有.extensions,.gitignore等。

4-使用eb config在EB上初始化您的项目并按照提示操作。部署完成后,eb init将启动您的webapp(希望!)

答案 5 :(得分:1)

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

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

答案 6 :(得分:0)

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