Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/amazon-web-services/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Amazon web services 如何保持最后一个X ECS任务定义处于活动状态?_Amazon Web Services_Terraform_Amazon Ecs - Fatal编程技术网

Amazon web services 如何保持最后一个X ECS任务定义处于活动状态?

Amazon web services 如何保持最后一个X ECS任务定义处于活动状态?,amazon-web-services,terraform,amazon-ecs,Amazon Web Services,Terraform,Amazon 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" "ap

我使用以下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修订处于活动状态,以便在出现问题时始终可以通过控制台手动回滚


我怎样才能做到这一点呢?

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

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

有两种常见的处理方法,需要能够回滚到任务定义的早期版本

第一种方法是不使用Terraform来管理初始创建之外的任务定义,而是使用类似于AWS ECS CLI工具的工具来实现这一点

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

当我们想要回滚时,我们使用CI的功能回滚到不同的提交,只启动带有旧提交SHA的部署作业,从而部署旧映像

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


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

一个非常简单的方法是连接到Terraform的生命周期:

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

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

  # make sure Terraform does not unregister the task definition
  lifecycle {
    prevent_destroy = true
  }
}

它可以防止旧任务定义的破坏,从而使所有任务定义保持活动状态。

您自己也尝试过吗?它不起作用:
*aws_ecs_task_definition.mydef:aws_ecs_task_definition.mydef:计划将销毁此资源,但它当前的lifecycle.prevent_destroy设置为true。若要避免此错误并继续执行计划,请禁用lifecycle.prevent\u销毁或使用-target标志调整计划的范围。
@red888我发现此解决方案有效,但并不总是有效-在一开始我运行时没有任何问题。在某些时候,我也犯了同样的错误。我很好奇这是什么原因造成的!