amazon-web-services - 如何保持最后 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 版本处于活动状态,这样如果出现问题,我总是可以通过控制台手动回滚。
我怎样才能做到这一点?
解决方案
Terraform 目前不允许这样做,它的资源生命周期模型意味着当您替换某些东西(任务定义是不可变的)时,Terraform 必须创建一个新的并销毁旧的。
使用 ECS 任务定义也不能真正被销毁,而是被标记为非活动状态,因为当前部署的任务可能正在使用它,直到它们被服务更新为新的任务定义。
有 2 种常用方法来处理此问题,并且需要能够回滚到任务定义的先前版本。
第一个是根本不使用 Terraform 来管理超出初始创建的任务定义,而是使用 AWS ECS CLI 工具之类的工具来执行此操作。
我使用的另一个选项是让我的 CI(在我们的例子中是 Gitlab CI)生成一个标记有要部署的应用程序的提交 SHA 的 Docker 映像,然后 Terraform 将任务定义更新为新的提交 SHA标记图像apply
以及使用新的任务定义 ARN 更新 ECS 服务。
当我们想要回滚时,我们使用 CI 的能力来回滚到不同的提交,只使用旧的提交 SHA 启动部署作业,然后部署旧的镜像。
这使得 Terraform 对正在部署的内容非常不可知,并使 CI 系统负责部署所需的版本,该版本通常是最新的,但如果我们手动单击部署,则有时需要特定的提交,当然回滚时目标是以前的版本。
这确实意味着您不能通过 AWS 控制台启动回滚,但我实际上喜欢这样,因为我希望 CI 系统成为随时部署的事实的来源。
推荐阅读
- scala - Spark dataframe cast column for Kudu compatibility
- pentaho-data-integration - In Pentaho Data Integration can I output conditionally?
- excel - 如何使变量从单个单元格中获取多个值并将其用作自动过滤条件
- android - Jenkins:Gradle 构建:AAPT2 问题:AAPT2 aapt2-3.4.0-5326820-windows 守护进程 #0:守护进程启动失败
- java - 用于匹配数学表达式的正则表达式
- python - 使用 Pandas 合并 csv 文件中的数据
- php - 如何使用codeigniter中的引物键从子表中获取图像
- testing - TFS 2017 测试任务版本 2 无法获得功能标志警告
- php - 如何使用 PHP 连接从 Dropzone.js 上传的分块文件?
- pandas - 使用 numPy datetime64 处理 pandas Dataframe 列中的日期的异常