使用变量时Terraform VPC的CIDR Block无效问题排查
Problem Description
I'm trying to create an AWS VPC with the following Terraform code:
resource "aws_vpc" "vpc" { cidr_block = "{$var.network_cidr}" tags { Name = "ECS_VPC" } }
The network_cidr variable is defined in variables.tf:
variable "network_cidr" { description = "IP addressing for the network" }
And I've set its value in terraform.tfvars:
network_cidr = "10.0.0.0/16"
When I run terraform apply -var-file="terraform.tfvars", I get this error:
Error: aws_vpc.vpc: "cidr_block" must contain a valid CIDR, got error parsing: invalid CIDR address: {$var.network_cidr}
But if I hardcode cidr_block to "10.0.0.0/16" directly, it works fine. What's causing this issue?
Answer
这个问题的根源很简单——你在引用Terraform变量时用错了语法!
看你的VPC资源定义里的cidr_block值:
cidr_block = "{$var.network_cidr}"
Terraform中引用变量的正确语法是${var.variable_name}:美元符号$在前,紧接着左花括号{,而你把花括号写在了美元符号前面,变成了{$var.network_cidr}。这种错误写法会让Terraform无法识别这是一个变量引用,而是直接把字符串{$var.network_cidr}当作CIDR块来解析,这显然不是合法的CIDR格式,所以才会抛出"invalid CIDR address"的错误。
当你硬编码成"10.0.0.0/16"时,Terraform拿到的是标准的CIDR字符串,自然能正常创建VPC。
Fixes
- 使用传统变量引用语法:把变量引用改成正确的格式:
resource "aws_vpc" "vpc" { cidr_block = "${var.network_cidr}" tags { Name = "ECS_VPC" } }
- 简化语法(Terraform 0.12+):如果你使用的是Terraform 0.12及以上版本,还可以省略花括号,直接引用变量:
resource "aws_vpc" "vpc" { cidr_block = var.network_cidr tags { Name = "ECS_VPC" } }
修改完成后,重新执行terraform apply -var-file="terraform.tfvars",Terraform就能正确读取network_cidr变量的值,顺利创建VPC了。
内容的提问来源于stack exchange,提问作者Marc

