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

Terraform报错each.value cannot be used in this context的解决咨询

解决Terraform中Confluent Connector动态创建的each.value错误

错误原因

你当前的问题是把for_each嵌套在了config_nonsensitive配置块内部,而for_each是Terraform资源级别的参数,只能定义在resource块的顶层,不能放在map结构里,这就导致each.value无法被识别,从而抛出错误。

修正后的配置代码

1. 调整Connector资源配置(connector.tf)

将for_each移到资源顶层,确保每个配置项对应一个独立的Connector资源:

resource "confluent_connector" "source" {
  # 资源顶层定义for_each,基于变量列表生成唯一键(用connector名称作为键保证唯一性)
  for_each = { for s in var.source_salesforce_connectors : s.source_salesforce_connector_name => s }

  environment {
    id = confluent_environment.staging.id
  }
  kafka_cluster {
    id = confluent_kafka_cluster.dedicated.id
  }

  config_sensitive = {
    "salesforce.password" : var.source_salesforce_password,
    "salesforce.password.token" : var.source_salesforce_password_token,
    "salesforce.consumer.key" : var.source_salesforce_consumer_key,
    "salesforce.consumer.secret" : var.source_salesforce_consumer_secret
  }

  config_nonsensitive = {
    "connector.class" : "SalesforceCdcSource",
    "kafka.auth.mode" : "KAFKA_API_KEY",
    "salesforce.cdc.name" : "AccountChangeEvent",
    "kafka.api.key" : confluent_api_key.app-manager-kafka-api-key.id,
    "kafka.api.secret" : confluent_api_key.app-manager-kafka-api-key.secret,
    "salesforce.instance" : var.source_salesforce_url,
    "salesforce.username" : var.source_salesforce_username,
    # 现在可以正常使用each.value,因为for_each在资源顶层生效
    "name" : each.value["source_salesforce_connector_name"],
    "kafka.topic" : each.value["source_salesforce_topic_name"],
    "output.data.format" : each.value["source_salesforce_data_format"], 
    "tasks.max" : each.value["source_salesforce_max_task"]
  }

  depends_on = [
    confluent_kafka_topic.topic
  ]

  lifecycle {
    prevent_destroy = false
  }
}

2. 优化变量定义(variable.tf)

修改变量名称使其更语义化,并补充完整默认字段避免缺失:

variable "source_salesforce_connectors" {
  type = list(map(string))
  default = [{
    "source_salesforce_connector_name" = "SalesforceCdcSourceConnector_0_TF"
    "source_salesforce_topic_name"      = "default-topic"
    "source_salesforce_data_format"     = "JSON"
    "source_salesforce_max_task"        = "1"
  }]
  description = "列表形式的Salesforce CDC源连接器配置,每个元素对应一个独立连接器"
}

3. 保持tfvars配置不变(DEV/DEV.tfvars)

只需确保变量名和上述定义一致即可:

source_salesforce_connectors = [
    {
        source_salesforce_connector_name  = "SalesforceCdcSourceConnector_1_TF"
        source_salesforce_topic_name      = "json-topic-1"
        source_salesforce_data_format     = "JSON"
        source_salesforce_max_task        = "1"
    },
    # 可添加更多连接器配置
    {
        source_salesforce_connector_name  = "SalesforceCdcSourceConnector_2_TF"
        source_salesforce_topic_name      = "avro-topic-2"
        source_salesforce_data_format     = "AVRO"
        source_salesforce_max_task        = "2"
    }
]

验证执行

运行原命令即可正常生成多Connector的执行计划:

terraform plan -var-file="DEV/DEV.tfvars"

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 08:30:42