You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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-A1
  • trigger-start-to-job-b1:启动job触发JOB-B1
  • trigger-job-a1-to-job-a2:JOB-A1触发JOB-A2
  • trigger-job-a2-to-job-a3:JOB-A2触发JOB-A3
  • trigger-job-b1-to-job-b2:JOB-B1触发JOB-B2
  • trigger-job-b2-to-job-b3:JOB-B2触发JOB-B3

内容的提问来源于stack exchange,提问作者Alberto.Garau

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 10:55:21