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

Posted

技术标签:

【中文标题】将相同的应用程序/代码部署到 Elastic Beanstalk 服务器和工作程序环境的正确方法是啥?【英文标题】:What is the proper way to deploy the same application/code to Elastic Beanstalk server and worker environments?将相同的应用程序/代码部署到 Elastic Beanstalk 服务器和工作程序环境的正确方法是什么? 【发布时间】:2015-01-30 14:30:29 【问题描述】:

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

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

抱歉,如果之前有人问过这个问题,但我环顾四周,找不到任何东西,这让我感到惊讶,因为这似乎是一个常见的用例。

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

【问题讨论】:

您最终是如何进行部署的?同时部署到两个环境?您是否为 Celery 工作人员使用了 Web 服务器或工作人员? 我不喜欢这个解决方案变得多么老套,而且我的应用程序的性能要求现在非常低,所以我只是继续在主要流程旁边运行工作人员。抱歉,我知道这可能没有帮助 【参考方案1】:

关于引导,如果您为 Elastic Beanstalk 环境 (docs here) 设置了一个环境变量,那么当您使用脚本重新部署代码时,您将无需再次接触它。新建环境只需要添加环境变量即可。

因此,在启动时,您只需在 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

【讨论】:

好的,谢谢,我就是这么想的。只是想确保这是最佳做法。

以上是关于将相同的应用程序/代码部署到 Elastic Beanstalk 服务器和工作程序环境的正确方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章

将应用程序部署到 AWS Elastic Beanstalk 环境

Elastic Beanstalk 未部署在所有实例上

将 PHP 应用程序部署到 Elastic Beanstalk 时出现问题

PHP AWS Elastic Beanstalk 后台工作者

ImportError - 将 Falcon 应用程序部署到 AWS Elastic Beanstalk

Elastic Beanstalk 上的 Tomcat 部署:无法访问该站点