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
相关产品推荐
相关产品推荐

