在Terraform中调用Data Sources时能否使用变量拼接资源名
Error: Invalid attribute name
on locals.tf line 21, in locals:
21: for n in data.terraform_remote_state.${var.stage}_vpc :
An attribute name is required after a dot.
报错原因
这个报错是HCL语法规则限制导致的:Terraform不支持在资源/数据源的属性访问符.后直接用${}插值语法拼接标识符,你写的data.terraform_remote_state.${var.stage}_vpc不符合语法要求。
解决方案
两种常用实现方案按需选择:
- 方案1:用
for_each批量声明数据源
适合需要同时管理多环境remote state的场景,声明时直接批量生成所有环境的数据源,后续用环境变量直接索引即可:
数据源声明示例:
data "terraform_remote_state" "vpc" { for_each = toset(["dev", "test", "prod"]) # 可替换为实际环境列表,也可通过变量传入 backend = "s3" # 替换为你实际使用的backend类型 config = { bucket = "terraform-state-${each.key}" key = "vpc/terraform.tfstate" region = "us-east-1" # 其余backend配置按实际情况填写 } }
引用方式:
locals { # 直接用环境变量索引对应环境的数据源 vpc_items = [for n in data.terraform_remote_state.vpc[var.stage].outputs.你的输出字段名 : n] }
- 方案2:构造映射表动态取值
适合已经单独声明了各环境数据源、不想修改原有声明的场景:
保留你原有各环境的数据源声明:
data "terraform_remote_state" "dev_vpc" { # 原dev环境配置 } data "terraform_remote_state" "prod_vpc" { # 原prod环境配置 } # 其余环境的数据源声明保留
先在locals中构造环境与数据源的映射表,再动态取值:
locals { vpc_state_map = { dev = data.terraform_remote_state.dev_vpc prod = data.terraform_remote_state.prod_vpc # 其余环境按格式补充 } # 用变量取值对应环境的数据源 vpc_items = [for n in local.vpc_state_map[var.stage].outputs.你的输出字段名 : n] }
内容的提问来源于stack exchange,提问作者Seun
相关产品推荐
相关产品推荐

