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

Posted

技术标签:

【中文标题】将使用 Celery 和 Redis 的 Flask 应用程序部署到 AWS:直接使用 Elastic Beanstalk 还是 EC2?【英文标题】:Deploying Flask app that uses Celery and Redis to AWS: Elastic Beanstalk or EC2 directly? 【发布时间】:2015-08-06 02:21:00 【问题描述】:

我是 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 或手动部署会更好吗?

感谢您的帮助!

【问题讨论】:

【参考方案1】:

在过去的一周里,我一直在尝试做同样的事情,所以我想我会分享我学到的一切。尽管这些答案是关于 ***/google 的,但我仍然可以提供帮助。

1) 要让烧瓶应用程序运行起来很容易,您可以使用弹性 beanstalk CLI。通常,只需遵循 AWS 文档here,它相当简单。就 Redis/Celery 而言,你开始做很多事情。在进行初始部署之前,您可能需要设置 celery worker,您可以使用 this *** 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,您需要部署一个缓存集群,其中包含您想要的任意数量的节点。部署后,您将在“缓存集群”下的列表中看到它。接下来,单击表中的“X 节点”链接,您需要将端点 url(和端口!)复制到您的 celery 应用程序中,您可以了解here。

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

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

希望您现在拥有一个使用 redis 的功能正常的 Flask/Celery 应用程序。

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

/opt/python/current/app

3)我不知道您的意思是“如果我在 virtualenv 中设置和安装所有要求,如果 EC2 实例发生更改,它们会持续存在吗?”正如我之前所说,如果您按照有关如何为 Flask 部署 EBS 环境的说明进行操作,那么部署的新实例将根据您的要求自动更新其环境。txt

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

【讨论】:

以上是关于将使用 Celery 和 Redis 的 Flask 应用程序部署到 AWS:直接使用 Elastic Beanstalk 还是 EC2?的主要内容,如果未能解决你的问题,请参考以下文章

Celery、Redis 和 ConnectionPool

celery结合redis 使用

使用 Heroku 安装 Celery 和 Redis

Django+Celery+Redis 使用

如何限制 django 网站的 redis/celery 任务?

使用 Redis 作为 Celery 结果后端和消息代理 - 任务过期(对于存储在 redis 中的密钥)