使用count参数时如何解决Terraform template_file渲染报错问题
Terraform批量渲染Step Function模板报错解决方案
根因说明
报错本质是独立的data "template_file"资源在Plan阶段需要确定所有实例的入参,而module.ecs.*.task_definition为Apply后才会生成的属性,同时如果count的长度值依赖Apply后属性,也会触发Plan阶段的校验失败。
可行修改方案
第一步:替换弃用的template_file数据源
data "template_file"已经被Terraform官方标记为弃用,直接使用内置的templatefile()函数完成模板渲染,消除额外的数据源依赖层级。
第二步:内联渲染逻辑到Step Function模块
将模板渲染逻辑直接写在step_function模块的definition_file参数中,避免跨资源的未知值提前校验。
修改后代码如下:
module "step_function" { count = length(var.task_container_command) source = "path" region = var.region name = "${var.step_function_name}-${count.index}" definition_file = templatefile("./configs/file.json", { task = module.ecs[count.index].task_definition }) }
补充:如果var.task_container_command长度Plan阶段未知
如果var.task_container_command本身依赖其他Apply后才生成的资源,导致length(var.task_container_command)在Plan阶段无法确定,将count替换为for_each,配套ECS模块同步修改为for_each即可,示例如下:
# 先将var.task_container_command转换为可作为for_each索引的集合类型 locals { task_command_set = toset(var.task_container_command) } # 配套ECS模块同步修改为for_each module "ecs" { for_each = local.task_command_set # 其他ECS模块原有参数不变 } module "step_function" { for_each = local.task_command_set source = "path" region = var.region name = "${var.step_function_name}-${each.key}" definition_file = templatefile("./configs/file.json", { task = module.ecs[each.key].task_definition }) }
验证
修改完成后直接执行terraform plan即可正常生成执行计划,不会触发原有报错。
内容的提问来源于stack exchange,提问作者Alex
相关产品推荐
相关产品推荐

