如何保持最后的X ECS任务定义有效?

bit*_*ain 4 amazon-web-services amazon-ecs terraform

我有以下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"
}
Run Code Online (Sandbox Code Playgroud)

更新我的服务时,我的任务定义的上一个修订版本无效。结果,在尝试在ECS控制台中手动回滚到以前的版本时,无法选择它:

Error: No active task definition found
Run Code Online (Sandbox Code Playgroud)

理想情况下,我希望保持最近的X版本处于活动状态,以便在出现问题时始终可以通过控制台手动回滚。

我该如何实现?

yda*_*coR 5

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

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

有两种常见的处理方法,并且需要能够回滚到任务定义的先前版本。

第一个就是根本不使用Terraform来管理任务定义,而不仅仅是最初创建,而是使用类似AWS ECS CLI工具的工具来执行此任务。

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

当我们想回滚时,我们使用CI的能力回滚到另一个提交,仅使用旧的提交SHA启动部署作业,然后部署旧的映像。

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

这确实意味着您无法通过AWS控制台启动回滚,但是我实际上很喜欢这样做,因为我希望CI系统可以成为随时部署的真相的来源。