从Codepipeline更新后台服务的ECS任务定义-没有负载均衡器



简介

我正在亚马逊ECS上部署一个Django应用程序,使用Celery执行后台任务,我们使用CodePipeline执行CI/CD。我希望能够将其拆分为三个ECS服务,每个服务只运行一个任务,这样它们就可以独立扩展。事实证明,在满足两个关键设计目标的同时,这很难做到:

  1. 更改的持续交付-必须自动化
  2. 基础结构更改必须作为代码进行管理

因此,从根本上讲,ECS任务定义的更新需要在git中进行版本控制,并作为自动发布过程的一部分进行更新,当它们发生变化时,需要更新使用它们的服务。

对于接受流量的服务来说,这一切都很好。问题出在ECS上执行后台任务的那些服务上。在那里,我遇到了一个障碍:

  • CodeDeploy部署组坚持与负载均衡器相关联,并且
  • 任何处理更新任务定义的部署提供程序都需要部署组。
    • 我认为这仅限于";CodeDeploy";以及";ECS蓝/绿";供应商
  • 我的";调度器";或";工人;服务接受流量

所以,归根结底是:我可以做什么样的部署,不需要负载均衡器,但仍然允许我作为部署的一部分更新任务定义?

详细信息

现在,为了给你更多的细节,我想要的服务列表是:

  • "web";服务-运行Django,暴露于8000端口上的ALB
  • "调度器";服务-运行Celery";节拍";,无暴露端口
  • "工人;服务-运行Celery工作程序,没有暴露的端口

对于";web";服务,CI/CD很简单,我们有一个CodeDeploy应用程序,它有一个与应用程序负载均衡器相关联的部署组,并具有正确的目标组,这会产生"错误";蓝色/绿色";部署。

我们已经构建了一些自定义工具,为每个服务生成一个替换taskdef.jsonappspec.yml。这些工具在我们的管道的构建阶段被调用,并且(对于"web"服务(在部署时被应用;这样,对应用程序环境和资源的更新也可以在代码中进行管理。

流程如下:

  1. 构建新的docker容器
  2. 从源模板生成新的taskdef.json-通过查询CloudFormation堆栈填写资源ID(机密等(
  3. 生成新的appspec.yml,任务定义的修订号增加1
  4. CodeDeploy基于新的AppSpec和TaskDef(从上一步构建工件(创建应用程序的新修订版,并在集群上部署更新的服务

这对于";web";服务,我想为其他两个服务提供类似的东西,但我找不到任何一种方法:没有部署组,但仍然更新任务定义;或者有一个部署组但没有负载均衡器(因为没有要进行负载平衡的流量(。

这有什么诀窍吗?或者我错过了一种针对后台服务的部署类型?

如果你能给我任何建议,我将不胜感激。谢谢

对于子孙后代来说,我最终得到的答案是创建一个lambda,专门用于重新部署celebeat和workers的ECS服务。然后让CodePipeline使用蓝色/绿色部署部署Web服务,然后调用lambda两次(并行(:一次用于调度程序服务,一次用于辅助服务。

没有任何内置部署类型对实现这一点有任何帮助。

最新更新