使用Terraform模块在GCP创建VM出现Unsupported attribute错误
问题根因
- 拼写错误:你补充说明里提到的输出名存在笔误,你写的
vpc-netowrk拼写错误,正确的模块调用名是vpc-network,同时你输出定义的private_ip属性并不是子网资源的可用输出字段,完全不符合参数要求。 - 字段赋值逻辑错误:
google_compute_instance的network_interface块中,network参数需要传入VPC网络的名称,你当前填写的是子网名称,逻辑不匹配。subnetwork参数需要传入子网的名称或self_link,你传入的private_ip是私有IP地址字段,和子网标识符完全不是一类参数。
- 模块输出定义错误:你当前模块的output.tf输出的字段无法满足实例创建的参数需求。
修复方案
1. 修正模块内output.tf配置
在你的VPC模块目录下的output.tf中添加如下正确输出:
# 输出VPC网络名称 output "vpc_name" { value = google_compute_network.this.name } # 输出公共子网名称 output "public_subnet_name" { value = google_compute_subnetwork.this.name } # 输出私有子网名称 output "private_subnet_name" { value = google_compute_subnetwork.private.name }
如果你需要输出私有子网的CIDR等其他属性,可自行补充对应输出配置。
2. 修正根目录main.tf的实例配置
修改google_compute_instance资源的network_interface块:
network_interface { # 传入VPC网络名称,而非子网名称 network = module.vpc-network.vpc_name # 传入私有子网名称,而非IP地址 subnetwork = module.vpc-network.private_subnet_name access_config { // 不需要公网IP可直接删除该块 } # 如果你需要为实例指定固定私有IP,可添加如下参数,不要填到subnetwork字段中 # network_ip = "192.168.2.10" }
3. 校验所有拼写
确认所有模块名、输出名的拼写没有错误,避免出现netowrk这类手误导致的属性找不到问题。
修改完成后重新执行terraform init刷新模块,再执行terraform plan即可解决报错。
内容的提问来源于stack exchange,提问作者surya
相关产品推荐
相关产品推荐

