Terraform:如何基于字符串Map添加条件块,以Map键为参数名
解决Terraform动态生成Databricks Pipeline AWS属性块的问题
问题根源
你当前的代码有两个关键错误:
- dynamic块的for_each逻辑错误:Databricks Pipeline的
cluster下仅允许存在一个aws_attributes嵌套块,但你把for_each设为var.aws_attributes(一个map),会导致Terraform尝试生成多个aws_attributes块,同时参数名的写法不符合动态参数要求。 - 动态参数写法错误:直接写
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
相关产品推荐
相关产品推荐

