将使用 Celery 和 Redis 的 Flask 应用程序直接部署到 AWS:Elastic Beanstalk 或 EC2?

Deploying Flask app that uses Celery and Redis to AWS: Elastic Beanstalk or EC2 directly?

我是 Web 开发的新手,我写了一个小 Flask API,它使用 Celery 作为消息队列,使用 Redis 作为代理。我在本地机器上用 redis-server 启动 redis,用 celery -A application.celery worker --loglevel=info 启动 Celery,应用程序运行没有问题。

但是我无法让它在 AWS 上运行。现在我正在按照 docs 部署应用程序,但是当我尝试向我的 API 发送请求时,我收到内部服务器错误,这可能与 Redis 和 Celery 无法正常工作有关。我通过 SSH 进入了 EC2 实例,但由于我是新手,无法找到使应用程序正常运行的方法。

我的问题是:

1) 将我的应用程序、Redis 和 Celery 部署到 AWS 后,我该怎么做才能启动它? Elastic Beanstalk 是自动执行还是我需要做一些事情?

2) 我在哪里可以找到我的应用程序文件?我想我需要从 requirements.txt 手动安装所有要求,并在 EC2 实例中设置 virtualenv,对吗?

3) 如果我在 virtualenv 中设置和安装所有需求,它们会在 EC2 实例发生变化时保持不变吗? Elastic Beanstalk 的命令行工具自动部署应用程序并创建负载均衡器和 Auto Scaling 组。当创建新实例时,我通过 SSH 进行的安装是否可用,还是我需要每次都手动执行,还是有其他方法?

4) 我听到有人说创建 EC2 实例并手动部署比使用 Elastic Beanstalk 更好。 Elastic Beanstalk 为我做了什么?使用 Elastic Beanstalk 还是手动部署更好?

感谢您的帮助!

在过去的一周里,我一直在尝试做同样的事情,所以我想我应该分享我学到的一切。虽然这些答案流传了大约 Whosebug/google,但我还是可以提供帮助。

1) 要获得一个 flask 应用程序 运行 很容易,您可以使用 elastic beanstalk CLI。一般按照 AWS 文档 here, it's fairly straightforward. In terms of Redis/Celery, you start to get multiple things going on. Before you do your initial deploy, you'll probably want to setup the celery worker, you can use this Whosebug answer on how to setup celery as a daemon 即可。请务必阅读脚本,您需要正确设置应用程序名称。当您通过 EBS 部署到生产环境时需要注意的是,您的应用程序将由 apache 托管,这意味着如果您通过 "some_task.delay" 调用您的任务,将会发生一些奇怪的事情,因为 celery 应用程序的名称将是未知的。据我所知,正确解决此问题的唯一方法是使用:

my_celery_object.send_task("flask_application_name.the_task", [param1, param2], ...)

任何需要调用任务的地方。

您现在可以准备您的 redis 缓存。您可以使用任何东西,为此我假设您想要使用 AWS ElasticCache (EC)。转到 EC,您需要部署一个缓存集群,其中包含您想要的任意多个节点。部署后,您将在 "Cache Clusters" 下的列表中看到它。接下来,单击 table 中的 "X node" link,您需要将端点 url(和端口!)复制到您可以了解的芹菜应用程序here.

现在您已准备好部署所有内容,听到我之前提到的安全问题会导致您的应用程序在任何任务请求上失败,因为弹性缓存集群将是错误的一部分,您会很难过安全组最初。继续部署,这将创建您需要的安全组以及您的应用程序和其他所有内容。然后,您可以在 EC2 仪表板下的 Network & Security -> Security Groups 下找到该安全组。组的名称应该是您的环境的名称,例如 "myapp-env" 是默认的。现在修改入站规则并添加自定义 TCP 规则,将端口号设置为您的 Redis 端口,将源设置为 "Anywhere",保存。此时,记下组名并转到您的弹性缓存。点击左侧的Cach Clusters,为app修改CACHE CLUSTER(不是节点),更新VPC安全组为刚才记下的并保存。

现在 celery 将自动连接到 redis 缓存,因为它会持续尝试建立连接一段时间。否则你可以随时重新部署。

希望您现在有一个使用 Redis 的 Flask/Celery 应用程序。

2) 您不需要知道您的应用程序文件在 EBS EC2 实例上的位置,因为它会自动使用虚拟环境并且 requirements.txt 假设您遵循了 instructions found here。但是,在撰写本文时,您始终可以通过 ssh 连接到您的 EC2 实例,在以下位置找到您的应用程序文件:

/opt/python/current/app

3) 不明白你的意思 "If I setup and install all the requirements in a virtualenv, will they persist if the EC2 instance changes?" 正如我之前所说,如果你按照如何为 flask 部署 EBS 环境的说明进行操作,那么部署的新实例将自动更新它们的环境基于您的 requirements.txt

4) 这个见仁见智吧。我肯定听说过不使用 EBS 可能是更好的方法,我个人对此没有意见,因为我只使用过 EBS。有一些严重的斗争(包括尝试设置此应用程序)。我听说有些人所做的是通过 EBS 进行部署,这样他们就可以获得预先配置并准备好运行的 EC2 机器,然后从该机器创建 AMI,拆除 EBS,然后使用 AMI 创建 EC2。不管你走哪条路,如果你打算有一个数据库支持的服务器,我已经了解到(艰难的方式)你不应该让 EBS 自动附加 RDS。这是因为 RDS 随后与 EBS 应用程序相关联,因此如果您必须更换资源、终止它等,您将丢失 RDS(当然您可以解决这个问题,这只是一个痛苦就是一切。