Terraform配置CIDR报Incorrect attribute value type错误解决方法
问题原因
Terraform不同资源的CIDR相关参数对值类型要求存在差异:
aws_subnet、aws_vpc资源的cidr_block参数仅支持传入单个字符串类型的CIDR值- 安全组规则的
cidr_blocks参数要求传入字符串列表类型,支持同时配置多个CIDR规则
你之前的locals配置要么把所有CIDR全定义为单元素列表,要么全定义为单个字符串,必然无法同时满足两类参数的类型要求。普通var变量能正常运行,是因为你定义变量时已经按参数要求分别指定了对应类型,传参时做了区分。
解决方案
统一将locals中的CIDR值定义为字符串类型,在需要列表类型的参数处手动转换为单元素列表即可,这也是语义最合理、后续扩展最方便的写法。
第一步:修改locals配置
移除所有CIDR值外层的方括号,统一存为字符串:
locals { env = { marcus = { name = "marcus" vpc_cidr = "10.1.0.0/16" subnet1_cidr = "10.1.1.0/24" subnet2_cidr = "10.1.2.0/24" vpc_name = "vpc-marcus-csw" subnet1_name = "Subnet1-Marcus" subnet2_name = "Subnet2-Marcus" publisher_security_group_name = "publisher-SG-marcus" webserver_security_group_name = "webserver-SG-marcus" student_security_group_name = "student-SG-marcus" guacamole_security_group_name = "guacamole-SG-marcus" master_security_group_name = "master-SG-marcus" route_table1_name = "route-table-marcus" igw_name = "igw-marcus" } } workspace = local.env[terraform.workspace] }
第二步:按参数类型适配引用方式
- 对于要求传入单个字符串的参数,直接引用本地值即可,以
aws_subnet配置为例:
resource "aws_subnet" "subnet2" { vpc_id = aws_vpc.vpc.id cidr_block = local.workspace.subnet2_cidr map_public_ip_on_launch = var.subnet2_map_public_ip_on_launch tags = { Name = local.workspace.subnet2_name } }
- 对于要求传入字符串列表的参数,将字符串包裹为单元素列表传入,以安全组配置为例:
resource "aws_security_group" "webserver_security_group" { # 其余安全组基础配置省略 ingress { from_port = 80 to_port = 80 protocol = "tcp" cidr_blocks = [local.workspace.subnet2_cidr] } }
不推荐的替代方案
你也可以选择在locals中把CIDR统一存为单元素列表,在需要字符串的参数处通过索引取值,比如写成cidr_block = local.workspace.subnet2_cidr[0],但这种写法语义不合理,后续如果要扩展多CIDR配置改造成本更高,不建议使用。
内容的提问来源于stack exchange,提问作者Jack
相关产品推荐
相关产品推荐

