如何在Terraform中根据条件动态省略ECS服务的desired_count参数?
解决Terraform循环创建ECS服务时根据daemon状态省略desired_count的问题
问题说明
通过Terraform的count特性批量创建AWS ECS服务时,需要实现:当var.services中对应服务的daemon字段为true时,完全省略desired_count配置项(因DAEMON调度策略的ECS服务不允许设置该参数)。此前尝试将desired_count设为null未生效,需找到可行方案。
配置与原代码
JSON配置(var.services)
[ { "service-name" : "frontendapp", "daemon" : false }, { "service-name" : "backendapp", "daemon" : true } ]
原Terraform代码
resource "aws_ecs_service" "services" { count = length(var.services) name = "${var.services[count.index].service-name}" cluster = aws_ecs_cluster.my-ecs-cluster.id task_definition = aws_ecs_task_definition.my-task-definition.arn desired_count = 1 deployment_minimum_healthy_percent = 100 scheduling_strategy = var.services[count.index].daemon == true ? "DAEMON" : "REPLICA" }
解决方案
核心思路是利用Terraform 0.12+支持的属性值为null时自动忽略该参数的特性,结合条件表达式动态控制desired_count的赋值:
方案一:单资源动态赋值(推荐)
修改后的Terraform代码:
resource "aws_ecs_service" "services" { count = length(var.services) name = var.services[count.index].service-name cluster = aws_ecs_cluster.my-ecs-cluster.id task_definition = aws_ecs_task_definition.my-task-definition.arn # 仅当daemon为false时设置desired_count为1,为true时设为null(自动省略该参数) desired_count = var.services[count.index].daemon ? null : 1 deployment_minimum_healthy_percent = 100 scheduling_strategy = var.services[count.index].daemon ? "DAEMON" : "REPLICA" }
关键说明
- 确保使用Terraform 0.12及以上版本,旧版本不支持通过null忽略资源属性。
- 当
daemon为true时,desired_count被设为null,Terraform会自动跳过该参数的设置,符合DAEMON调度策略的ECS服务要求。 - 当
daemon为false时,正常设置desired_count = 1,满足REPLICA调度策略的配置需求。
方案二:拆分资源分别处理(兼容特殊场景)
如果方案一因版本或其他限制无效,可拆分资源为两个count块,分别处理DAEMON和REPLICA类型的服务:
# 创建REPLICA类型的ECS服务(daemon=false) resource "aws_ecs_service" "replica_services" { count = length([for s in var.services : s if !s.daemon]) name = [for s in var.services : s if !s.daemon][count.index].service-name cluster = aws_ecs_cluster.my-ecs-cluster.id task_definition = aws_ecs_task_definition.my-task-definition.arn desired_count = 1 deployment_minimum_healthy_percent = 100 scheduling_strategy = "REPLICA" } # 创建DAEMON类型的ECS服务(daemon=true) resource "aws_ecs_service" "daemon_services" { count = length([for s in var.services : s if s.daemon]) name = [for s in var.services : s if s.daemon][count.index].service-name cluster = aws_ecs_cluster.my-ecs-cluster.id task_definition = aws_ecs_task_definition.my-task-definition.arn deployment_minimum_healthy_percent = 100 scheduling_strategy = "DAEMON" }
内容的提问来源于stack exchange,提问作者Sean
相关产品推荐
相关产品推荐

