Terraform嵌套循环创建AWS Glue Workflow资源报错排查
解决Terraform嵌套循环创建AWS Glue Workflow触发器的问题
错误原因分析
你当前代码中使用toset(local.my_map)将对象列表转为集合后,each.key变成了对象的字符串化表示,而非原对象,导致element函数无法从字符串中提取元素,最终触发报错。要实现嵌套遍历并创建触发器,需要先扁平化所有需要的触发关系,再通过for_each遍历处理。
修正方案
1. 重构本地变量,生成扁平化的触发关系
修改locals块,将启动job到各flow首job的触发、flow内部job链的触发全部整理为一维的触发规则集合:
locals { workflow_name = "my_example" first_job = "Job_start" my_map = [ { flow = ["JOB-A1", "JOB-A2", "JOB-A3"] }, { flow = ["JOB-B1", "JOB-B2", "JOB-B3"] } ] # 生成从启动job到每个flow首个job的触发规则 start_triggers = [ for flow in local.my_map : { trigger_name = "trigger-start-to-${lower(replace(flow.flow[0], "_", "-"))}" predicate_job = replace(lower(local.first_job), "_", "-") action_job = replace(lower(flow.flow[0]), "_", "-") } ] # 生成每个flow内部相邻job的触发规则,并用flatten转为一维列表 inner_triggers = flatten([ for flow in local.my_map : [ for i in range(length(flow.flow) - 1) : { trigger_name = "trigger-${lower(replace(flow.flow[i], "_", "-"))}-to-${lower(replace(flow.flow[i+1], "_", "-"))}" predicate_job = replace(lower(flow.flow[i]), "_", "-") action_job = replace(lower(flow.flow[i+1]), "_", "-") } ] ]) # 合并所有触发规则 all_triggers = concat(local.start_triggers, local.inner_triggers) # 转为map格式,用唯一的trigger_name作为key,适配for_each要求 triggers_map = { for t in local.all_triggers : t.trigger_name => t } }
2. 修改触发器资源定义
基于扁平化的triggers_map创建触发器,代码更简洁且避免索引错误:
resource "aws_glue_trigger" "this" { for_each = local.triggers_map name = each.key type = "CONDITIONAL" workflow_name = aws_glue_workflow.example.name predicate { conditions { job_name = each.value.predicate_job state = "SUCCEEDED" } } actions { job_name = each.value.action_job } }
效果说明
执行terraform plan后,会生成以下触发器:
trigger-start-to-job-a1:启动job触发JOB-A1trigger-start-to-job-b1:启动job触发JOB-B1trigger-job-a1-to-job-a2:JOB-A1触发JOB-A2trigger-job-a2-to-job-a3:JOB-A2触发JOB-A3trigger-job-b1-to-job-b2:JOB-B1触发JOB-B2trigger-job-b2-to-job-b3:JOB-B2触发JOB-B3
内容的提问来源于stack exchange,提问作者Alberto.Garau
相关产品推荐
相关产品推荐

