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

Terraform:如何基于字符串Map添加条件块,以Map键为参数名

解决Terraform动态生成Databricks Pipeline AWS属性块的问题

问题根源

你当前的代码有两个关键错误:

  1. dynamic块的for_each逻辑错误:Databricks Pipeline的cluster下仅允许存在一个aws_attributes嵌套块,但你把for_each设为var.aws_attributes(一个map),会导致Terraform尝试生成多个aws_attributes块,同时参数名的写法不符合动态参数要求。
  2. 动态参数写法错误:直接写key = value会被Terraform识别为字面量参数名"key",而非将map的键作为动态参数名。

正确实现代码

修改cluster内的dynamic "aws_attributes"块如下:

dynamic "aws_attributes" {
    # 仅当var.aws_attributes非空时创建该块
    for_each = length(var.aws_attributes) > 0 ? [var.aws_attributes] : []
    content {
        # 遍历map键值对,动态生成参数
        for k, v in aws_attributes.value :
        (k) => v
    }
}

代码说明

  • 控制块的创建:通过length(var.aws_attributes) > 0 ? [var.aws_attributes] : []判断,当map非空时返回包含该map的列表(确保只生成一个aws_attributes块);为空则返回空列表,不创建块。
  • 动态生成参数:(k) => v是Terraform的动态参数语法,这里的(k)会把map的键作为参数名,v作为对应的值,完美匹配你需要将map键值对转为块内参数的需求。

修正后的完整cluster块片段

dynamic "cluster" {
    for_each = var.dlt_jobs.cluster != null ? var.dlt_jobs.cluster : []
    content {
        label = "default"
        
        spark_conf = var.spark_conf
        
        dynamic "aws_attributes" {
            for_each = length(var.aws_attributes) > 0 ? [var.aws_attributes] : []
            content {
                for k, v in aws_attributes.value :
                (k) => v
            }
        }
        autoscale  {
            min_workers = 1
            max_workers = 5
            mode = "ENHANCED"
        }
        custom_tags = {
            cluster_type = "job_cluster"
        }
    }
}

内容的提问来源于stack exchange,提问作者network_slayer

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 17:12:54