Terraform中list类型变量tfvars配置及资源引用报错解决
解决Terraform中列表变量引用的类型不匹配问题
问题场景
在variables.tf中定义了list(string)类型的subnet_cidrs和az变量,在terraform.tfvars中按列表语法配置后,在ec2.tf的aws_subnet资源中直接引用var.az和var.subnet_cidrs时出现「类型不匹配,需字符串类型」的错误;移除列表括号则触发Terraform语法错误。
相关代码
variables.tf
variable "subnet_cidrs" { type = list(string) description = "A list of Subnets CIDR's - Should consist of minimum 2" } variable "aws_region" { type = string description = "Region where all AWS Resources will be created" } variable "az" { type = list(string) description = "Availability-Zones - Should match numbers of CIDRs given and AWS Region" }
terraform.tfvars
subnet_cidrs = ["192.168.1.100", "192.168.4.100"] aws_region = "eu-central-1" az = ["eu-central-1a", "eu-central-1b"]
原ec2.tf代码(报错版本)
# Two Subnets in different AZ - Public IP on launch resource "aws_subnet" "public" { count = length(var.subnet_cidrs) cidr_block = var.subnet_cidrs availability_zone = var.az tags = { Name = "subnet-${var.name_prefix}-${count.index}" } }
报错信息
直接引用列表变量时的错误:
│ Error: Incorrect attribute value type │ │ on ..\ec2\ec2.tf line 21, in resource "aws_subnet" "public": │ 21: availability_zone = var.az │ ├──────────────── │ │ var.az is a list of dynamic │ │ Inappropriate value for attribute "availability_zone": string required.
移除列表括号后的语法错误:
Argument definitions must be separated by newlines, not commas. An argument definition must end with a newline.
错误原因
使用count = length(var.subnet_cidrs)会创建与列表长度一致的多个子网实例,每个子网的cidr_block和availability_zone属性需要单个字符串值,但直接引用var.subnet_cidrs和var.az传入的是整个列表,导致类型不匹配;而移除列表括号违反Terraform的列表语法规则,因此触发语法错误。
修复方案
通过count.index索引列表中的元素,为每个子网实例分配对应位置的字符串值。修改后的ec2.tf代码如下:
# Two Subnets in different AZ - Public IP on launch resource "aws_subnet" "public" { count = length(var.subnet_cidrs) cidr_block = var.subnet_cidrs[count.index] availability_zone = var.az[count.index] tags = { Name = "subnet-${var.name_prefix}-${count.index}" } }
关键修改点
- 将
var.subnet_cidrs改为var.subnet_cidrs[count.index],获取列表中第count.index个CIDR地址 - 将
var.az改为var.az[count.index],获取列表中第count.index个可用区名称
验证
执行以下命令验证修复效果:
terraform plan
若输出中无类型错误,且显示将创建对应数量的子网,则修复成功,可继续执行terraform apply完成资源创建。
内容的提问来源于stack exchange,提问作者Elazar
相关产品推荐
相关产品推荐

