我是web开发的新手,我写了一个小的Flask API,使用芹菜作为消息队列和Redis作为代理。我用redis-server
启动redis,在本地机器上用celery -A application.celery worker --loglevel=info
启动芹菜,应用程序运行没有问题。
然而,我无法让它在AWS上工作。现在我正在部署以下文档的应用程序,但当我试图发送请求到我的API我得到内部服务器错误,这可能与Redis和芹菜不工作。我SSH到EC2实例,但因为我是新的,找不到做什么让应用程序工作。
我的问题是:
1)我该怎么做才能启动我的应用程序,Redis和芹菜部署到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更好,还是手动部署更好?
谢谢你的帮助!
在过去的一周里,我一直在尝试做同样的事情,所以我想我应该分享我学到的一切。虽然这些答案都是关于stackoverflow/google的,但是我还是可以帮助大家的。
1)要让flask应用运行起来很容易,你可以使用elastic beanstalk CLI。一般来说,只需遵循此处的AWS文档,它相当简单。在Redis/芹菜方面,你开始得到多个事情正在进行。在进行初始部署之前,您可能想要设置celery worker,您可以使用这个stackoverflow答案来了解如何将celery设置为守护进程。确保您阅读了脚本,您需要正确设置应用程序名称。当您通过EBS部署到生产环境时,需要注意的是您的应用程序将由apache托管,这意味着如果您通过"some_task.delay"调用任务,将会发生一些奇怪的事情,因为芹菜应用程序的名称将是未知的。据我所知,正确解决这个问题的唯一方法是使用:
my_celery_object.send_task("flask_application_name.the_task", [param1, param2], ...)
在需要调用任务的地方。
你现在可以准备你的redis缓存。您可以使用任何东西,为此我只假设您想使用AWS ElasticCache (EC)。在使用EC时,需要部署一个缓存集群,其中包含任意数量的节点。部署后,您将在"缓存集群"下的列表中看到它。接下来,单击表格中的"X node"链接,您需要将端点url(和端口!)复制到您的芹菜应用程序中,您可以在这里了解到。
那么,现在您已经准备好了部署的一切,您将会很遗憾地听到,我前面提到的安全性问题将导致您的应用程序在任何任务请求上失败,因为弹性缓存集群最初将属于错误的安全组。继续进行部署,这将创建你需要的安全组,以及你的应用程序和其他所有东西。然后,您可以在EC2仪表板下的网络下找到该安全组。安全->安全组。组的名称应该是您的环境的名称,例如"myapp-env"是默认的。现在修改入站规则,并添加自定义TCP规则,将端口号设置为redis端口,并将源设置为"Anywhere",保存。此时,注意组名并转到弹性缓存。单击左侧的"CACHE CLUSTER",修改应用对应的CACHE CLUSTER(不是节点),将VPC安全组更新为刚才记录并保存的安全组。
现在芹菜会自动连接到redis缓存,因为它会一直尝试连接一段时间。否则你可以随时重新部署。
希望你现在有一个使用redis的Flask/芹菜应用程序。
2)您不需要知道应用程序文件在EBS EC2实例上的位置,因为它会自动使用虚拟环境和requirements.txt(假设您遵循这里的说明)。但是,在编写本文时,您始终可以ssh到您的EC2实例:
找到您的应用程序文件 /opt/python/current/app
3)我不知道你的意思是"如果我在虚拟环境中设置和安装所有需求,如果EC2实例发生变化,它们会持续存在吗?"如前所述,如果按照说明部署flask的EBS环境,那么已部署的新实例将根据您的requirements.txt
自动更新它们的环境这是一个见仁见智的问题。我确实听说过不使用EBS可能是更好的方法,我个人对此没有意见,因为我只使用过EBS。有一些严重的斗争(包括试图设置这个应用程序)。我听说有些人通过EBS进行部署,这样他们就可以得到一台预配置的EC2机器,然后从那台机器上创建一个AMI,拆除EBS,然后用AMI创建一个EC2。无论您选择哪条路线,如果您计划使用一个数据库支持的服务器,我已经(通过艰难的方式)了解到您不应该让EBS自动附加RDS。这是由于RDS随后与EBS应用程序相关联,因此如果您必须替换资源、终止它等,那么您将失去RDS(当然您可以绕过这个问题,这只是一个痛苦的过程)。