给出一个AWS Elastic-Beanstalk Worker框,是否可以使用Flask / port:80来提供来自相关SQS队列的消息?
在ELB工人内部,我看到了有关正在发生的事情的相互矛盾的信息。 ELB Worker Environment页显示:
Elastic Beanstalk通过管理Amazon SQS队列并在从您的队列中读取的每个实例上运行守护程序来简化此过程。守护程序从队列中提取项目时,它将本地的HTTP POST请求发送到端口80上的http://localhost/,其中正文中包含队列消息的内容。您的应用程序所需要做的就是执行长期运行的任务以响应POST。
这个SO问题Differences in Web-server versus Worker说:
我认为最重要的区别是工作层实例不运行Web服务器进程(apache,nginx等)。
基于此,我希望可以在端口80上运行Flask服务器,并且该服务器可以处理SQS消息。但是,该帖子显示不正确。甚至ELB-worker盒上都运行了Apache,显然是为了进行运行状况检查(当我停止它时,我的服务器变成红色)。当然,它使用的是端口80 ...
我已经在尝试移至ELB的EC2服务器上安装了Flask / Gunicorn,我想继续使用它-可能吗? (注意:队列守护进程仅将消息发布到端口80,无法更改...)
文档尚不清楚,但听起来他们希望您修改Apache以代理Flask,也许吗?我希望这不是唯一的方法。
或者,设置ELB-worker处理SQS消息的“正确”方法是什么?您应该如何“执行长期运行的任务”?
注意:现在,我已经更多地使用了ELB,并且对ELB有了很好的了解-让我明确指出,这不是不是亚马逊为其设计了ELB-workers,并且存在一些故障(将要指出)。基本上,标准用例是创建一个简单的Flask应用程序,并将其挂接到ELB-EC2服务器上,该服务器配置为使运行该Flask应用程序变得简单。
我的用例是,我已经有一个带有大型Flask应用程序的EC2服务器,该应用程序在gunicorn下运行,以及其他各种情况。我想使用该服务器(作为映像)来构建ELB服务器,并使其响应SQS队列消息。可能有更好的解决方案,例如只编写队列轮询守护程序,并且没有其他人会采用此选项,但是确实有……
答案 0 :(得分:0)
ELB工作程序通过侦听该队列的守护程序连接到SQS队列,并且(内部)将任何消息发布到http://localhost:80。 Apache正在监听端口80。这是为了处理运行状况检查,该检查由ELB管理器(或生态系统中的某些设备)完成。 Apache使用mod_wsgi将非健康检查请求传递给已上传的Flask应用,该应用位于:
/opt/python/current/app/application.py
我怀疑有可能但很难删除Apache并以其他方式(瓶)处理运行状况检查,从而释放端口80。但这足以使我认为不值得这样做。 / p>
因此,我发现的解决方案是更改本地守护程序发布到的端口-通过通过YAML配置文件对其进行重新配置,它将发布到运行Flask应用程序的端口5001。这意味着Apache可以继续处理端口80上的运行状况检查,而Flask可以处理来自守护程序的SQS消息。
您配置守护程序,然后停止/启动它(以根用户身份):
/etc/aws-sqsd.d/default.yaml
/opt/elasticbeanstalk/addons/sqsd/hooks/stop-sqsd.sh
/opt/elasticbeanstalk/addons/sqsd/hooks/start-sqsd.sh
/opt/elasticbeanstalk/addons/sqsd/hooks/restart-sqsd.sh
实际守护程序:
/opt/elasticbeanstalk/lib/ruby/bin/aws-sqsd
/opt/elasticbeanstalk/lib/ruby/lib/ruby/gems/2.2.0/gems/aws-sqsd-2.3/bin/aws-sqsd
毛刺: 如果您曾经使用ELB GUI配置守护程序选项,它将覆盖config-file,并且您将不得不重新编辑端口(并重新启动守护程序)。
注意:ELB生态系统或工作程序的所有HTTP通信都是内部的-因此可以关闭所有外部端口(我保持22个打开),例如端口80。否则,工作程序将关闭Apache回复了http://:80个帖子,这意味着它向世界公开。我认为服务器配置相当安全,但是端口80根本不需要打开,即可进行健康检查或其他任何操作。