将相同应用程序/代码部署到Elastic Beanstalk服务器和工作人员环境的正确方法是什么?

Ian*_*Ian 5 python amazon-web-services celery amazon-elastic-beanstalk

因此,我有一个Web服务(烧瓶+ MySQL + celery),并且我试图找出在Elastic Beanstalk上将其部署到单独的Web Server和Worker环境/层中的正确方法。我目前通过在与Web服务器相同的实例上启动工作程序(使用此答案)来使其工作,但是显然我希望工作程序在单独的自动缩放环境中运行。请注意,芹菜任务依赖于主服务器代码(例如,进行查询等),因此它们不能分开。本质上,这是一个具有两个入口点的应用程序。

我能想到的唯一方法是让代码/配置脚本检查一些env变量(例如ENV_TYPE =“ worker”或“ server”)以确定是否启动标准flask应用程序或celery worker。这里的另一个警告是,当我希望/期望它们同时部署时,因为它们都使用相同的代码库,因此我将不得不“ eb部署”我的代码到两个单独的环境(服务器和工作器)。

抱歉,是否曾有人问过这个问题,但我环顾四周,却找不到任何东西,我感到惊讶,因为这似乎是一个普通的用例。

编辑:刚刚找到了这个答案,这解决了我对两次部署的担忧(我想从技术上讲,一次部署,然后更新两个环境,可以轻松编写脚本)。但是,关于如何将应用程序引导到服务器与工作人员模式的问题仍然存在。

Jos*_*vis 4

关于引导,如果您为 Elastic Beanstalk 环境设置了一个环境变量(此处的文档),那么当您使用脚本重新部署代码时,您永远不必再次触及它。如果创建新环境,只需要添加环境变量即可。

因此,在启动时,您只需在 Python 中检查该 ENV 变量,然后从那里引导并加载您需要的内容。

我的偏好是不通过指定“worker”或“server”来创建枚举,只需为 env 变量执行布尔值之类的操作即可ENV_WORKER=1。它将消除打字错误的可能性并且更易于阅读。

if os.environ.get('ENV_WORKER') is not None:
    # Bootstrap worker stuff here
else:
    # Specific stuff for server here
Run Code Online (Sandbox Code Playgroud)