简介
我正在亚马逊ECS上部署一个Django应用程序,使用Celery执行后台任务,我们使用CodePipeline执行CI/CD。我希望能够将其拆分为三个ECS服务,每个服务只运行一个任务,这样它们就可以独立扩展。事实证明,在满足两个关键设计目标的同时,这很难做到:
- 更改的持续交付-必须自动化
- 基础结构更改必须作为代码进行管理
因此,从根本上讲,ECS任务定义的更新需要在git中进行版本控制,并作为自动发布过程的一部分进行更新,当它们发生变化时,需要更新使用它们的服务。
对于接受流量的服务来说,这一切都很好。问题出在ECS上执行后台任务的那些服务上。在那里,我遇到了一个障碍:
- CodeDeploy部署组坚持与负载均衡器相关联,并且
- 任何处理更新任务定义的部署提供程序都需要部署组。
- 我认为这仅限于";CodeDeploy";以及";ECS蓝/绿";供应商
- 我的";调度器";或";工人;服务接受流量
所以,归根结底是:我可以做什么样的部署,不需要负载均衡器,但仍然允许我作为部署的一部分更新任务定义?
详细信息
现在,为了给你更多的细节,我想要的服务列表是:
- "web";服务-运行Django,暴露于8000端口上的ALB
- "调度器";服务-运行Celery";节拍";,无暴露端口
- "工人;服务-运行Celery工作程序,没有暴露的端口
对于";web";服务,CI/CD很简单,我们有一个CodeDeploy应用程序,它有一个与应用程序负载均衡器相关联的部署组,并具有正确的目标组,这会产生"错误";蓝色/绿色";部署。
我们已经构建了一些自定义工具,为每个服务生成一个替换taskdef.json
和appspec.yml
。这些工具在我们的管道的构建阶段被调用,并且(对于"web"服务(在部署时被应用;这样,对应用程序环境和资源的更新也可以在代码中进行管理。
流程如下:
- 构建新的docker容器
- 从源模板生成新的
taskdef.json
-通过查询CloudFormation堆栈填写资源ID(机密等( - 生成新的
appspec.yml
,任务定义的修订号增加1 - CodeDeploy基于新的AppSpec和TaskDef(从上一步构建工件(创建应用程序的新修订版,并在集群上部署更新的服务
这对于";web";服务,我想为其他两个服务提供类似的东西,但我找不到任何一种方法:没有部署组,但仍然更新任务定义;或者有一个部署组但没有负载均衡器(因为没有要进行负载平衡的流量(。
这有什么诀窍吗?或者我错过了一种针对后台服务的部署类型?
如果你能给我任何建议,我将不胜感激。谢谢
对于子孙后代来说,我最终得到的答案是创建一个lambda,专门用于重新部署celebeat和workers的ECS服务。然后让CodePipeline使用蓝色/绿色部署部署Web服务,然后调用lambda两次(并行(:一次用于调度程序服务,一次用于辅助服务。
没有任何内置部署类型对实现这一点有任何帮助。