首页 > 解决方案 > 如何保持最后 X 个 ECS 任务定义处于活动状态?

问题描述

我有以下 Terraform 代码来更新具有新任务定义的服务:

resource "aws_ecs_task_definition" "app_definition" {
  family = "my-family"

  container_definitions = "${data.template_file.task_definition.rendered}"
  network_mode          = "bridge"
}

resource "aws_ecs_service" "app_service" {
  name            = "my-service"
  cluster         = "my-cluster"
  task_definition = "${aws_ecs_task_definition.app_definition.arn}"
  desired_count   = "1"
  iam_role        = "my-iam-role"
}

更新我的服务时,我的任务定义的最新版本变为非活动状态。结果,在 ECS 控制台中尝试手动回滚到以前的版本时,我无法选择它:

Error: No active task definition found

理想情况下,我希望保持最新的 X 版本处于活动状态,这样如果出现问题,我总是可以通过控制台手动回滚。

我怎样才能做到这一点?

标签: amazon-web-servicesterraformamazon-ecs

解决方案


Terraform 目前不允许这样做,它的资源生命周期模型意味着当您替换某些东西(任务定义是不可变的)时,Terraform 必须创建一个新的并销毁旧的。

使用 ECS 任务定义也不能真正被销毁,而是被标记为非活动状态,因为当前部署的任务可能正在使用它,直到它们被服务更新为新的任务定义。

有 2 种常用方法来处理此问题,并且需要能够回滚到任务定义的先前版本。

第一个是根本不使用 Terraform 来管理超出初始创建的任务定义,而是使用 AWS ECS CLI 工具之类的工具来执行此操作。

我使用的另一个选项是让我的 CI(在我们的例子中是 Gitlab CI)生成一个标记有要部署的应用程序的提交 SHA 的 Docker 映像,然后 Terraform 将任务定义更新为新的提交 SHA标记图像apply以及使用新的任务定义 ARN 更新 ECS 服务。

当我们想要回滚时,我们使用 CI 的能力来回滚到不同的提交,只使用旧的提交 SHA 启动部署作业,然后部署旧的镜像。

这使得 Terraform 对正在部署的内容非常不可知,并使 CI 系统负责部署所需的版本,该版本通常是最新的,但如果我们手动单击部署,则有时需要特定的提交,当然回滚时目标是以前的版本。

这确实意味着您不能通过 AWS 控制台启动回滚,但我实际上喜欢这样,因为我希望 CI 系统成为随时部署的事实的来源。


推荐阅读