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

标签 amazon-web-services amazon-ec2 flask redis celery

我是Web开发的新手,我编写了一个小的Flask API,该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的命令行工具自动部署了应用程序,并创建了Load Balancer和Auto Scaling Group。创建新实例后,通过SSH进行的安装是否可用,还是需要每次手动进行安装,或者还有其他方法吗?

4)我听说有人说创建EC2实例并手动部署比使用Elastic Beanstalk更好。 Elastic Beanstalk对我有什么作用?如果我使用Elastic Beanstalk或手动部署会更好吗?

谢谢你的帮助!

最佳答案

在过去的一周里,我一直在尝试做完全相同的事情,所以我以为我会分享我学到的一切。尽管这些答案是关于stackoverflow / google的,但我可以全部帮助。

1)要轻松运行flask应用程序,可以使用 flex beanstalk CLI。通常,只需遵循AWS文档here,这非常简单。在Redis / Celery方面,您开始经历了很多事情。在进行初始部署之前,您可能需要设置celery worker,可以使用this stackoverflow 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

所以,现在你把一切都准备部署,你会伤心地听到我前面提到的安全东西会导致应用程序失败的任何任务请求作为 flex 缓存集群将是错误的安全组的一部分开始。继续进行部署,这将创建您所需的安全组以及您的应用程序和其他所有内容。然后,您可以在EC2仪表板下的“网络和安全性”->“安全性组”下找到该安全性组。该组的名称应为您的环境的名称,默认名称为“myapp-env”。现在,修改入站规则,并添加自定义TCP规则,将端口号设置为redis端口,将源设置为“Anywhere”,保存。此时,记下组名称并转到 flex 缓存。单击左侧的Cach群集,修改应用程序的CACHE CLUSTER(而不是节点),然后将VPC安全组更新为刚记下并保存的组。

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

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

2)您不需要知道应用程序文件在EBS EC2实例上的位置,因为假定您遵循instructions found here,它将自动使用虚拟环境和requirements.txt。但是,在撰写本文时,您始终可以在以下位置找到应用程序文件来SSH到EC2实例:
/opt/python/current/app
3)我不知道您的意思是“如果我在virtualenv中设置并安装所有需求,如果EC2实例发生更改,这些需求是否还会持续?”如前所述,如果您遵循有关如何为flask部署EBS环境的说明,则部署的新实例将根据您的需求自动更新其环境。

4)这是一个见解。我肯定听说过不使用EBS可能是更好的方法,我个人对此没有意见,因为我仅使用过EBS。进行了一些艰苦的努力(包括尝试设置此应用程序)。我听到有人做的是通过EBS进行部署,以便他们可以进行预配置并准备好运行EC2机器,然后从该机器上制作AMI,将EBS拆除,然后使用AMI制作EC2。无论走哪条路,如果您打算使用数据库支持的服务器,我都(很难)了解到,您不应该让EBS自动附加RDS。这是由于RDS然后与EBS应用程序相关联,因此,如果您必须替换资源,终止资源等,则会丢失RDS(当然,您可以解决此问题,这只是一个痛苦是全部)。

关于amazon-web-services - 将使用Celery和Redis的Flask应用程序部署到AWS:直接使用Elastic Beanstalk还是EC2?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30424167/

相关文章:

python - AWS Glue 转换

javascript - Node.js 堆溢出错误

amazon-web-services - AWS CloudFormation YAML - 引用在同一堆栈中创建的实例的私有(private) IP 以写入配置文件

python - 使用 root 权限部署 Flask 应用程序

iphone - Amazon DynamoDB ProvisionedThroughputExceededException (iOS 开发工具包)

python-3.x - AWS Lambda 无法找到 app.handler(自定义 Docker 镜像)

amazon-web-services - Pyspark 数据帧从一个存储桶读取并在同一作业中使用不同的 KMS key 写入另一个存储桶

amazon-web-services - S3 和 EMR 数据局部性

authentication - Flask 登录机制对每个 token 进行身份验证我的调用

html - Bootstrap 4 的水平列表在 4 项之后转到下一行